Python)を学習し始めたばかりで、関数を別の関数のパラメーターとして渡すことができることがわかりました。foo(bar())
を呼び出すと、関数ポインターとしては渡されませんfoo(bar)
を呼び出すと関数が渡されますが、この方法では追加の引数を渡すことができません。bar(42)
?
関数に渡した引数に関係なく、関数を繰り返す機能が必要です。
_def repeat(function, times):
for calls in range(times):
function()
def foo(s):
print s
repeat(foo("test"), 4)
_
この場合、関数foo("test")
は連続して4回呼び出されることになっています。 「test」をrepeat
の代わりにfoo
に渡すことなくこれを達成する方法はありますか?
lambda
を使用できます:
repeat(lambda: bar(42))
またはfunctools.partial
:
from functools import partial
repeat(partial(bar, 42))
または、引数を個別に渡します。
def repeat(times, f, *args):
for _ in range(times):
f(*args)
この最終的なスタイルは標準ライブラリおよびmajor Python tools。*args
は可変数の引数を示すため、この関数を
repeat(4, foo, "test")
または
def inquisition(weapon1, weapon2, weapon3):
print("Our weapons are {}, {} and {}".format(weapon1, weapon2, weapon3))
repeat(10, inquisition, "surprise", "fear", "ruthless efficiency")
便宜上、繰り返しの回数を前に付けていることに注意してください。 *args
コンストラクトを使用する場合、最後の引数にすることはできません。
(完全を期すために、**kwargs
でキーワード引数を追加することもできます。)
Fooのパラメーターをrepeat関数に渡す必要があります。
#! /usr/bin/python3.2
def repeat (function, params, times):
for calls in range (times):
function (*params)
def foo (a, b):
print ('{} are {}'.format (a, b) )
repeat (foo, ['roses', 'red'], 4)
repeat (foo, ['violets', 'blue'], 4)
ここでの答えの多くは良いですが、これは不必要な繰り返しを導入せず、最初のコールバックの理由は多くの場合、メインUIスレッド以外の他の作業と同期するためです。
楽しい!
import time, threading
def callMethodWithParamsAfterDelay(method=None, params=[], seconds=0.0):
return threading.Timer(seconds, method, params).start()
def cancelDelayedCall(timer):
timer.cancel()
# Example
def foo (a, b):
print ('{} are {}'.format (a, b) )
callMethodWithParametersAfterDelay(foo, ['roses', 'red'], 0)