Pythonで関数を2回以上連続して呼び出す簡単な方法はありますか?例えば:
do()
do()
do()
多分次のように:
3*do()
Pythonで関数を2回以上連続して呼び出す簡単な方法はありますか?例えば:
do()
do()
do()
多分次のように:
3*do()
私は...するだろう:
for _ in range(3):
do()
これ_
は、値を気にしない変数の規則です。
また、次のように書いている人もいるかもしれません。
[do() for _ in range(3)]
do()
ただし、 (の場合でも)の各呼び出しの戻り値を含むリストを作成し、None
結果のリストを破棄するため、少しコストがかかります。戻り値のリストを使用していない限り、これを使用することはお勧めしません。
渡された関数をN回繰り返す関数を定義できます。
def repeat_fun(times, f):
for i in range(times): f()
さらに柔軟にしたい場合は、繰り返される関数に引数を渡すこともできます。
def repeat_fun(times, f, *args):
for i in range(times): f(*args)
使用法:
>>> def do():
... print 'Doing'
...
>>> def say(s):
... print s
...
>>> repeat_fun(3, do)
Doing
Doing
Doing
>>> repeat_fun(4, say, 'Hello!')
Hello!
Hello!
Hello!
Hello!
そうするためのさらに3つの方法:
(I)使用map
することもオプションだと思いますが、None
場合によってはsを使用して追加のリストを生成する必要があり、常に引数のリストが必要です。
def do():
print 'hello world'
l=map(lambda x: do(), range(10))
(II)itertools
他の関数を反復処理するために使用できる関数が含まれていますhttps://docs.python.org/2/library/itertools.html
(III)関数のリストの使用については、これまで言及されていなかったと思います(実際、構文は最初に説明したものに最も近いです):
it=[do]*10
[f() for f in it]
またはワンライナーとして:
[f() for f in [do]*10]
単純なforループ?
for i in range(3):
do()
または、結果に興味があり、結果を収集したい場合は、1ライナーになるというボーナスがあります。
vals = [do() for _ in range(3)]
私の2セント:
from itertools import repeat
list(repeat(f(), x)) # for pure f
[f() for f in repeat(f, x)] # for impure f
for
これは、ループを使用したり、中間関数やラムダ関数を定義したりする必要のないアプローチです(これもワンライナーです)。この方法は、次の2つのアイデアを組み合わせたものです。
オプションのセンチネル引数を使用してiter()
組み込み関数を呼び出す、および
イテレータステップを進めるためのitertools
レシピを使用します(のレシピを参照)。n
consume()
これらをまとめると、次のようになります。
next(islice(iter(do, object()), 3, 3), None)
object()
(番兵として合格するという考えは、この受け入れられたStack Overflowの回答から来ています。)
そして、これがインタラクティブプロンプトからどのように見えるかです:
>>> def do():
... print("called")
...
>>> next(itertools.islice(iter(do, object()), 3, 3), None)
called
called
called
from itertools import repeat, starmap
results = list(starmap(do, repeat((), 3)))
itertoolsモジュールのrepeatfuncレシピを参照してください。これは、実際にははるかに強力です。メソッドを呼び出す必要があるが、戻り値を気にしない場合は、forループで使用できます。
for _ in starmap(do, repeat((), 3)): pass
しかし、それは醜くなっています。
以下に示すように、whileループを試すことができます。
def do1():
# Do something
def do2(x):
while x > 0:
do1()
x -= 1
do2(5)
したがって、do1関数を5回呼び出します。
itertools.repeat
withを使用して、関数のメソッドをN回operator.methodcaller
呼び出すことができます。これを行うジェネレーター関数の例を次に示します。__call__
from itertools import repeat
from operator import methodcaller
def call_n_times(function, n):
yield from map(methodcaller('__call__'), repeat(function, n))
使用例:
import random
from functools import partial
throw_dice = partial(random.randint, 1, 6)
result = call_n_times(throw_dice, 10)
print(list(result))
# [6, 3, 1, 2, 4, 6, 4, 1, 4, 6]