6. 函数式编程模块functools
functools 模块应用于高阶函数。
函数
说明
functools.reduce(function, iterable, [initial, ])
将两个参数的 function 从左至右累积地应用到 iterable 的条目,以便将该可迭代对象缩减为单个值。(规约)
functools.partial(func, args, *keywords)
返回一个新的 部分对象,此对象可以固定部分参数,调用部分对象才开始计算。
functools.reduce函数
作用:
将两个参数的 function 从左至右累积地应用到 iterable 的条目,以便将该可迭代对象缩减为单个值(规约)。
调用格式:
functools.reduce(function, iterable, [initial, ])
参数
- function:含有两个参数的函数。
- iterable:可跌代对象。
- initial:初始累积值(可选)。
reduce函数-示意
规约函数: lambda a, b: a + b
functools.reduce函数示例
from functools import reduce
data = [1, 2, 3, 4]
def add(x, y):
return x + y
values = reduce(add, data)
print(values)
functools.partial函数
作用:
返回一个新的 部分对象,此对象可以固定部分参数,在调用部分对象时可以补齐参数再开始计算。
调用格式:
functools.partial(func, *args, **keywords)
参数
- func:实际调用函数
-
*args
,**keywords
:其他可变参数
functools.partial函数示例
from functools import partial
# 创建线性函数 f(x) = ax + b
def linear(a, b, x):
return a * x + b
# 固定a和b创建特定函数
line1 = partial(linear, 2, 1) # f(x) = 2x + 1
print(line1(x=3)) # 输出 7
练习
求100以内所有素数的乘积数,即求:2 * 3 * 5 * 7 * ... * 97 = ?
参考答案
from functools import reduce
def is_prime(x):
if x <= 1:
return False
for i in range(2, x):
if x % i == 0:
return False
return True
print(reduce( lambda a, b: a*b, filter(is_prime, range(100))))