関数の引数としてのPython関数?


116

Python関数を別の関数の引数にすることはできますか?

いう:

def myfunc(anotherfunc, extraArgs):
    # run anotherfunc and also pass the values from extraArgs to it
    pass

したがって、これは基本的に2つの質問です。

  1. 許可されますか?
  2. そうである場合、他の関数内で関数をどのように使用しますか?exec()、eval()などを使用する必要がありますか?それらを台無しにする必要はありませんでした。

ところで、extraArgsは別のfuncの引数のリスト/タプルです。


回答:


138

Python関数を別の関数の引数にすることはできますか?

はい。

def myfunc(anotherfunc, extraArgs):
    anotherfunc(*extraArgs)

より具体的に...さまざまな引数を付けて...

>>> def x(a,b):
...     print "param 1 %s param 2 %s"%(a,b)
...
>>> def y(z,t):
...     z(*t)
...
>>> y(x,("hello","manuel"))
param 1 hello param 2 manuel
>>>

extraArgsも関数にできますか?もしそうなら、あなたはそれをどのように呼びますか?
Aysennoussi 2015

@sekaiはい、extraArgsも関数にすることができます。
Manuel Salvadores

3
これはどこに文書化されていますか?
4dc0

32

これは*args(そしてオプションで)別の使い方です**kwargs

def a(x, y):
  print x, y

def b(other, function, *args, **kwargs):
  function(*args, **kwargs)
  print other

b('world', a, 'hello', 'dude')

出力

hello dude
world

ことを注意function*args**kwargsその順序であると関数を呼び出す関数の最後の引数であることを持っている必要があります。


3
* argsと** kwargsの詳細については、こちらをご覧
Pipo


4

確かに、それがpythonが次のメソッドを実装する理由です。最初のパラメーターは関数です。

  • map(function、iterable、...)-iterableのすべての項目に関数を適用し、結果のリストを返します。
  • filter(function、iterable)-関数がtrueを返すiterableの要素からリストを作成します。
  • reduce(function、iterable [、initializer])-2つの引数の関数を反復可能の項目に累積的に左から右に適用して、反復可能を単一の値に減らします。
  • ラムダ

2
  1. はい、許可されています。
  2. 他と同じように関数を使用します。 anotherfunc(*extraArgs)

2
  1. はい。入力引数に関数呼び出しを含めることで、2つ(またはそれ以上)の関数を同時に呼び出すことができます。

例えば:

def anotherfunc(inputarg1, inputarg2):
    pass
def myfunc(func = anotherfunc):
    print func

myfuncを呼び出すと、次のようになります。

myfunc(anotherfunc(inputarg1, inputarg2))

これは、anotherfuncの戻り値を出力します。

お役に立てれば!


2

関数内の関数:関数をパラメーターとして使用することもできます。

つまり、関数の出力はオブジェクトの参照でもあると言えます。以下のように、内部関数の出力が外部関数をどのように参照しているかを以下に示します。

def out_func(a):

  def in_func(b):
       print(a + b + b + 3)
  return in_func

obj = out_func(1)
print(obj(5))

結果は.. 14

お役に立てれば。



1
def x(a):
    print(a)
    return a

def y(func_to_run, a):
    return func_to_run(a)

y(x, 1)

より適切なサンプルだと思います。ここで、別の関数への引数の送信で使用する関数をコード化する方法があるかどうか疑問に思います。C ++にはあると思いますが、Pythonではわかりません。


1

プログラマが関数を引数として渡し、別の関数内で関数を定義できるため、Pythonではデコレータが非常に強力です。

def decorator(func):
      def insideFunction():
        print("This is inside function before execution")
        func()
      return insideFunction

def func():
    print("I am argument function")

func_obj = decorator(func) 
func_obj()

出力

  • これは実行前の関数内です
  • 私は引数関数です
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.