def merge2(iter1,iter2):
""" on input iter1, iter2, two non-empty sorted iterators, not
necessarily infinite, produces the sorted merge of the two iterators """
left=next(iter1)
right=next(iter2)
while True:
if left<right:
yield(left)
try:
left=next(iter1)
except StopIteration: # iter1 is exhausted
yield(right) # in my question I refer to this yield
for right in iter2:
yield(right)
break
else:
yield(right)
try:
right=next(iter2)
except StopIteration: # iter2 is exhausted
yield(left)
for left in iter1:
yield(left)
break
使用yield(right)
(我在上面指出)后,程序没有提供值,所以我现在“out”了merge2函数,那么for
(即紧接着下方)?
答案 0 :(得分:4)
yield
将控件返回给调用者作用域(函数或方法),就像返回一样 - 但不是使用局部变量及其值来销毁当前作用域,而是保留它。
当再次调用迭代器的“next”方法时(for
语句隐式执行),将检索执行yield的范围,并从该点继续执行,具有相同的变量到位。
实际上,yield表现为一个表达式,如果不是调用next
方法,而是外部函数调用send
,则传递给send
的值是由yield
表达。
(有关代码对象,本地和全局变量,正在运行的行的信息保存在“堆栈帧”对象中,而在Python中,它甚至可以作为任何其他对象进行处理并进行内省)