如何在for循环中跳过几次迭代

Ale*_*x S 23 python loops

在python中,我通常只是通过范围循环

for i in range(100): 
    #do something
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 22

您无法更改循环的目标列表(i在本例中)for.while改为使用循环:

while i < 10:
    i += 1
    if i == 2:
        i += 3
Run Code Online (Sandbox Code Playgroud)

或者,使用可迭代的增量:

from itertools import islice

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

通过将结果赋值给iter()局部变量,我们可以使用标准迭代工具(next()或者此处,itertools消耗配方的缩短版本)推进循环内的循环序列.for通常iter()在循环遍历迭代器时调用我们.

  • 我想可能是这种情况,虽然循环只是悲伤. (5认同)

Gar*_*tty 21

最好的方法是为迭代器分配一个名称 - 它通常有一个迭代而不是迭代器(差异是一个可迭代的 - 例如一个列表 - 每次迭代时从头开始).在这种情况下,只使用iter()内置函数:

numbers = iter(range(100))
Run Code Online (Sandbox Code Playgroud)

然后你可以使用名称在循环内推进它.要做到这一点,最好的办法是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)
Run Code Online (Sandbox Code Playgroud)

通过这样做,您可以执行以下操作:

numbers = iter(range(100))
for i in numbers: 
    ...
    if some_check(i):
        consume(numbers, 3)  # Skip 3 ahead.
Run Code Online (Sandbox Code Playgroud)

  • 请注意,即使在 Python 3 中,您也必须在“range()”上调用“iter()”才能使其正常工作。Python 3 `range()` 对象是一个序列(可迭代对象),而不是迭代器。 (2认同)

Jos*_*ell 5

为什么不只将值设置为跳过?喜欢:

skip_until = 0
for i in range(100):
    if i < skip_until:
        continue
    if SOME_CONDITION:
        skip_until = i + 10
    DO_SOMETHING()
Run Code Online (Sandbox Code Playgroud)

SOME_CONDITION是什么导致您跳过,而DO_SOMETHING()是实际的循环内容?