8

itertoolsPythonのジェネレーターをよりよく理解するために、モジュールに機能を実装しようとしていますが、次の問題が発生しizipます。

def izip(*iterables):
    its = tuple(iter(it) for it in iterables)
    while True:
        yield tuple(next(it) for it in its)  # ERROR
        # yield tuple(map(next, its))  # OK

私のコードはERROR行を使用しており、リファレンス実装(マニュアルに記載されています)は、他の小さな違いを考慮せずにOK行を使用しています。このスニペットで:

for x in izip([1, 2, 3], (4, 5)):
    print x

私のコード出力:

(1, 4)
(2, 5)
(3,)
()
()
...  # indefinite ()

、期待される出力は次のとおりです。

(1, 4)
(2, 5)

私のコードの何が問題になっていますか?

4

1 に答える 1

12

実装が機能しない理由StopIterationは、反復可能オブジェクトの1つが使い果たされたために発生した例外が、ジェネレーター式内でスローされるためです。ジェネレータ式を終了するだけで、囲んでいるジェネレータ関数は終了しません。

于 2012-04-11T14:54:10.250 に答える