修改for循环中的迭代器

时间:2015-04-20 19:42:46

标签: python for-loop iterator

是否可以在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)

4 个答案:

答案 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的回答)。