有没有办法在不引入多余变量的情况下迭代指定次数?

5 投票
2 回答
10084 浏览
提问于 2025-04-16 03:02

如果我想在Java中循环执行n次,我会这样写:

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

在Python中,似乎标准的做法是:

for x in range(n):
    # do stuff

像往常一样,Python的写法更简洁,也更容易读懂。不过,x让我有点困扰,因为它是多余的,而且PyDev会发出警告,因为x根本没有被使用。

有没有办法可以做到这一点,既不会产生警告,也不会引入多余的变量呢?

2 个回答

2

在Python中,你不需要为你描述的情况创建额外的变量。

for i in range(10):

这段代码创建了一个范围对象,循环会在这个范围上进行迭代。范围对象会在任何时候保持它的当前值。i只是一个名字,用来指代这个值。

这个变量的存在与否并不依赖于它是否有名字,因为范围对象必须知道它的当前值。

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

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

在一些即时编译语言中,有一种机制可以检测到循环只是重复执行相同代码的少量次数,并优化代码为一系列相同的指令。但据我所知,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行)。

当然,你可以通过简单地重复你的代码来避免这一切。但一旦这个重复的次数可能变化,就需要某种机制来提供next()和StopIteration,以便for循环能够正常工作。记住,Python的for循环在某种程度上可以与Java中的for-each循环相提并论。实际上,Python并没有传统的for循环。

顺便提一下:我总是用i、j和k作为迭代变量。用下划线似乎对我来说不太优雅。

6

在Python(还有很多其他编程语言)中,通常会用_作为临时变量,这样做的意思是告诉读者这个变量是故意不使用的。

除了这个约定,Python中的in循环结构总是需要你遍历某个东西,并把这个值赋给一个变量。

这个问题的接受答案中的评论提到,PyDev不会对_发出警告。

for _ in range(n):
    # do stuff

撰写回答