我想知道是否可以执行一定数量的操作而不将循环迭代编号存储在任何地方。
例如,假设我想在控制台上打印两条"hello"
消息。现在我知道我能做到:
for i in range(2):
print "hello"
但是i
变量将采用值0
和1
(我不需要)。有没有办法实现同样的事情而不将这些不需要的值存储在任何地方?
答案 0 :(得分:46)
未使用的变量的成语(由许多其他语言共享)是单个下划线_
。代码分析器通常不会抱怨_
未被使用,程序员会立即知道它是i_dont_care_wtf_you_put_here
的捷径。没有项目变量就没有办法进行迭代 - 正如Python的Zen所说的那样,“特殊案例并不足以打破规则”。
答案 1 :(得分:13)
exec 'print "hello";' * 2
应该有效,但我有点惭愧,我想到了它。
更新:想到另一个:
for _ in " "*10: print "hello"
答案 2 :(得分:9)
我认为你在问题中提供的forloop是好的,但是我想指出,必须分配的未使用的变量可以分配给名为{{1}的变量,"丢弃"分配的值。虽然_
引用将保留您给出的值,但代码链接和其他开发人员将理解您没有使用该引用。所以这是一个例子:
_
答案 3 :(得分:4)
其他人已经解决了无法在for
循环中完全避免迭代变量的问题,但是有一些选项可以减少工作量。 range
毕竟必须产生一大堆数字,这涉及到一小部分工作;如果你想避免这种情况,你可以使用itertools.repeat
来反复获得相同(被忽略)的值,这不涉及不创建/检索不同的对象:
from itertools import repeat
for _ in repeat(None, 200): # Runs the loop 200 times
...
这将在微基准测试中比for _ in range(200):
运行得更快,但如果循环体执行有意义的工作,那么它就是存储桶中的一个下降。与为循环迭代乘以一些匿名序列不同,repeat
只有一个简单的设置成本,没有内存开销取决于长度。
答案 4 :(得分:3)
虽然我完全同意德尔南的答案,但这并非不可能:
loop = range(NUM_ITERATIONS+1)
while loop.pop():
do_stuff()
但请注意,这不适用于任意列表:如果列表中的第一个值(弹出的最后一个值)未计算为False
,则将获得另一个迭代和异常下一遍:IndexError: pop from empty list
。此外,您的列表(loop
)在循环后将为空。
只是出于好奇心的缘故。 ;)
答案 5 :(得分:1)
很抱歉,但为了迭代任何语言,包括Python和英语,必须存储索引。是变量与否。找到一种方法来模糊python在内部跟踪for循环的事实并不会改变它的事实。我建议保持原样。
答案 6 :(得分:1)
这将打印'你好' 3次没有存储i
...
[print('hello') for i in range(3)]
答案 7 :(得分:1)
你可以简单地做到 打印2 *'你好'
答案 8 :(得分:0)
for word in ['hello'] * 2:
print word
这不是惯用的Python,但也不是你想要做的。
答案 9 :(得分:-1)
事实证明,使用dummy *(起始单词为dummy)作为变量与_具有相同的技巧。但是你不要搞乱已定义的,有时候使用的变量或函数。