改变Python循环中的步骤

时间:2017-09-12 15:01:19

标签: python

在Python 2.7中,我想根据循环中满足的细节条件修改for循环的步骤。像这样:

step = 1
for i in range(1, 100, step):
    if ...... :
        step = 1
        #do stuff
    else:
        step = 2
        #do other stuff

但似乎无法做到这一点,step始终是1.

感谢。

6 个答案:

答案 0 :(得分:8)

您需要手动增加step,这可以使用while循环完成。 checkout difference between while and for loop

  

for语句遍历集合或可迭代对象或   发电机功能。

     

while语句只是循环,直到条件为False。

如果您使用while循环,您的代码将如下所示:

step = 1
i = 1
while i < 100:
    if ...... :
        step = 1
        #do stuff
    else:
        step = 2
        #do other stuff
    i = i + step

答案 1 :(得分:4)

import numpy as np
for i in np.arange(start,stop,stepwidth):
    # your stuff

答案 2 :(得分:1)

您可以使用while循环执行此操作:

step = 1
i = 1
while i < 100:
    if ...... :
        step = 1
        #do stuff
    else:
        step = 2
        #do other stuff
    i+=step

答案 3 :(得分:1)

如果您想使事情过于复杂,可以创建一个自定义生成器,您可以使用generator.send方法在迭代期间传递新步骤。

def variable_step_generator(start, stop=None, step=1):
    if stop is None:
        start, stop = 0, start

    while start < stop:
        test_step = yield start

        if test_step is not None:
            step = test_step
            yield

        start += step

使用方式如下:

variable_step_range = variable_step_generator(1, 100)
for i in variable_step_range:
    print i
    if i == 10:
        variable_step_range.send(10)
    if i == 90:
        variable_step_range.send(1)

#  1,  2,  3,  4,  5,  6,  7,  8,  9, 
# 10, 20, 30, 40, 50, 60, 70, 80, 90, 
# 91, 92, 93, 94, 95, 96, 97, 98, 99

但这并不仅仅是围绕while循环的包装,而其他答案也是如此。

答案 4 :(得分:0)

您可以添加跳过检查:

skip = 0
for i in range(1, 100):
    if skip != 0:
        skip -= 1
        continue
    if ...... :
        #do stuff
    else:
        skip = 1
        #do other stuff

答案 5 :(得分:0)

代码的第二行创建一个范围对象,然后用于循环的其余部分,并且您的代码不会修改该范围对象。即使你确实改变了步骤,那也不会改变范围的下一个元素,它会改变整个范围对象(也就是说,将步骤改为2会使每个比前一个范围2的元素。如果你真的想要,你可以创建一个命名对象并在for循环中修改它,但这将是一件相当混乱的事情。

您还可以使用另一个与main for循环1分开的索引。例如:

actual_index = 1
for for_loop_index in range(1,100):
   if condition1:
        actual_index = actual_index + 1
   if condition2:
        actual_index = actual_index + 2
   if actual_index > 99:
        break

这基本上是一个while循环,除了迭代次数有一个硬限制,这在某些用例中很有用。