在Python中,我通常通过循环范围仅仅通过如何跳过几次迭代的for循环
但现在我想跳过循环几步之遥。更具体地说,我想要像continue(10)
这样它会跳过整个循环,并增加计数器10.如果我在C中使用for循环,我只能总结10 i
,但在Python中并不真正工作。
在Python中,我通常通过循环范围仅仅通过如何跳过几次迭代的for循环
但现在我想跳过循环几步之遥。更具体地说,我想要像continue(10)
这样它会跳过整个循环,并增加计数器10.如果我在C中使用for循环,我只能总结10 i
,但在Python中并不真正工作。
您不能更改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()
。
最好的方法是为迭代器指定一个名称 - 通常有一个迭代器,而不是迭代器(差别是迭代器 - 例如列表 - 每次迭代时都从头开始)。在这种情况下,只要使用the iter()
built-in function:
numbers = iter(range(100))
然后你可以提前使用它的名字在循环中。最好的方法是使用the itertools
consume()
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.
请注意,即使在Python 3中,您也可以*调用'range()'上的iter()来使其工作。 Python 3'range()'对象是一个序列(可迭代的),而不是迭代器。 –
@MartijnPieters令人难以置信的好点。编辑。我遍历范围很少,我忘记了这种情况。 –
好的答案+1 –
为什么不直接设置为跳过,直到价值?像:
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()是实际循环的内容?
+1,'continue'是最不复杂的方式。 – 2rs2ts
值得注意的是,这需要在Python中执行循环,并且每次都指定名称 - 尽管在大多数情况下这不太可能是个问题,但从这个意义上讲效率要低得多。 –
是的,但考虑到简单的问题,我想他想要一个简单的答案;如果循环/跳过很小,用迭代器搞乱看起来好像过度。 –
for i in range(0, 100, 10):
print(i)
将打印0,10,20 ...
嗨,虽然这跳过了前10个值,但我认为提问者更感兴趣的是知道如何在循环**中**跳到任意值。查看顶部答案的例子。 – seth
你绝对不需要python 3.3。 –
我想这可能是这样,while循环,也只是很悲伤。无论如何, –
结束了while循环!万分感谢! –
@AlexS如果您正在迭代数字,那很好 - 如果您使用这些数字作为列表或其他的索引,请不要这样做。按索引迭代在各方面都很糟糕。 –