4

itertoolsドキュメントのレシピセクションに のような便利なコードがあることに気付きconsumeましたが、問題が見つかりました。

from itertools import islice
numbers = iter(range(10))
for i in numbers:
    print i 
    next(islice(numbers, 3, 3), None)

上記のコードは正常に動作し、出力[0,4,8]されます。next(islice(numbers, 3, 3), None)トリックはconsumeレシピから取得されます。

isliceここが重要な役割を果たしていることがわかります。しかし、itertools.isliceその関数の Python ドキュメントで提供されているコードに置き換えると、コードが期待どおりに機能しません。

#from itertools import islice

def islice(iterable, *args):
    # islice('ABCDEFG', 2) --> A B
    # islice('ABCDEFG', 2, 4) --> C D
    # islice('ABCDEFG', 2, None) --> C D E F G
    # islice('ABCDEFG', 0, None, 2) --> A C E G
    s = slice(*args)
    it = iter(xrange(s.start or 0, s.stop or 200, s.step or 1))
    nexti = next(it)
    for i, element in enumerate(iterable):
        if i == nexti:
            yield element
            nexti = next(it)


numbers = iter(range(10))
for i in numbers:
    print i 
    next(islice(numbers, 3, 3), None)

出力は上記の出力とは異なります。範囲内のすべての数値が出力され、islice()消費行は何もしていないように見えます。

これがなぜであり、isliceここでどのように機能するかを誰かが説明できますか?

4

1 に答える 1