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
ここでどのように機能するかを誰かが説明できますか?