Python 生成器表达式与产量:为什么不';t';next()';工作
我知道我一定错过了一些简单的东西,但我没有看到 如果我有这样一个生成器表达式:Python 生成器表达式与产量:为什么不';t';next()';工作,python,Python,我知道我一定错过了一些简单的东西,但我没有看到 如果我有这样一个生成器表达式: >>> 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
>>> 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
s = ser()
next(s) # next is preferred over .next which is why .next has been removed in Py3
next(s)
我可以很容易地生成这样的单个整数:
>>> 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
s = ser()
next(s) # next is preferred over .next which is why .next has been removed in Py3
next(s)
如果我写一个这样的生成器:
>>> 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
s = ser()
next(s) # next is preferred over .next which is why .next has been removed in Py3
next(s)
这不是布埃诺:
>>> ser().next()
0
>>> ser().next()
0
>>> ser().next()
0
???我错过了什么
ser()
每次初始化新的生成器
要修复它,请执行以下操作:
>>> 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
s = ser()
next(s) # next is preferred over .next which is why .next has been removed in Py3
next(s)
ser()
创建生成器。因此,每次调用ser()
时,它都会向您发送一个新的生成器实例。您需要像表达式一样使用它:
serializer = ser()
serializer.next()
考虑一下,如果它不是这样工作的,您只能使用ser()
函数一次,而且您永远无法重置它。另外,您可以更改ser函数以接受最大整数,并使程序更加灵活
def ser(n=sys.maxint):
for sn in xrange(0, n):
yield sn
在第二个示例中,您一直在创建一个新实例,从一个新的生成器开始
g = ser()
g.next()
g.next()
创建一次生成器并重用它 没问题。这显然是不明显的,因为其他主要类型的函数(装饰器)中有一个显式的
返回包装器
,我猜这是由yield
语句隐式/神奇地创建的:P