yield如何确定其迭代完成一次。

时间:2017-06-06 07:34:01

标签: python python-2.7

我已经阅读了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程序标识如何执行一次?

4 个答案:

答案 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