在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.
感谢。
答案 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循环,除了迭代次数有一个硬限制,这在某些用例中很有用。