Generator expression and output: why does "next ()" not work?

I know that I need to skip something simple, but I don’t see it.

If I have a generator expression like this:

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

I can easily generate single integers:

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

If I write a generator as follows:

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

This is not bueno:

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

??? What am I missing ???

+5
source share
3 answers

ser()creates a generator. Therefore, every time you call ser(), it sends you a new instance of the generator. You need to use it just like an expression:

serializer = ser()
serializer.next()

, , ser() , reset . , ser, , .

def ser(n=sys.maxint):
    for sn in xrange(0, n):
        yield sn
+19

, .

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

.

+5
ser()

each time the new generator initializes .

To fix this, do the following:

s = ser()
next(s) # next is preferred over .next which is why .next has been removed in Py3
next(s)
+4
source

All Articles