2013-07-24 67 views
16

在Python中,我通常通过循环范围仅仅通过如何跳过几次迭代的for循环

但现在我想跳过循环几步之遥。更具体地说,我想要像continue(10)这样它会跳过整个循环,并增加计数器10.如果我在C中使用for循环,我只能总结10 i,但在Python中并不真正工作。

回答

16

您不能更改for循环的目标列表(本例中为i)。使用while循环,而不是:

while i < 10: 
    i += 1 
    if i == 2: 
     i += 3 

另外,使用迭代和增量是:

from itertools import islice 

numbers = iter(range(10)) 
for i in numbers: 
    if i == 2: 
     next(islice(numbers, 3, 3), None) # consume 3 

通过分配的iter()结果到一个局部变量,我们可以利用先进的循环内的循环顺序标准迭代工具(next(),或这里,itertools消耗配方的缩短版本)。 for通常在迭代器上循环时调用iter()

+4

我想这可能是这样,while循环,也只是很悲伤。无论如何, –

+0

结束了while循环!万分感谢! –

+0

@AlexS如果您正在迭代数字,那很好 - 如果您使用这些数字作为列表或其他的索引,请不要这样做。按索引迭代在各方面都很糟糕。 –

20

最好的方法是为迭代器指定一个名称 - 通常有一个迭代器,而不是迭代器(差别是迭代器 - 例如列表 - 每次迭代时都从头开始)。在这种情况下,只要使用the iter() built-in function

numbers = iter(range(100)) 

然后你可以提前使用它的名字在循环中。最好的方法是使用the itertoolsconsume() recipe - 因为它速度很快(它使用itertools函数来确保迭代发生在低级代码中,使得消耗值的过程非常快,并避免通过存储消耗的值来消耗内存):

from itertools import islice 
import collections 

def consume(iterator, n): 
    "Advance the iterator n-steps ahead. If n is none, consume entirely." 
    # Use functions that consume iterators at C speed. 
    if n is None: 
     # feed the entire iterator into a zero-length deque 
     collections.deque(iterator, maxlen=0) 
    else: 
     # advance to the empty slice starting at position n 
     next(islice(iterator, n, n), None) 

通过这样做,你可以这样做:

numbers = iter(range(100)) 
for i in numbers: 
    ... 
    if some_check(i): 
     consume(numbers, 3) # Skip 3 ahead. 
+0

请注意,即使在Python 3中,您也可以*调用'range()'上的iter()来使其工作。 Python 3'range()'对象是一个序列(可迭代的),而不是迭代器。 –

+0

@MartijnPieters令人难以置信的好点。编辑。我遍历范围很少,我忘记了这种情况。 –

+0

好的答案+1 –

4

为什么不直接设置为跳过,直到价值?像:

skip_until = 0 
for i in range(100): 
    if i < skip_until: 
     continue 
    if SOME_CONDITION: 
     skip_until = i + 10 
    DO_SOMETHING() 

其中SOME_CONDITION是什么使你跳过和DO_SOMETHING()是实际循环的内容?

+0

+1,'continue'是最不复杂的方式。 – 2rs2ts

+0

值得注意的是,这需要在Python中执行循环,并且每次都指定名称 - 尽管在大多数情况下这不太可能是个问题,但从这个意义上讲效率要低得多。 –

+0

是的,但考虑到简单的问题,我想他想要一个简单的答案;如果循环/跳过很小,用迭代器搞乱看起来好像过度。 –

-2
for i in range(0, 100, 10): 
    print(i) 

将打印0,10,20 ...

+1

嗨,虽然这跳过了前10个值,但我认为提问者更感兴趣的是知道如何在循环**中**跳到任意值。查看顶部答案的例子。 – seth

+0

你绝对不需要python 3.3。 –