【问题标题】:Modifying iterator in for loops在 for 循环中修改迭代器
【发布时间】:2015-04-20 19:42:45
【问题描述】:

是否可以在 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 - 13?
  • 您实际期望的输出是什么?
  • 0-9,但打印 0-9 不是问题,修改迭代器是。

标签: python for-loop iterator


【解决方案1】:

在做:

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)

这将有效地使该行成为无操作。

【讨论】:

  • 非常感谢。但对于 _ in range(2) 工作正常。
【解决方案2】:

分配给循环变量将被循环的下一次迭代简单地覆盖。循环变量是一个赋值,就像其他任何东西一样。这个 PyCon 2015 演讲可能有助于解释细节:Python Names and Values

【讨论】:

  • 你在我做之前就知道问题所在了:P (+1)
【解决方案3】:
for r in range(10):
    print r

我猜...假设我理解...

[编辑] 哦,我终于明白你的意思了……答案并不是真的 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

【讨论】:

  • 不,抱歉,您没有。这是一个简单的例子,不是打印从 0 到 10 的数字,而是修改你的迭代器。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 2017-08-23
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 2014-11-09
    • 2022-01-14
    相关资源
    最近更新 更多