如何制作这样的可迭代对象?

时间:2012-09-04 11:03:42

标签: python list

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

2 个答案:

答案 0 :(得分: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() function就是这样做的:

import itertools
list(itertools.islice(updown(6), 20))

答案 1 :(得分: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(),