55

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 回呼び出されることになっています。repeatの代わりに「テスト」を渡すことなくこれを達成する方法はありfooますか?

4

3 に答える 3

79

次のいずれかを使用できます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)

この最後のスタイルは、標準ライブラリと主要な Python ツールで非常に一般的です。*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。)

于 2012-12-08T23:56:54.533 に答える
19

foo のパラメーターを繰り返し関数に渡す必要があります。

#! /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)
于 2012-12-09T00:00:32.800 に答える
1

ここでの回答の多くは適切ですが、不要な繰り返しが発生しないため、これは役立つ可能性があります。そもそもコールバックの理由は、多くの場合、メイン 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)
于 2018-01-08T13:13:48.267 に答える