Python for循环问题

时间:2010-03-12 00:00:39

标签: python loops for-loop

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

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

我试了这个没有运气。

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

7 个答案:

答案 0 :(得分:36)

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..

答案 1 :(得分:11)

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

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

答案 2 :(得分: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跳到下一个元素,如果您没有跳过,第二部分将执行操作。

答案 3 :(得分:4)

您可以显式增加迭代器。

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

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

答案 4 :(得分:2)

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

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

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

这是执行此操作的函数式编程方式,有点像C#3.0+中的LINQ。我不太确定它是pythonic(有一段时间Guido van Rossum想要从Python 3中删除过滤器,地图和缩小)但它肯定是优雅的,我会这样做。

答案 5 :(得分:1)

你不能轻易“跳过下一站”(你当然可以用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的不同用法真的很难遵循; - )。

答案 6 :(得分:0)

for i in filter(lambda x:x!=2,range(5)):