python內建函式——reduce()函式
阿新 • • 發佈:2018-12-17
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
為空。(個人理解)