习惯Python:“时代”循环

假设我有一个函数foo ,我想调用n次。 在Ruby中,我会写:

 n.times { foo } 

在Python中,我可以写:

 for _ in xrange(n): foo() 

但是,这似乎是一个做事的黑客办法。

我的问题:在Python中是否有这种习惯用法?

这个问题预先假设调用foo() n次是先验必要的事情。 n从哪里来? 它是可迭代的东西的长度吗? 然后遍历迭代。 当我拿起Python的时候,我发现我使用的是很less或没有任何的值。 当你的n变成一个整数的时候,有一些更突出的含义丢失了。

今天早些时候,我遇到了尼克劳斯·维斯(Nicklaus Wirth)为IEEE计算机发起的挑衅性文章,题为“ 好想法 – 透过镜子” (未来读者的存档版本 )。 在第4节中,他给编程结构带来了不同的倾向,每个人(包括他自己)都认为这是理所当然的,但是存在着明显的缺陷:

“Algol for声明的普遍性应该是对所有未来devise师的一个警告信号,以始终保持一个构想的主要目的,并且厌倦夸张的普遍性和复杂性,这可能容易产生相反的效果。

algol for相当于C / Java for ,它只是做了太多。 那篇文章是一个有用的阅读材料,只是因为它使得我们不那么理所当然地去做。 所以也许更好的问题是“为什么你需要一个执行任意次数的循环?”

你已经显示了惯用的方式:

 for _ in range(n): # or xrange if you are on 2.X foo() 

不知道这是什么“黑客”。 如果你有一个更具体的用例,请提供更多的细节,并可能有更适合你在做什么的东西。

最快,最干净的是itertools.repeat :

 import itertools for _ in itertools.repeat(None, n): foo() 

如果你想要的times方法,你需要使用它在你自己的function,试试这个:

 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"