是否可以在for循环中修改迭代器?
我的代码没有按预期运行(打印0-9)。 我可以使用while循环但是寻找for循环解决方案。
for r in range(0,10):
if(r==0):
print (0)
print (1)
print (2)
r = r+3
else:
print(r)
答案 0 :(得分:4)
这样做的:
r = r+3
将无法正常工作,因为r
被赋给迭代器返回的值,而不是迭代器本身。要推进迭代器,您需要在其上调用next
。
您可以通过首先将迭代器保存在变量中并循环遍历:
来完成此操作it = iter(range(0,10))
for r in it:
这样你就可以在循环中调用next
:
it = iter(range(0,10))
for r in it:
if(r==0):
print (0)
print (1)
print (2)
for _ in range(3): # Advance the iterator by 3.
next(it)
else:
print(r)
但请注意,正如@StevenRumbalski所说,在空迭代器上调用next
会引发StopIteration
异常。有时这种行为是可取的,但如果没有,您可以指定要返回的默认值:
next(it, None)
这将有效地使该行成为无操作。
答案 1 :(得分:3)
for r in range(10):
print r
我猜...假设我理解......
[编辑]哦,我终于弄明白了你的意思......答案并非真的是每个循环重新分配
但是你可以影响迭代器
my_iter = xrange(10)
for value in my_iter:
if value == 0:
print "A",value
print "B",next(my_iter)
print "C",next(my_iter)
else:
print value
答案 2 :(得分:3)
分配给循环变量只会被循环的下一次迭代覆盖。循环变量就像其他任何东西一样。此PyCon 2015演讲可能有助于解释详细信息:Python Names and Values。
答案 3 :(得分:0)
for r in range(0, 10)
每次迭代都会分配给r
。这意味着循环变量的赋值将不会持续到下一次迭代。
你的for循环相当于:
it = iter(range(0, 10))
while True:
try:
r = next(it)
except StopIteration:
break
if(r==0):
print (0)
print (1)
print (2)
r = r+3
else:
print(r)
r = next(it)
确认您在之前的迭代中对名称r
所做的任何分配。同样的事情在你的for循环中隐含发生。
如果您的最终目标是按步骤推进迭代器,请调用next(it)
您想要推进迭代器的次数(根据iCodez的回答)。