迭代一定次数而不将迭代次数存储在任何地方

Bor*_*jaX 44 python loops range

我想知道是否可以在不将循环迭代次数存储在任何地方的情况下执行一定数量的操作.

例如,假设我想将两条"hello"消息打印到控制台.现在我知道我能做到:

for i in range(2):
    print "hello"
Run Code Online (Sandbox Code Playgroud)

但随后的i变量是要采取的价值观01(我并不真的需要).有没有办法实现同样的事情而不将这些不需要的值存储在任何地方?

小智 46

未使用的变量的成语(由很多其他语言共享)是单个下划线_.代码分析器通常不会抱怨_未使用,程序员会立即知道它是一个快捷方式i_dont_care_wtf_you_put_here.没有项目变量就没有办法进行迭代 - 正如Python的禅宗所说的那样,"特殊情况不足以打破规则".

  • 我不明白为什么像AutoHotkey这样的东西`循环,5 {...`(简单地重复一次动作5次)在其他任何地方都不存在.不需要变量,提供更好的可读性. (2认同)

rec*_*ive 15

exec 'print "hello";' * 2
Run Code Online (Sandbox Code Playgroud)

应该工作,但我有点惭愧,我想到了它.

更新: 想到另一个:

for _ in " "*10: print "hello"
Run Code Online (Sandbox Code Playgroud)

  • +1 表示您的诚实 ;-) (2认同)

Tho*_*ner 12

好吧,我认为你在问题中提供的forloop和它一样好,但我想指出,必须分配的未使用的变量可以分配给名为的变量_,一个"丢弃"值的约定分配.虽然_引用将保留您给出的值,但代码链接和其他开发人员将理解您没有使用该引用.所以这是一个例子:

for _ in range(2):
    print('Hello')
Run Code Online (Sandbox Code Playgroud)


Wal*_*ter 5

虽然我完全同意delnan的回答,但这也不是不可能:

loop = range(NUM_ITERATIONS+1)
while loop.pop():
    do_stuff()
Run Code Online (Sandbox Code Playgroud)

但请注意,这不适用于任意列表:如果列表中的第一个值(最后弹出的值)的计算结果不为False,则您将在下一次迭代中得到另一次迭代和异常:IndexError: pop from empty listloop另外,循环后列表 ( ) 将为空。

只是出于好奇心。;)


Sha*_*ger 5

其他人则解决了无法完全避免循环中的迭代变量的问题for,但是有一些选择可以减少工作量。range毕竟必须产生一大堆数字,这需要进行少量工作。如果您想避免这种情况,可以itertools.repeat反复使用相同(忽略)的值,而无需创建/检索不同的对象:

from itertools import repeat

for _ in repeat(None, 200):  # Runs the loop 200 times
    ...
Run Code Online (Sandbox Code Playgroud)

在微基准测试中for _ in range(200):,此方法的运行速度比快,但如果循环主体进行了有意义的工作,那将是杯水车薪。与为循环可乘循环增加一些匿名序列不同,repeat它的建立成本很小,并且没有依赖于长度的内存开销。