2014-02-15 39 views
-2
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(即紧接下面)到达?关于产量

+0

'yield'与'return'不一样。发生器暂停,当控制返回时(调用'generator.next()'),控制恢复。 –

+0

你怎么使用这个发生器功能? – M4rtini

+0

用'python'标签查看答案最高的答案。 –

回答

4

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

当迭代器的“下一个”方法再次被调用时(其中for语句会隐式执行),将检索执行良率的范围,并从该点继续执行,并使用相同的变量。

事实上,产量表现为一个表达式,并且如果不是调用next方法,外部函数调用send代替,传递给send的值是由yield表达式返回的值。

(这大约代码对象,局部和全局变量,其线被运行保持在“堆栈帧”对象的信息,和在Python它可以甚至寻址为任何其他对象和自省)

+0

@ jsbueno我可以放弃:'在权利iter2:收益(右)休息'?因为“产量”已经提供了所需的价值 – user7777777