-1

问题 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

4

2 回答 2

3

您可以制作一个向上和向下计数的无限生成器:

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))
于 2012-09-04T11:13:26.120 回答
1

另一种方法是使用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(),
于 2012-09-04T11:46:54.037 回答