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)
(我在上面已经指出了),难道程序没有提供这个值,所以我现在“退出”了merge2函数,那么for
(即下面的内容)是如何实现的?在
yield
将控件返回到调用方作用域(函数或方法),正如返回的那样-但是保留了当前作用域(包含局部变量及其值)而不是破坏当前作用域。在当再次调用迭代器的“next”方法时(这是
for
语句隐式执行的),将检索执行yield的作用域,并从该点继续执行,同时使用相同的变量。在实际上,yield的行为类似于一个表达式,如果外部函数不是调用
next
方法,而是调用send
,传递给send
的值就是yield
表达式返回的值。在(关于代码对象、本地和全局变量的信息,哪一行正在运行,都保存在“堆栈框架”对象中,在Python中,它甚至可以作为任何其他对象来处理并进行内省)
相关问题 更多 >
编程相关推荐