【问题标题】:python: restarting a looppython:重新启动循环
【发布时间】:2010-10-04 07:39:54
【问题描述】:

我有:

for i in range(2,n):
    if(something):
       do something
    else:
       do something else
       i = 2 **restart the loop

但这似乎不起作用。有没有办法重新启动那个循环?

谢谢

【问题讨论】:

    标签: python loops


    【解决方案1】:
    a = ['1', '2', '3']
    ls = []
    count = False
    
    while ls != a :
        print(a[count])
        if a[count] != a[-1] :
            count = count + 1
        else :
            count = False
    

    重启while循环。

    【讨论】:

      【解决方案2】:

      这是一个使用生成器send() method的示例:

      def restartable(seq):
          while True:
              for item in seq:
                  restart = yield item
                  if restart:
                      break
              else:
                  raise StopIteration
      

      示例用法:

      x = [1, 2, 3, 4, 5]
      total = 0
      r = restartable(x)
      for item in r:
          if item == 5 and total < 100:
              total += r.send(True) 
          else:
              total += item
      

      【讨论】:

        【解决方案3】:

        只是想发布一个可能更普遍可用的替代方案。大多数现有解决方案使用循环索引来避免这种情况。但是您不必使用索引 - 这里的关键是,与 for 循环不同,循环变量是隐藏的,循环变量是公开的。

        你可以用迭代器/生成器做非常相似的事情:

        x = [1,2,3,4,5,6]
        xi = iter(x)
        ival = xi.next()
        while not exit_condition(ival):
            # Do some ival stuff
            if ival == 4:
                xi = iter(x)
            ival = xi.next()
        

        它不是那么干净,但仍然保留了写入循环迭代器本身的能力。

        通常,当你认为你想这样做时,你的算法是错误的,你应该更干净地重写它。可能您真正想要做的是使用生成器/协程。但这至少是可能的。

        【讨论】:

          【解决方案4】:

          您可能需要考虑在该逻辑适用的情况下使用不同类型的循环,因为这是最明显的答案。

          也许是:

          i=2
          while i < n:
              if something:
                 do something
                 i += 1
              else: 
                 do something else  
                 i = 2 #restart the loop  
          

          【讨论】:

          • 提醒一下:使用 while 循环,确保您有一个可以始终满足的终止条件。
          • 我认为这将在 i>=n 时终止
          • 但是没有什么能阻止 i 无限期地重置为 2,这取决于“if something”测试。
          • 所以它更多地取决于 if-test 而不是循环不变量?是否有另一种解决方案可以在保持简单的同时避免这种情况(因为简单是关键)?在任何可能重启的循环中,是否总是存在相同的风险?
          【解决方案5】:

          从循环中更改索引变量i 不太可能达到您的预期。您可能需要改用while 循环,并自己控制循环变量的递增。每次围绕for 循环,i 都会重新分配来自range() 的下一个值。所以像:

          i = 2
          while i < n:
              if(something):
                  do something
              else:
                  do something else
                  i = 2 # restart the loop
                  continue
              i += 1
          

          在我的示例中,continue 语句跳回到循环顶部,跳过了该迭代的 i += 1 语句。否则,i 会按照您的预期递增(与 for 循环相同)。

          【讨论】:

            猜你喜欢
            • 2022-01-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-01-23
            • 1970-01-01
            • 1970-01-01
            • 2015-03-14
            • 2015-04-11
            相关资源
            最近更新 更多