惯用语:'时间'循环

时间:2010-04-17 03:09:14

标签: python loops idioms

说我有一个函数foo,我想要n次。在Ruby中,我会写:

n.times { foo }

在Python中,我可以写:

for _ in xrange(n): foo()

但这似乎是一种做事的hacky方式。

我的问题:在Python中有这种惯用方法吗?

4 个答案:

答案 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,它只是做得太多了。那篇论文是一本有用的读物​​,只是因为它让我们不那么理所当然地认为我们很容易做到。所以也许更好的问题是“为什么你需要一个执行任意次数的循环?”