【问题标题】:Does python yield imply continue?python yield 是否暗示继续?
【发布时间】:2011-03-17 15:11:41
【问题描述】:

我有一个检查一系列条件的 for 循环。在每次迭代中,它应该只产生一个条件的输出。最终产量是默认值,以防没有任何条件为真。我是否必须在每个收益块之后放置一个继续

def function():
    for ii in aa:
       if condition1(ii):
           yield something1
           yield something2
           yield something3
           continue

       if condition2(ii):
           yield something4
           continue

       #default
       yield something5
       continue

【问题讨论】:

    标签: python generator yield


    【解决方案1】:

    这种方式比较清晰,希望对你有帮助,也感谢Anurag Uniyal。

    def f():
        for i in range(3):
            yield i
            print(i+10)
    
    list(f())
    

    -----------运行后------------

    10
    11
    12
    [0, 1, 2]
    

    【讨论】:

    • 很好,但我认为对于列表输出还需要打印:print(list(f()))
    【解决方案2】:

    yield 在 Python 中停止执行并返回值。当再次调用迭代器时,它会在yield 语句之后直接继续执行。例如,一个生成器定义为:

    def function():
        yield 1
        yield 2
    

    将依次返回1 然后2。换句话说,continue 是必需的。但是,在这种情况下,elifelse 如 flashk 所述绝对是正确的工具。

    【讨论】:

      【解决方案3】:

      如果某事是简单的值并且条件是检查是否相等,我更愿意进行这种“案例结构”字典查找:

      ii_dict={'a':('somethinga1','somethinga2','somethinga3'),'b':('somethingb1',)}
      ii_default = ('somethingdefault',)
      aa='abeabbacd'
      
      def function():
          return (value
                 for ii in aa
                 for value in (ii_dict[ii] if ii in ii_dict else ii_default))
      
      for something in function(): print something
      

      【讨论】:

        【解决方案4】:

        continue 会跳过剩余的代码块,但是在生成器上再次调用next() 时会执行yield 之后的代码块。 yield 就像在某个点暂停执行。

        【讨论】:

          【解决方案5】:

          不,yield 并不意味着继续,它只是从下一行开始,下一次。一个简单的例子说明了

          def f():
              for i in range(3):
                  yield i
                  print i,
          
          list(f())
          

          这会打印 0,1,2 但如果 yield 继续,则不会

          【讨论】:

            【解决方案6】:

            我建议不要使用continue 语句,而是使用elifelse 语句:

            def function():
                for ii in aa:
                   if condition1(ii):
                       yield something1
                       yield something2
                       yield something3
            
                   elif condition2(ii):
                       yield something4
            
                   else: #default
                       yield something5
            

            这对我来说似乎更具可读性

            【讨论】:

              猜你喜欢
              • 2019-01-05
              • 2011-01-27
              • 1970-01-01
              • 2016-04-05
              • 2018-03-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多