【问题标题】:Unable to skip numbers using a for loop无法使用 for 循环跳过数字
【发布时间】:2017-08-28 07:17:20
【问题描述】:

我只想使用基本的python for 循环打印一些数字:

for i in range(10):
    i = i+1
    print(i)

预期输出:

1
3
5
7
9

实际输出:

1
2
3
4
5
6
7
8
9
10

为什么变量'i'在i = i+1时不跳一步。 我假设两者 i's 不同?因为我尝试使用print(id(i)) 打印 id。如果我错了,请纠正我。

【问题讨论】:

  • 如果同一个循环以例如开头,您的预期输出是什么。 for i in [0,3,-1,12]: 而不是?

标签: python for-loop iteration


【解决方案1】:

这里要注意的是,改变i的值不会影响迭代次数。您当前的代码步数从 0 到 9,将当前值加一。它确实跳过这些迭代。 i 只是for 循环分配的循环变量,它不以任何方式控制迭代。

改用range 函数的step 参数:

In [665]: for i in range(1, 10, 2): # start, stop, step
     ...:     print(i)
     ...: 
1
3
5
7
9 

默认情况下range 一次执行一个步骤,因此您最终会逐步执行您希望跳过的迭代。

【讨论】:

  • 这里要注意的关键点是,在循环中更改i 不会产生预期的效果,因为名称i 将被反弹到@987654330 的下一次迭代的值@循环每次。
  • 代码高尔夫:print(*range(1,10,2),sep="\n")
  • 但是为什么遇到i = i+1时i没有改变
  • @JohnMcIntyreJr。因为在 forloop 的每次迭代开始时 - i 被设置为由 range 生成的下一个值...
  • @John,它确实......它在下次执行交互器时被覆盖
【解决方案2】:
>>> p = range(1,10,2)
>>> p
[1, 3, 5, 7, 9]

>>> def test(last,step):
...     for item in range(1,last,step)
...         print item
>>> test(10,2)
1 
3
5
7
9
>>> 
>>> test(15,2)
1 
3
5 
7
9
11
13

【讨论】:

    【解决方案3】:

    你可以尝试两种方法,这是你的方式,

    >>> for i in range(10):
    ...     if i%2!=0:
    ...       print i
    ... 
    1
    3
    5
    7
    9
    >>> 
    

    接下来是@colspeed 建议的for i in range(1,10,2)

    【讨论】:

      【解决方案4】:

      Python for 循环不关心在循环期间对其临时变量所做的任何编辑。当它到达末尾时,它会勾选您将它提供给下一个项目的任何迭代器。在你的情况下,我不是你给它的范围的索引,它是范围的输出,在循环的内置指针处。 Cricket 的答案是解决您的问题的最佳方式,但如果您想从内部更改循环,请使用外部变量:

      numberlist = range(0,10)
      i=0
      while i < numberlist[-1]:
          i+=1 #+1 to skip
          print i
          i+=1 #+1 to turn while into for
      

      【讨论】:

        【解决方案5】:

        当您遍历列表[0,1,...9] (range(10)) 时,在第一次迭代时,i 设置为0,那么无论您从那里使用i 做什么,它都不会改变i 将在下一次迭代中设置为 1 的事实,依此类推。这就是为什么它不能按预期工作的答案。查看其他答案以了解如何解决它...

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多