-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 に答える