1. 程式人生 > >python內建函式——reduce()函式

python內建函式——reduce()函式

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為空。(個人理解)