惯用的Python:“时间”循环

这个问题已经在这里有了答案:

  • 是否可以在没有迭代器变量的情况下为范围循环实现Python? 15个答案

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

n.times { foo }

在Python中,我可以这样写:

for _ in xrange(n): foo()

但是,这似乎是一种不明智的做法。

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

perimosocordiae asked 2020-06-29T23:41:38Z
4个解决方案
42 votes

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

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

不知道这是什么“ hackish”。 如果您打算使用更具体的用例,请提供更多详细信息,并且可能有更适合您正在做的事情。

TM. answered 2020-06-29T23:42:32Z
17 votes

如果要使用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"
Carson Myers answered 2020-06-29T23:42:56Z
16 votes

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

import itertools

for _ in itertools.repeat(None, n):
    foo()
Alex Martelli answered 2020-06-29T23:43:16Z
8 votes

该问题预先假设n次调用foo()是先验必要的事情。 n是哪里人? 它是可重复的东西的长度吗? 然后遍历可迭代对象。 在选择Python时,我发现我使用的是很少甚至没有的任意值。 在您的n后面有一些更明显的含义,当它变成整数时迷失了。

今天早些时候,我碰到了尼克劳斯·沃思(Nicklaus Wirth)在IEEE计算机上的题为《好主意-通过窥镜》(供未来读者使用的存档版本)的挑衅性论文。 在第4节中,他对编程结构提出了不同的偏见,每个人(包括他本人)都认为这是理所当然的,但是它们具有表达上的缺陷:

“ Algol的普遍性for 声明应该是一个警告 向所有未来的设计师发出信号 始终保持 构想并厌倦 夸大的一般性和复杂性, 可能很容易成为 适得其反。”

algol for等效于C / Java 29450122265220884884,只是做得太多。 那篇论文是有用的读物,仅仅是因为它使人们不以为然,所以我们很容易做到。 因此,也许更好的问题是:“为什么需要执行任意次数的循环?”

msw answered 2020-06-29T23:42:07Z
translate from https://stackoverflow.com:/questions/2657068/idiomatic-python-times-loop