有没有办法在不引入多余变量的情况下迭代指定次数?
如果我想在Java中循环执行n
次,我会这样写:
for (i = 0; i < n; i++) {
// do stuff
}
在Python中,似乎标准的做法是:
for x in range(n):
# do stuff
像往常一样,Python的写法更简洁,也更容易读懂。不过,x
让我有点困扰,因为它是多余的,而且PyDev会发出警告,因为x
根本没有被使用。
有没有办法可以做到这一点,既不会产生警告,也不会引入多余的变量呢?
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作为迭代变量。用下划线似乎对我来说不太优雅。
在Python(还有很多其他编程语言)中,通常会用_
作为临时变量,这样做的意思是告诉读者这个变量是故意不使用的。
除了这个约定,Python中的in
循环结构总是需要你遍历某个东西,并把这个值赋给一个变量。
在这个问题的接受答案中的评论提到,PyDev不会对_
发出警告。
for _ in range(n):
# do stuff