【问题标题】:Python for loop questionPython for 循环问题
【发布时间】:2011-01-26 15:19:24
【问题描述】:

我想知道如何在python中实现以下功能:

for( int i = 0; cond...; i++)
  if cond...
    i++; //to skip an run-through

我试过了,但没有运气。

for i in range(whatever):
  if cond... :
    i += 1

【问题讨论】:

  • 哎呀。我的意思是投票给另一个重复。对此感到抱歉。

标签: python loops for-loop


【解决方案1】:

根据您要完成的任务,还有一种替代方法。如果cond 完全是您正在循环的输入数据的函数,您可以尝试以下操作:

def check_cond(item):
    if item satisfies cond:
        return True
    return False

for item in filter(check_cond, list):
    ...

这是执行此操作的函数式编程方式,有点像 C# 3.0+ 中的 LINQ。我不太确定这就是 Python 风格(有一段时间 Guido van Rossum 想从 Python 3 中删除过滤器、映射和归约),但它确实很优雅,而且我会这样做。

【讨论】:

    【解决方案2】:
    for i in filter(lambda x:x!=2,range(5)):
    

    【讨论】:

      【解决方案3】:

      您可以显式递增迭代器。

      whatever = iter(whatever)
      for i in whatever:
          if cond:
              whatever.next()
      

      如果 cond 在最后一个元素上可以为 True,则需要捕获 StopIteration。

      【讨论】:

        【解决方案4】:

        请记住,您正在迭代列表中的元素,而不是迭代数字。

        例如考虑以下内容:

        for i in ["cat", "dog"]:
          print i
        

        如果你在那里执行 i+1 会发生什么?您现在可以看到为什么它没有跳过列表中的下一个元素。

        您可以尝试调整您正在迭代的列表中包含的内容,而不是实际迭代所有值。

        例子:

        r = range(10)
        for i in filter(lambda x: x % 2 == 0, r):
          print i
        

        你也可以考虑将for body分成2个。第一部分会使用continue跳转到下一个元素,第二部分如果你没有跳过就做动作。

        【讨论】:

          【解决方案5】:

          Python 的 for 循环是不同的。每次循环时,i 都会重新分配给下一个值。

          以下将做你想做的事,因为它采用了 C++ 正在做的文字版本:

          i = 0
          while i < some_value:
              if cond...:
                  i+=1
              ...code...
              i+=1
          

          原因如下:

          在 C++ 中,以下代码段是等价的:

          for(..a..; ..b..; ..c..) {
              ...code...
          }
          

          和

          ..a..
          while(..b..) {
               ..code..
               ..c..
          }
          

          而 python for 循环看起来像:

          for x in ..a..:
              ..code..
          

          变成

          my_iter = iter(..a..)
          while (my_iter is not empty):
              x = my_iter.next()
              ..code..
          

          【讨论】:

            【解决方案6】:

            您不能简单地“跳过下一段”(您当然可以使用continue 跳过此 段)。如果你真的坚持你可以用一个辅助bool,例如

            skipping = False
            for i in whatever:
              if skipping:
                skipping = False
                continue
              skipping = cond
              ...
            

            或者为了一般性用一个辅助int:

            skipping = 0
            for i in whatever:
              if skipping:
                skipping -= 1
                continue
              if badcond:
                skipping = 5  # skip 5 legs
              ...
            

            但是,最好将这种复杂的循环逻辑封装在适当的生成器中 - 很难给出示例,除非您可以更具体地了解您想要的内容(即“伪 C”,其中两个大概是 100%同一个布尔值cond 的不同用途真的很难理解;-)。

            【讨论】:

              【解决方案7】:

              有一个 continue 关键字跳过当前迭代并前进到下一个迭代(以及一个 break 关键字跳过所有循环迭代并退出循环):

              for i in range(10):
                  if i % 2 == 0:
                    # skip even numbers
                    continue 
                  print i
              

              【讨论】:

              • 您的概念是正确的,但您的措辞是错误的。 Continue 不会跳过下一次迭代,而是进入下一次迭代
              • 好的,但是如果我想跳过接下来的 5 次运行怎么办。我的意思是,是否可以手动增加“i”?
              • 没有。 Python 中的for 循环是一个遍历序列的foreach 循环。序列可能是任何东西,像i+5 这样的东西只有在有range(..) 时才有效,但它会因其他可能的序列而失败。无论如何,您可以将迭代器存储在一个变量中并多次调用 .next() 。或者您可以使用 while 关键字实现经典的 for 循环...
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-10-21
              相关资源
              最近更新 更多