web-dev-qa-db-ja.com

Python、関数ポインタパラメータに引数を渡す方法は?

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に渡すことなくこれを達成する方法はありますか?

39
Byzantian

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でキーワード引数を追加することもできます。)

60
Fred Foo

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)
17
Hyperboreus

ここでの答えの多くは良いですが、これは不必要な繰り返しを導入せず、最初のコールバックの理由は多くの場合、メイン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)
1
Peter Sichel