原文: https://thepythonguru.com/python-builtin-functions/reduce/


    于 2020 年 1 月 7 日更新


    reduce()函数接受一个函数和一个序列并返回如下计算的单个值:

    1. 最初,使用序列中的前两项调用该函数,然后返回结果。
    2. 然后使用在步骤 1 中获得的结果和序列中的下一个值再次调用该函数。 这个过程一直重复,直到序列中有项目为止。

    reduce()函数的语法如下:

    语法reduce(function, sequence[, initial]) -> value

    提供initial值时,将使用initial值和序列中的第一项调用该函数。

    在 Python 2 中,reduce()是一个内置函数。 但是,在 Python 3 中,它已移至functools模块。 因此,要使用它,必须先按以下步骤导入它:

    1. from functools import reduce # only in Python 3

    这是添加列表中所有项目的示例。

    1. >>>
    2. >>> from functools import reduce
    3. >>>
    4. >>> def do_sum(x1, x2): return x1 + x2
    5. ...
    6. >>>
    7. >>> reduce(do_sum, [1, 2, 3, 4])
    8. 10
    9. >>>

    试试看:

    1. from functools import reduce
    2. def do_sum(x1, x2):
    3. return x1 + x2
    4. print(reduce(do_sum, [1, 2, 3, 4]))

    reduce()调用执行以下操作:

    1. (((1 + 2) + 3) + 4) => 10

    前面的reduce()调用在功能上等同于以下内容:

    1. >>>
    2. >>> def my_reduce(func, seq):
    3. ... first = seq[0]
    4. ... for i in seq[1:]:
    5. ... first = func(first, i)
    6. ... return first
    7. ...
    8. >>>
    9. >>> my_reduce(do_sum, [1, 2, 3, 4])
    10. 10
    11. >>>

    试一试:

    1. def do_sum(x1, x2):
    2. return x1 + x2
    3. def my_reduce(func, seq):
    4. first = seq[0]
    5. for i in seq[1:]:
    6. first = func(first, i)
    7. return first
    8. print(my_reduce(do_sum, [1, 2, 3, 4]))

    但是,reduce()调用比for循环更简洁,并且性能明显更好。