在循环内递增for循环

8 投票
5 回答
13259 浏览
提问于 2025-04-28 00:15

在Python 3中,可以在循环内部增加for循环的计数器吗?

比如说:

for i in range(0, len(foo_list)):
    if foo_list[i] < bar
        i += 4

在这个例子中,如果条件成立,循环计数器i会增加4,否则它就只增加1(或者for循环的步长值)。

我知道在这种情况下使用while循环会更合适,但我想知道在for循环中是否可以做到这一点(或者类似的操作)。

谢谢!

暂无标签

5 个回答

0
while i < end:
  # do stuff
  # maybe i +=1
  # or maybe i += 4

我想你可以试着用一个for循环来实现这个,但其实不太推荐。Python的for循环主要是用来查看项目本身,而不是查看它们的位置索引。

1

可以通过一个 for 循环来实现这个功能,使用生成器的 send 方法。这样的话,如果给生成器发送一个新值,就可以修改计数器的值:

def jumpable_range(end):
    counter = 0
    while counter < end:
        jump = yield counter
        if jump is None:
            counter += 1
        else:
            counter = jump

foo_list = [1, 2, 3, 4, 5, 6, 7, 8]
bar = 6
iterable = jumpable_range(len(foo_list))
for i in iterable:
    if foo_list[i] < bar:
        i = iterable.send(i + 4)
    print(i)

这段代码的输出结果是:

4
5
6
7

示例: https://repl.it/@blhsing/ImpossibleAcrobaticComputergraphics

1

在你的例子中,i 在每次循环的新迭代时都会被重置(这可能看起来有点反直觉),如下所示:

foo_list = [1, 2, 3]

for i in range(len(foo_list)):
    print('Before increment:', i)
    i += 4
    print('After increment', i)

>>>
Before increment: 0
After increment 4
Before increment: 1
After increment 5
Before increment: 2
After increment 6

continue 是跳过循环中下一次迭代的标准和安全的方法,但把多个 continue 连在一起使用会显得很麻烦,不如直接用 while 循环,正如其他人所建议的那样。

2

有点小技巧...

>>> b = iter(range(10))
>>> for i in b:
...     print(i)
...     if i==5 : i = next(b)
... 
0
1
2
3
4
5
7
8
9
>>> 
12

你可以使用一个 while 循环,根据条件来增加 i 的值:

while i < (len(foo_list)): 
    if foo_list[i] < bar: # if condition is True increment by 4
        i += 4
    else: 
        i += 1 # else just increment 1 by one and check next `foo_list[i]`

使用 for 循环时,i 会始终返回到范围内的下一个值:

foo_list = [1,2,3,4,5,6]
bar = 6
for i in range(len(foo_list)):
    print("range i ",i)
    if foo_list[i] < bar:
        i += 4
        print("if i",i)


('range i ', 0)
('if i', 4)
('range i ', 1)
('if i', 5)
('range i ', 2)
('if i', 6)
('range i ', 3)
('if i', 7)
('range i ', 4)
('if i', 8)
('range i ', 5)

撰写回答