質問1
このような反復可能なオブジェクトを作成する方法:
0 1 2 3 4 5 4 3 2 1 0 1 2 3 4 5 4 3 2 1 0 1 2 3 4 5 4 3 2 1 ....
質問2
上記のオブジェクトで list(obj) を使用すると、マシンのメモリが消費されますか? それを防ぐ方法は?
python2 は使用しないでください
カウントアップおよびカウントダウンする無限ジェネレーターを作成できます。
def updown(n):
while True:
for i in range(n):
yield i
for i in range(n - 2, 0, -1):
yield i
uptofive = updown(6)
for i in range(20):
print uptofive.next(),
出力します:
0 1 2 3 4 5 4 3 2 1 0 1 2 3 4 5 4 3 2 1
list(updown(6))
すべてのメモリを消費しようとするのを防ぐことはできません。医者が言うように:「それならそれをしないでください!」.
代わり.next()
に呼び出しを使用するか、ジェネレーターを反復する回数を制限する別のステートメントでジェネレーターを使用します。itertools.islice()
関数はまさにそれを行います:
import itertools
list(itertools.islice(updown(6), 20))
別の方法は、次を使用することitertools.cycle()
です。
from itertools import cycle
def oscillator(start, stop):
# assumes stop >= start
return cycle(range(start, stop+1) + range(stop-1, start, -1))
o = oscillator(0, 5)
for i in range(30):
print o.next(),