对收益率的基本了解

时间:2014-02-15 12:00:09

标签: python python-3.x

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(即紧接着下方)?

1 个答案:

答案 0 :(得分:4)

yield将控件返回给调用者作用域(函数或方法),就像返回一样 - 但不是使用局部变量及其值来销毁当前作用域,而是保留它。

当再次调用迭代器的“next”方法时(for语句隐式执行),将检索执行yield的范围,并从该点继续执行,具有相同的变量到位。

实际上,yield表现为一个表达式,如果不是调用next方法,而是外部函数调用send,则传递给send的值是由yield表达。

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