web-dev-qa-db-ja.com

慣用的なPython: 'times'ループ

たとえば、foo関数をn回呼び出したいとしましょう。 Rubyでは、次のように記述します。

n.times { foo }

Pythonでは、次のように書くことができます。

for _ in xrange(n): foo()

しかし、それは物事を行うためのハッキーな方法のようです。

私の質問:Pythonでこれを行う慣用的な方法はありますか?

47
perimosocordiae

質問では、foo()n回の呼び出しがアプリオリ必要なものであると想定しています。 nはどこから来たのですか?反復可能なものの長さですか?次に、反復可能オブジェクトを反復します。 Pythonを選択しているときに、任意の値をほとんどまたはまったく使用していないことがわかりました。整数になると失われたnの背後には、より顕著な意味があります。

今日、私はIEEE Computerというタイトルの Good Ideas-Through the Glass (アーカイブされた version 今後の読者向け)。セクション4では、すべての人(自分自身を含む)が当たり前と見なしているが、表現上の欠陥を抱えているプログラミング構文に別の傾斜をもたらしています。

「ALGOLのforステートメントの一般性は、構造の主な目的を常に念頭に置き、誇張された一般性と複雑さにうんざりしているため、将来のすべての設計者にとって警告信号であるはずです。生産的。」

ALGOL forはC/Java forと同等ですが、機能が多すぎます。その論文は、私たちがすぐに行うほど当然とは思わないためだけに役立つ読み物です。したがって、おそらくより良い質問は、「なぜ任意の回数実行するループが必要なのか」ということです。

8
msw

あなたはすでに慣用的な方法を示しました:

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

これについて何が「ハック」なのかわからない。より具体的なユースケースを考えている場合は、詳細をお知らせください。そうしているのにより適したものがあるかもしれません。

42
TM.

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"
17
Carson Myers

最速で最もクリーンなのは itertools.repeat

import itertools

for _ in itertools.repeat(None, n):
    foo()
16
Alex Martelli