我無法理解下面的代碼段:的Python解釋降低
>>> lot = ((1, 2), (3, 4), (5,))
>>> reduce(lambda t1, t2: t1 + t2, lot)
(1, 2, 3, 4, 5)
如何精簡函數產生的(1,2,3,4,5)的元組?
我無法理解下面的代碼段:的Python解釋降低
>>> lot = ((1, 2), (3, 4), (5,))
>>> reduce(lambda t1, t2: t1 + t2, lot)
(1, 2, 3, 4, 5)
如何精簡函數產生的(1,2,3,4,5)的元組?
,如果你打出來的lambda
成一個函數它更容易,所以它更清楚這是怎麼回事:
>>> def do_and_print(t1, t2):
print 't1 is', t1
print 't2 is', t2
return t1+t2
>>> reduce(do_and_print, ((1,2), (3,4), (5,)))
t1 is (1, 2)
t2 is (3, 4)
t1 is (1, 2, 3, 4)
t2 is (5,)
(1, 2, 3, 4, 5)
減少(...) 減少(函數,序列[,初始]) - >值
Apply a function of two arguments cumulatively to the items of a sequence, from left to right, so as to reduce the sequence to a single value. For example, reduce(lambda x, y: x+y, ((1, 2), (3, 4), (5))) calculates (((1+2)+(3+4))+5). If initial is present, it is placed before the items of the sequence in the calculation, and serves as a default when the sequence is empty.
讓我們跟蹤減少
結果=(1, 2)+(3,4)
結果=結果+(5,)
請注意,您的減少連接元組。
減少需要的功能和迭代器作爲參數。該函數必須接受兩個參數。
減少的是它遍歷迭代器。首先它將前兩個值發送給函數。然後它將結果與下一個值一起發送,依此類推。
所以在你的情況下,它將元組1,2和3,4中的第一個和第二個項目發送到lambda函數。該功能將它們加在一起。結果與第三項一起再次發送到lambda函數。由於元組中沒有更多項目,所以返回結果。
reduce()
施加順序的函數,鏈接序列中的元素:
reduce(f, [a,b,c,d], s)
相同
f(f(f(f(s, a), b), c), d)
等。在你的情況f()
是一個lambda函數(lambda t1, t2: t1 + t2
)剛剛增加了兩個參數,所以你最終
(((s + a) + b) + c) + d
而且由於添加序列圓括號沒有什麼差別,這是
s + a + b + c + d
或與您的實際值
(1, 2) + (3, 4) + (5,)
如果s
沒有給出,第一項只是沒有這樣做,但通常ŧ他中性元素用於s
,所以你的情況()
本來是正確的:
reduce(lambda t1, t2: t1 + t2, lot,())
但是,如果沒有它,你只遇到麻煩,如果lot
沒有任何元素(TypeError: reduce() of empty sequence with no initial value
)。
重點是元組上的'+'是串聯(不是算術加法)! –
你知道'reduce()'函數提供的抽象概括嗎?我不相信這是非常有洞察力的,試圖瞭解減少的每一個特定用法 – phant0m
@ phant0m我明白reduce()函數提供了什麼。但在這個特殊的例子中,我被'+'弄糊塗了,我認爲這是算術加法。 – Sibi