30

在python中,我通常通过简单地循环范围

for i in range(100): 
    #do something

但现在我想跳过循环中的几个步骤。更具体地说,我想要这样的东西continue(10),它会跳过整个循环并将计数器增加 10。如果我在 C 中使用 for 循环,我只需将 10 与 相加i,但在 Python 中这并不真正起作用。

4

5 回答 5

33

您不能更改循环的目标列表(i在这种情况下) 。for改用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()itertoolsforiter()

于 2013-07-24T14:43:27.477 回答
24

最好的方法是为迭代器指定一个名称——通常有一个可迭代而不是迭代器(区别在于可迭代——例如一个列表——每次迭代它时从头开始)。在这种情况下,只需使用内置iter()函数

numbers = iter(range(100))

然后,您可以使用名称在循环内推进它。最好的方法是使用配方itertools consume()-因为它很快(它使用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.
于 2013-07-24T14:46:20.133 回答
5

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

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() 是实际的循环内容?

于 2013-07-24T14:50:37.933 回答
1
for i in range(0, 100, 10):
    print(i)

将打印 0、10、20 ...

于 2013-07-24T15:21:42.730 回答
-1

一个迷人而简单的形式是这样的:

>>> for i in range(5,10):
...     print (i)
... 
5
6
7
8
9

5开始迭代的索引在哪里。

于 2021-04-23T03:12:48.170 回答