Python之functools模块之reduce、partial
reduce
- functools.reduce(function, iterable[, initial])
- 就是减少的意思
- 初始值没有提供就在可迭代对象中取一个
partial
- 偏函数
- 把函数部分参数固定下来,相当于为部分的参数添加了固定的默认值,形成一个新的函数,并返回这个新函数
- 这个新函数是对原函数的封装
from functools import reduce, partial
reduce(lambda x,y: print(x, y), range(3))
def fn(x, y):
print(x, y)
return x + y
reduce(fn, range(6))
sum(range(5)), reduce(lambda x,y: x+y, range(5))
解释说明:
- 在Python中,sum()和reduce()都是内置函数,用于对可迭代对象进行求和操作。
- sum(iterable):这个函数会返回所有元素的总和。如果提供了start参数,那么它会把iterable的所有元素加起来,再加上start。如果没有提供start参数,那么它只会把所有元素加起来。例如,sum([1, 2, 3, 4])会返回10。
- reduce(function, iterable[, initializer]):这个函数会对iterable的每个元素应用function,然后返回一个单一的结果。如果提供了initializer,那么它会作为第一次调用function时的第一个参数。如果没有提供initializer,那么iterable的第一个元素会作为第一次调用function时的第一个参数,iterable的第二个元素会作为第二次调用function时的第一个参数,以此类推。例如,reduce(lambda x, y: x+y, [1, 2, 3, 4])会返回10。
- 在你给出的代码中,sum(range(5))和reduce(lambda x,y: x+y, range(5))都是在计算0到4(包括0,不包括5)的所有整数的和。
注意事项
- sum()函数只适用于数字类型的数据,如果传入的是非数字类型的数据,会抛出TypeError异常。
- reduce()函数需要从functools模块中导入,否则会抛出NameError异常。
- reduce()函数在Python 3中被移到了functools模块中,如果你使用的是Python 2,可以直接使用。
reduce(lambda x,y: x * y, range(1, 6))
解释说明
- reduce() 是 Python 中的一个高阶函数,它接收一个二元操作函数(接受两个参数的函数)和一个可迭代对象(如列表、元组等),然后将这个二元操作函数作用于可迭代对象的元素,从左到右依次进行计算,并将结果累积起来。在这个问题中,reduce() 函数使用了一个 lambda 函数作为二元操作函数,该函数接受两个参数 x 和 y,并返回它们的乘积。range(1, 6) 生成一个包含 1 到 5 的整数序列。因此,reduce(lambda x,y: x * y, range(1, 6)) 的作用是将 1 到 5 的整数依次相乘,得到最终的结果。
注意事项
- reduce() 函数需要从 functools 模块中导入。 reduce() 函数在 Python 3 中被移到了 functools 模块中,因此在使用时需要先导入该模块。 如果可迭代对象为空,reduce() 函数会抛出 TypeError 异常。可以通过提供一个可选的初始值参数来避免这种情况,例如 reduce(lambda x, y: x * y, range(1, 6), 1)。
def add(x, y=5):
return x + y
partial(add, 4)
newadd = partial(add, 4)
newadd
newadd
newadd(), add(4)
def add(x, y, *args):
return x + y + sum(args)
newadd = partial(add, 1, 2, 3, 4, 5)
newadd()