次のコードセグメントを理解できません。
>>> lot = ((1, 2), (3, 4), (5,))
>>> reduce(lambda t1, t2: t1 + t2, lot)
(1, 2, 3, 4, 5)
reduce関数はどのようにして(1,2,3,4,5)のタプルを生成しますか?
次のコードセグメントを理解できません。
>>> lot = ((1, 2), (3, 4), (5,))
>>> reduce(lambda t1, t2: t1 + t2, lot)
(1, 2, 3, 4, 5)
reduce関数はどのようにして(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)
reduce()
関数を順番に適用し、シーケンスの要素を連鎖させます。
reduce(f, [a,b,c,d], s)
と同じです
f(f(f(f(s, a), b), c), d)
等々。あなたの場合、これf()
はラムダ関数(lambda t1, t2: t1 + t2
)であり、2つの引数を合計するだけなので、次のようになります。
(((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(...)reduce(function、sequence [、initial])-> value
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、)
リダクションがタプルを連結していることに注意してください。
reduceは、引数として関数とイテレータを取ります。関数は2つの引数を受け入れる必要があります。
削減することは、反復可能を反復処理することです。まず、最初の2つの値を関数に送信します。次に、その結果を次の値と一緒に送信します。
したがって、あなたの場合、タプルの最初と2番目の項目(1,2)と(3,4)を受け取り、それらをラムダ関数に送信します。その関数はそれらを一緒に追加します。結果は、3番目のアイテムと一緒にラムダ関数に再度送信されます。タプルにはこれ以上アイテムがないため、結果が返されます。