【问题标题】:Is there a way to iterate a specified number of times without introducing an unnecessary variable?有没有办法在不引入不必要变量的情况下迭代指定次数?
【发布时间】:2010-08-19 16:42:25
【问题描述】:

如果我想在 Java 中迭代 n 次,我会写:

for (i = 0; i < n; i++) {
    // do stuff
}

在 Python 中,执行此操作的标准方法似乎是:

for x in range(n):
    # do stuff

与往常一样,Python 更简洁、更易读。但是x 困扰我,因为它是不必要的,而且 PyDev 会生成一个警告,因为从未使用过 x

有没有办法做到这一点,不会产生任何警告,也不会引入不必要的变量?

【问题讨论】:

  • 为什么 Java 中的 i 没有必要打扰您?
  • @S.Lott 我没有说i 不会打扰我。像往常一样,我更喜欢 Python 语法。但是有一个事实是,Java中的i似乎被使用了,我没有因为没有在循环中使用它而被骂。
  • i 可能实际上并未使用。所以是“骂”?是这个问题吗?
  • 史蒂文,我喜欢 Python。这是我最喜欢的语言,虽然我不太懂。我不是想抱怨或挑衅。我的 IDE 告诉我我没有以最好的方式做某事,所以我寻求最好的方式。我现在很高兴,但我的问题对你来说似乎很奇怪。美好的。最终我会很好地理解 Python,以至于self 的东西看起来很正常。但就目前而言,我会问一些对像你一样有经验的人来说似乎很奇怪的问题。
  • 插入关于 range() 的强制性警告。如果 n 可能很大,请改用 xrange()(如果您的 Python 实现支持它)或 itertools.islice()。

标签: coding-style iteration python


【解决方案1】:

惯用的 Python(和许多其他语言)会让您使用 _ 作为临时变量,这通常向读者表明该变量是故意未使用的。

除了该约定之外,Python 中的 in 循环构造始终要求您迭代某些内容并将该值分配给变量。

this question 接受的答案中的 cmets 表明 PyDev 不会为 _ 创建警告)。

for _ in range(n):
    # do stuff

【讨论】:

    【解决方案2】:

    在 Python 中,您不会在您描述的那种情况下创建额外的变量。

    for i in range(10):
    

    创建一个范围对象,循环对其进行迭代。范围对象在任何给定时间都保持其当前值。 i 只是一个创建并绑定到此值的名称。

    变量存在与否,无论它是否有名称,因为范围对象必须知道它的当前值。

    如果你从 cpu 指令的角度考虑循环,你就会明白为什么必须有一个变量:

    push x
    loop:
        do something
        increment x
        jump if x > y
        goto loop
    

    在某些 JIT 编译语言中,有时会检测到循环只是相同代码的少量重复,并将代码优化为一系列相同的指令。但是,据我所知,python 没有这样的事情。

    这是字节码中的 for 循环:

      4           0 SETUP_LOOP              20 (to 23) 
                  3 LOAD_GLOBAL              0 (range) 
                  6 LOAD_FAST                0 (x) 
                  9 CALL_FUNCTION            1 
                 12 GET_ITER             
            >>   13 FOR_ITER                 6 (to 22) 
                 16 STORE_FAST               1 (i) 
    
      5          19 JUMP_ABSOLUTE           13 
            >>   22 POP_BLOCK            
    

    请注意,没有比较。循环由迭代对象引发 StopIteration 退出,然后解释器查找循环设置并跳转到循环的末尾(本例中为 23)。

    当然,您可以通过重复代码 x 次来避免所有这些。一旦这个数字可能发生变化,就需要某种工具来提供 next() 和 StopIteration 以使 for 循环正常工作。请记住,python 的 for-loop 与 Java 中的 for-each 循环相当。根本没有传统的 for 循环可用。

    顺便说一句: 我总是使用 i、j 和 k 来迭代变量。在我看来,使用下划线有点不雅。

    【讨论】:

      猜你喜欢
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-04
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多