在python中,我通常通过简单地循环范围
for i in range(100):
#do something
但现在我想跳过循环中的几个步骤。更具体地说,我想要这样的东西continue(10)
,它会跳过整个循环并将计数器增加 10。如果我在 C 中使用 for 循环,我只需将 10 与 相加i
,但在 Python 中这并不真正起作用。
您不能更改循环的目标列表(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()
itertools
for
iter()
最好的方法是为迭代器指定一个名称——通常有一个可迭代而不是迭代器(区别在于可迭代——例如一个列表——每次迭代它时从头开始)。在这种情况下,只需使用内置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.
为什么不直接将值设置为跳过直到?像:
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() 是实际的循环内容?
for i in range(0, 100, 10):
print(i)
将打印 0、10、20 ...
一个迷人而简单的形式是这样的:
>>> for i in range(5,10):
... print (i)
...
5
6
7
8
9
5
开始迭代的索引在哪里。