6. 函数式编程模块functools

functools 模块应用于高阶函数。

函数
说明
functools.reduce(function, iterable, [initial, ])
将两个参数的 function 从左至右累积地应用到 iterable 的条目,以便将该可迭代对象缩减为单个值。(规约)
functools.partial(func, args, *keywords)
返回一个新的 部分对象,此对象可以固定部分参数,调用部分对象才开始计算。

functools.reduce函数

作用:

将两个参数的 function 从左至右累积地应用到 iterable 的条目,以便将该可迭代对象缩减为单个值(规约)。

调用格式:

functools.reduce(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)

参数

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))))