我正在阅读python中的yield
关键字,并试图理解如何运行此示例:
def countfrom(n):
while True:
print "before yield"
yield n
n += 1
print "after yield"
for i in countfrom(10):
print "enter for loop"
if i <= 20:
print i
else:
break
输出为:
before yield
enter for loop
10
after yield
before yield
enter for loop
11
after yield
before yield
enter for loop
12
after yield
before yield
enter for loop
13
after yield
before yield
enter for loop
14
after yield
before yield
enter for loop
15
after yield
before yield
enter for loop
16
after yield
before yield
enter for loop
17
after yield
before yield
enter for loop
18
after yield
before yield
enter for loop
19
after yield
before yield
enter for loop
20
after yield
before yield
enter for loop
看起来yield将返回指定的值,并将继续运行函数直到结束(可能在并行线程中)。我的理解正确吗?
如果你能不提“发电机”来回答这个问题,我会很感激,因为我一次只能理解一个发电机。
不,只有一根线。
for循环的每次迭代都运行
countFrom
函数,直到它产生某些结果或返回。在yield之后,for循环的主体再次运行,然后,当一个新的迭代开始时,countFrom
函数将准确地拾取它停止的位置并再次运行,直到它产生(或返回)。此示例的修改版本将有助于更清楚地了解执行路径的方式。
输出
…如果不提到生成器,就无法解释
yield
语句的含义;这就像试图解释什么是石头而不提到石头一样。也就是说:yield语句负责将正常函数转换为生成器。当你发现它在这里有很好的记录:http://docs.python.org/reference/simple_stmts.html#the-yield-statement
……它的简要解释是:
.next()
方法(iterable对象的标准).next()
方法(例如,使用for循环迭代对象)时,都会调用函数,直到遇到第一个yield。然后暂停函数执行,并传递一个值作为.next()
方法的返回值。.next()
时,函数将继续执行,直到下一次yield
等,直到函数返回某些内容。这样做的一些好处是:
你可以把它想象成当遇到
yield
时,yield
的函数只是“暂停”。下次调用它时,它将在yield
保持离开时的状态后恢复。相关问题 更多 >
编程相关推荐