问题 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(),