reduce()
函数接收三个参数:函数、序列、初始值。reduce()
函数的执行方式是:将一个接收两个参数的函数从左到右累积作用于序列的元素,直到序列中只剩一个元素。初始值默认为None
,如果存在则将其放在序列中元素计算之前,并且在序列为空值作为默认值。举例:
from functools import reduce
reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])
首先计算1 + 2
得到结果3
,将结果和下一个元素作为参数传给函数,即计算3 + 3
,依次类推直到最后。
计算列表[1, 2, 3, 4]
中各元素的平方和:
a = [1, 2, 3, 4]
b = reduce(lambda x, y: x * x + y * y, a)
print(b) # 1172
得到错误结果是因为对reduce()
函数的执行顺序不了解,上面的代码相当于计算1^2+2^2=5
,再计算5^2+3^2=34
,然后是34^2+4^2=1172
。要实现要求可以使用如下代码:
c = reduce(lambda x, y: x + y, [i * i for i in a])
print(c) # 30
即先对每个元素进行平方操作在累积求和。
初始值的使用:
d = reduce(lambda x, y: x + y, a, 5)
print(d) # 15,初始值加入到计算中,如果设为str类型会报错:TypeError: must be str, not int
d = reduce(lambda x, y: x + y, [], 'abc')
print(d) # 序列为空,返回初始值:'abc'
和filter()
函数类似,reduce()
函数也可以操作其他数据类型:
res = reduce(lambda x, y: x + ' ' + y, ['Hello', 'tomorrow'])
print(res) # Hello tomorrow
下面是在菜鸟教程里reduce()
函数下有人分享的一篇笔记,统计字符串里面某字符出现的次数,首先需要将字符串放在列表中:
sentences = [
'The Deep Learning textbook is a resource intended to help students and practitioners enter the field of machine learning in general and deep learning in particular. ']
word_count = reduce(lambda a, x: a + x.count('learning'), sentences, 0)
print(word_count) # 2
在这个例子中,a
为初始值0,x
为整个句子。如果不设置初始值,则a
表示整个句子,x
为空,得到的结果是整个句子。(个人理解)