我已经阅读了python中What does the "yield" keyword do in Python?关键字的yield,但我有一个问题,即系统标识如何产生迭代一次。
def test_yield():
name = 'Hello World!'
for i in name:
yield i
y= test_yield()
print "first yield",y
for c in y:
print c
print "second yield",y
for c in y:
print c
first yield <generator object test_yield at 0x7f4c2bc10be0>
H
e
l
l
o
W
o
r
l
d
!
second yield <generator object test_yield at 0x7f4c2bc10be0>
在输出第二次产生对象打印但不是iterate.so程序标识如何执行一次?
答案 0 :(得分:2)
循环通过迭代器&#34;使用它&#34;。所以你的first yield
循环遍历它并到达终点。就像你打开一个文件并读取所有行直到EOF。在此之后,无论您拨打read()
多少次,您都无法获得更多数据,只有EOF。同样,一旦你的迭代器到达了它的最后一个元素,在它上面调用.next
只会引发StopIteration
。
答案 1 :(得分:2)
当生成器函数调用yield时,生成器函数的“状态”被冻结;保存所有变量的值,并记录下一行要执行的代码,直到再次调用next()。一旦它,生成器功能只是从它停止的地方恢复。如果从不再次调用next(),则会(最终)丢弃在yield调用期间记录的状态。
鉴于当生成器函数到达它结束时,会引发 StopIteration 异常,使其耗尽,因此您必须重新加载它,这就是它在第二个期间没有迭代任何值的原因呼叫。
注意:通过隐式调用next()来获取值
答案 2 :(得分:1)
for
第一次调用从函数创建的生成器对象时,它将从头开始运行函数中的代码,直到它到达yield
,然后它将返回第一个值循环。然后,每个其他调用将再次运行您在函数中写入的循环,并返回下一个值,直到没有值返回。在你的第二个for循环中,没有更多值可以检索,因为你已经浪费了它们。
为了更深入地了解幕后发生的事情,for循环可以重写为:
iterator = some_func()
try:
while 1:
print iterator.next()
except StopIteration:
pass
答案 3 :(得分:1)
你写的时候
y = test_yield()
初始化迭代器,并在第一次完成迭代后
for c in y:
迭代器结束了。您需要再次初始化,如:
def test_yield():
name = 'Hello World!'
for i in name:
yield i
y= test_yield()
print "first yield",y
for c in y:
print c
# once again
y= test_yield()
print "second yield",y
for c in y:
print c