可以不用标签来实现以下功能吗?
如果你只是想要做某件事情N次,而不需要迭代器。
for i in range(some_number):
# do something
如果你只是想要做某件事情N次,而不需要迭代器。
for i in range(some_number):
# do something
就我所知,没有。
我认为你最好做的是这样:
def loop(f,n):
for i in xrange(n): f()
loop(lambda: <insert expression here>, 5)
但我认为你可以接受多余的 i
变量。
这里有一个使用 _
变量的选项,实际上,它只是另一个变量。
for _ in range(n):
do_something()
请注意,_
在Python交互式会话中被赋值为最后一个返回的结果:
>>> 1+2
3
>>> _
3
因此,我不会以这种方式使用它。我不知道Ryan提到的任何习语。它可能会搞砸你的解释器。
>>> for _ in xrange(10): pass
...
>>> _
9
>>> 1+2
3
>>> _
9
根据Python语法,这是一个可以接受的变量名:
identifier ::= (letter|"_") (letter | digit | "_")*
你可能正在寻找
for _ in itertools.repeat(None, times): ...
这是在Python中迭代times
次的最快方法。
给不需要使用的变量赋值时,通常使用下划线 _
命名。
for _ in range(times):
do_stuff()
大家建议你使用 _,但没有说的是 _ 经常用作 gettext 函数的快捷方式。因此,如果您希望您的软件在多种语言中可用,则最好避免将其用于其他目的。
import gettext
gettext.bindtextdomain('myapplication', '/path/to/my/language/directory')
gettext.textdomain('myapplication')
_ = gettext.gettext
# ...
print _('This is a translatable string.')
_
看起来像是一个糟糕的想法,我不介意与之发生冲突。 - KeithWM__nonzero__
这样具有副作用的方法是一个可怕的想法。 - ThiefMaster__call__
代替。写while x():
并不那么困难。 - Jasmijncollections.Counter
是一种东西,并且创建一个同名的类会冒着维护者混淆的风险(尽管这已经存在这个风险)。 - ShadowRanger您可以使用“_11”(或任何数字或其他无效标识符)来避免与gettext发生名称冲突。每当您使用下划线+无效标识符时,您将获得一个虚拟名称,可用于for循环。
i = 100
while i:
print i
i-=1
def loop(N, doSomething):
if not N:
return
print doSomething(N)
loop(N-1, doSomething)
loop(100, lambda a:a)
sys.getrecursionlimit()
的值附近(在CPython上默认为低四位数字范围内); 使用sys.setrecursionlimit
可以提高限制,但最终你会达到C堆栈限制,解释器将因堆栈溢出而死亡(不仅会引发漂亮的 RuntimeError
/ RecursionError
)。 - ShadowRangerdef my_loop(start,n,step = 1):
while start < n:
yield start
start += step
for x in my_loop(0,15):
print(x)
我基本上同意以上提出的解决方案,即:
for
循环中使用下划线(2 行或更多)while
计数器(3 行或更多)__nonzero__
方法(更多行)如果要像#3中那样定义一个对象,我建议实现 with 关键字 的协议或应用 contextlib。
此外,我提出了另一种解决方案。它只有 3 行代码,虽然不是最优雅的,但使用了 itertools 包,因此可能会引起兴趣。
from itertools import (chain, repeat)
times = chain(repeat(True, 2), repeat(False))
while next(times):
print 'do stuff!'
现在你有一个不必要的列表,而不是一个不必要的计数器。 最好的解决方案是使用以“_”开头的变量,这告诉语法检查器你知道自己没有使用该变量。
x = range(5)
while x:
x.pop()
print "Work!"