6

次のコードセグメントを理解できません。

>>> lot = ((1, 2), (3, 4), (5,))
>>> reduce(lambda t1, t2: t1 + t2, lot)
(1, 2, 3, 4, 5)

reduce関数はどのようにして(1,2,3,4,5)のタプルを生成しますか?

4

5 に答える 5

14

を関数に分割すると簡単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)
于 2012-11-28T11:01:22.863 に答える
4

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)。

于 2012-11-28T12:47:11.797 に答える
1

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.
于 2012-11-28T10:58:33.240 に答える
1

削減をトレースしましょう

結果=(1,2)+(3,4)

結果=結果+(5、)

リダクションがタプルを連結していることに注意してください。

于 2012-11-28T10:59:12.207 に答える
0

reduceは、引数として関数とイテレータを取ります。関数は2つの引数を受け入れる必要があります。

削減することは、反復可能を反復処理することです。まず、最初の2つの値を関数に送信します。次に、その結​​果を次の値と一緒に送信します。

したがって、あなたの場合、タプルの最初と2番目の項目(1,2)と(3,4)を受け取り、それらをラムダ関数に送信します。その関数はそれらを一緒に追加します。結果は、3番目のアイテムと一緒にラムダ関数に再度送信されます。タプルにはこれ以上アイテムがないため、結果が返されます。

于 2012-11-28T11:07:34.500 に答える