对产量的基本认识

2024-09-25 08:25:19 发布

您现在位置:Python中文网/ 问答频道 /正文

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(即下面的内容)是如何实现的?在


Tags: theinrightforleftnextsortedyield
1条回答
网友
1楼 · 发布于 2024-09-25 08:25:19

yield将控件返回到调用方作用域(函数或方法),正如返回的那样-但是保留了当前作用域(包含局部变量及其值)而不是破坏当前作用域。在

当再次调用迭代器的“next”方法时(这是for语句隐式执行的),将检索执行yield的作用域,并从该点继续执行,同时使用相同的变量。在

实际上,yield的行为类似于一个表达式,如果外部函数不是调用next方法,而是调用send,传递给send的值就是yield表达式返回的值。在

(关于代码对象、本地和全局变量的信息,哪一行正在运行,都保存在“堆栈框架”对象中,在Python中,它甚至可以作为任何其他对象来处理并进行内省)

相关问题 更多 >