7

何か単純なものが欠けているに違いないことはわかっていますが、それが見えません。

次のようなジェネレータ式があるとします。

>>> serializer=(sn for sn in xrange(0,sys.maxint))

次のような個々の整数を簡単に生成できます。

>>> serializer.next()
0
>>> serializer.next()
1
>>> serializer.next()
2

次のようなジェネレーターを作成した場合:

>>> def ser():
...    for sn in xrange(0,100000):
...       yield sn

のブエノです:

>>> ser().next()
0
>>> ser().next()
0
>>> ser().next()
0

??? 何が欠けていますか???

4

3 に答える 3

21

ser()ジェネレーターを作成します。したがって、呼び出すたびser()に、新しいジェネレーター インスタンスが送信されます。次の式のように使用する必要があります。

serializer = ser()
serializer.next()

このように機能しないser()場合は、関数を一度しか使用できず、決してリセットできないことを考慮してください。さらに、ser 関数を変更して最大整数を受け入れるようにし、プログラムをより柔軟にすることができます。

def ser(n=sys.maxint):
    for sn in xrange(0, n):
        yield sn
于 2012-06-09T05:58:14.130 に答える
5

2 番目の例では、新しいジェネレーターから始めて、新しいインスタンスを作成し続けます。

g = ser()
g.next()
g.next()

ジェネレーターを一度作成し、それを再利用します。

于 2012-06-09T05:58:33.757 に答える
4
ser()

毎回新しいジェネレーターを初期化します。

それを修正するには、次のようにします。

s = ser()
next(s) # next is preferred over .next which is why .next has been removed in Py3
next(s)
于 2012-06-09T05:57:52.990 に答える