为什么 next() 总是显示相同的值?
Why does next() always display the same value?
我在练习yield
语句。我在 Python 2.7 中编写了以下函数:
>>> def mygen():
... i = 0
... j = 3
... for k in range(i, j):
... yield k
...
>>> mygen().next()
0
>>> mygen().next()
0
>>> mygen().next()
0
每当我调用 mygen().next()
时,它总是将输出显示为 0
,而不是 0
、1
、2
和 StopIteration
.有人可以解释一下吗?
你每次都在重新创建生成器,所以它每次都从头开始。
创建生成器一次:
gen = mygen()
gen.next()
gen.next()
gen.next()
每次调用生成器函数都会生成一个新的迭代器;这样你就可以制作多个独立的副本。每个独立的迭代器都是函数的调用,可以与其他迭代器分开单步执行:
>>> def mygen():
... i = 0
... j = 3
... for k in range(i, j):
... yield k
...
>>> gen1 = mygen()
>>> gen2 = mygen()
>>> gen1.next()
0
>>> gen1.next()
1
>>> gen2.next()
0
>>> gen2.next()
1
>>> gen1.next()
2
>>> gen1.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
请注意,您可能希望使用 next()
function 而不是直接调用 generator.next()
:
next(gen)
generator.next()
被认为是一个钩子(Python 3 将其重命名为 generator.__next__()
并且 next()
函数是官方 API 在跨版本兼容方式。
包含 yield 语句的函数定义 returns 生成器。您必须将下一个函数应用于该生成器而不是函数本身。澄清一下,您的函数定义等同于:
def mygen():
i, j = 0, 3
return (k for k in range(i, j))
或:
mygen = lambda :(k for k in range(0, 3))
所以你会像这样使用它:
gen1 = mygen()
gen2 = mygen()
next(gen1) // returns 0
next(gen1) // returns 1
list(gen1) // returns [2]
list(gen2) // returns [0, 1, 2]
我在练习yield
语句。我在 Python 2.7 中编写了以下函数:
>>> def mygen():
... i = 0
... j = 3
... for k in range(i, j):
... yield k
...
>>> mygen().next()
0
>>> mygen().next()
0
>>> mygen().next()
0
每当我调用 mygen().next()
时,它总是将输出显示为 0
,而不是 0
、1
、2
和 StopIteration
.有人可以解释一下吗?
你每次都在重新创建生成器,所以它每次都从头开始。
创建生成器一次:
gen = mygen()
gen.next()
gen.next()
gen.next()
每次调用生成器函数都会生成一个新的迭代器;这样你就可以制作多个独立的副本。每个独立的迭代器都是函数的调用,可以与其他迭代器分开单步执行:
>>> def mygen():
... i = 0
... j = 3
... for k in range(i, j):
... yield k
...
>>> gen1 = mygen()
>>> gen2 = mygen()
>>> gen1.next()
0
>>> gen1.next()
1
>>> gen2.next()
0
>>> gen2.next()
1
>>> gen1.next()
2
>>> gen1.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
请注意,您可能希望使用 next()
function 而不是直接调用 generator.next()
:
next(gen)
generator.next()
被认为是一个钩子(Python 3 将其重命名为 generator.__next__()
并且 next()
函数是官方 API 在跨版本兼容方式。
包含 yield 语句的函数定义 returns 生成器。您必须将下一个函数应用于该生成器而不是函数本身。澄清一下,您的函数定义等同于:
def mygen():
i, j = 0, 3
return (k for k in range(i, j))
或:
mygen = lambda :(k for k in range(0, 3))
所以你会像这样使用它:
gen1 = mygen()
gen2 = mygen()
next(gen1) // returns 0
next(gen1) // returns 1
list(gen1) // returns [2]
list(gen2) // returns [0, 1, 2]