说我有一个函数foo
,我想要n
次。在Ruby中,我会写:
n.times { foo }
在Python中,我可以写:
for _ in xrange(n): foo()
但这似乎是一种做事的hacky方式。
我的问题:在Python中有这种惯用方法吗?
答案 0 :(得分:42)
你已经展示了惯用的方式:
for _ in range(n): # or xrange if you are on 2.X
foo()
不确定这是什么“hackish”。如果您有更具体的用例,请提供更多详细信息,并且可能有更适合您正在做的事情。
答案 1 :(得分:17)
如果您需要times
方法,并且需要在自己的函数中使用它,请尝试以下方法:
def times(self, n, *args, **kwargs):
for _ in range(n):
self.__call__(*args, **kwargs)
import new
def repeatable(func):
func.times = new.instancemethod(times, func, func.__class__)
return func
现在为您需要@repeatable
方法的任何方法添加times
装饰器:
@repeatable
def foo(bar):
print bar
foo.times(4, "baz") #outputs 4 lines of "baz"
答案 2 :(得分:16)
最快,最干净的是itertools.repeat:
import itertools
for _ in itertools.repeat(None, n):
foo()
答案 3 :(得分:7)
问题预先假设调用foo() n 次是先验必要的事情。来自哪里?它是可迭代的长度吗?然后迭代迭代。当我拿起Python时,我发现我使用的很少,没有任意值;你的 n 背后有一些更为突出的含义,当它变成一个整数时会丢失。
今天早些时候,我遇到了尼克劳斯·沃斯(Nicklaus Wirth)为 IEEE计算机撰写的题为Good Ideas - Through the Looking Glass的挑衅性论文(未来读者存档version)。在第4节中,他对编程结构提出了不同的倾向,即每个人(包括他自己)都认为这是理所当然但存在表达缺陷:
“Algol的
for
的普遍性 声明应该是一个警告 向所有未来的设计师发出信号 始终保持一个主要目的 记住,并且厌倦了 夸张的普遍性和复杂性, 这很容易变成 反效果“。
algol for
相当于C / Java for
,它只是做得太多了。那篇论文是一本有用的读物,只是因为它让我们不那么理所当然地认为我们很容易做到。所以也许更好的问题是“为什么你需要一个执行任意次数的循环?”