惯用语:'时间'循环

per*_*iae 47 python loops idioms

说我有一个foo我想要打电话的功能n.在Ruby中,我会写:

n.times { foo }
Run Code Online (Sandbox Code Playgroud)

在Python中,我可以写:

for _ in xrange(n): foo()
Run Code Online (Sandbox Code Playgroud)

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

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

TM.*_*TM. 43

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

for _ in range(n): # or xrange if you are on 2.X
    foo()
Run Code Online (Sandbox Code Playgroud)

不确定这是什么"hackish".如果您有更具体的用例,请提供更多详细信息,并且可能有更适合您正在做的事情.

  • 我只觉得它是hackish,因为它产生了我用_惯例扔掉的范围值.由于某种原因,我似乎在回避. (2认同)
  • 范围是不是低效,因为它使用n个字节的内存用于计数器,而C for循环只使用一个字节用于计数器? (2认同)

Car*_*ers 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
Run Code Online (Sandbox Code Playgroud)

现在将@repeatable装饰器添加到您需要times方法的任何方法:

@repeatable
def foo(bar):
    print bar

foo.times(4, "baz") #outputs 4 lines of "baz"
Run Code Online (Sandbox Code Playgroud)


Ale*_*lli 16

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

import itertools

for _ in itertools.repeat(None, n):
    foo()
Run Code Online (Sandbox Code Playgroud)

  • 这并没有摆脱未使用的变量. (5认同)
  • 我计算了几种方法,而itertools比xrange快约50%.不过,我不会说它更清洁. (5认同)
  • @ dan04,**什么**"未使用的变量" - **_**?! PUH-Leahze - !) (3认同)

msw*_*msw 9

问题预先假定调用foo()n次是一个先验必要的事情.来自哪里?它是可迭代的长度吗?然后迭代迭代.当我拿起Python时,我发现我使用的很少,没有任意值; 当你成为一个整数时,你的n背后有一些更为突出的意义.

今天早些时候,我遇到了尼克劳斯·沃斯(Nicklaus Wirth)为IEEE计算机提出的题为" 好主意 - 通过镜子"(未来读者的存档版本)的挑衅性论文.在第4节中,他对编程结构提出了不同的倾向,即每个人(包括他自己)都认为这是理所当然的,但这些结构具有表达缺陷:

"Algol for 声明的一般性应该是向所有未来设计师发出警告信号,始终牢记构造的主要目的,并且厌倦了夸张的普遍性和复杂性,这可能很容易变得适得其反."

algol for相当于C/Java for,它只是做得太多了.那篇论文是一本有用的读物​​,只是因为它让我们不那么理所当然地认为我们很容易做到.所以也许更好的问题是"为什么你需要一个执行任意次数的循环?"

  • 我同意这种观点,但我不知道这是如何回答这个问题的...... (8认同)
  • 你是对的,很少有需要的情况.但是有一些.在我的情况下,我需要在读取数据之前通过文件跳过一定数量的行.此外,基准测试代码往往需要任意数量的运行.影响某些全球状态的事情(如IO操作)是最常见的罪魁祸首. (5认同)