Python-関数を別の関数に渡す


92

私はpythonを使用してパズルを解いています。解くパズルによっては、特別なルールセットを使用する必要があります。Pythonで関数を別の関数に渡すにはどうすればよいですか?

def Game(listA, listB, rules):
   if rules == True:
      do...
   else:
      do...

def Rule1(v):
  if "variable_name1" in v:
      return False
  elif "variable_name2" in v:
      return False
  else:
      return True

def Rule2(v):
  if "variable_name3" and "variable_name4" in v:
      return False
  elif "variable_name4" and variable_name1 in v:
      return False
  else:
      return True

これは、単に擬似コード、したがって、特定のではありませんが、私はコンパイルするコードを取得するが、私は、関数を呼び出す方法を知っておく必要がありGame、それが正しくルールので、定義されたのかどうかは、どちらかに切り替えられますRule1(v)Rule2(v)

回答:


148

他のパラメーターと同じように渡すだけです。

def a(x):
    return "a(%s)" % (x,)

def b(f,x):
    return f(x)

print b(a,10)

43
関数はPythonの第一級オブジェクトです。それらを渡したり、dictやリストなどに含めたりできます。関数名の後には括弧を含めないでください。例myfunction:名前が付けられた関数の場合:myfunctionは関数自体をmyfunction()意味し、代わりに関数を呼び出してその戻り値を取得することを意味します。
nosklo 2009

1
また、関数がオブジェクトのメソッドであり、そのオブジェクトのプロパティを使用して機能する場合はどうなりますか?
CpILL

2
渡す関数にさまざまな数の入力引数がある場合はどうなりますか?次に、キーワード引数を使用する必要がありますか?
H. Vabri 2017年

2つの関数が別々のpythonファイルにある場合はどうなりますか?
エイドリアンヒメネス

24

関数をプログラムの変数として扱い、他の関数に簡単に渡すことができるようにします。

def test ():
   print "test was invoked"

def invoker(func):
   func()

invoker(test)  # prints test was invoked

はい。上記の例では、invoker関数は関数を呼び出すときにこれらの引数を提供する必要があります。
codeape、2014年

15

関数と関数への引数の両方を渡す場合:

from typing import Callable    

def looper(fn: Callable, n:int, *args, **kwargs):
    """
    Call a function `n` times

    Parameters
    ----------
    fn: Callable
        Function to be called.
    n: int
        Number of times to call `func`.
    *args
        Positional arguments to be passed to `func`.
    **kwargs
        Keyword arguments to be passed to `func`.

    Example
    -------
    >>> def foo(a:Union[float, int], b:Union[float, int]):
    ...    '''The function to pass'''
    ...    print(a+b)
    >>> looper(foo, 3, 2, b=4)
    6
    6
    6       
    """
    for i in range(n):
        fn(*args, **kwargs)

何をしているのかによっては、を定義しdecoratorたり、おそらくを使用したりすることが理にかなっていますfunctools.partial


9

次のように渡してください:

Game(list_a, list_b, Rule1)

その後、ゲーム関数は次のようになります(まだ擬似コードです)。

def Game(listA, listB, rules=None):
    if rules:
        # do something useful
        # ...
        result = rules(variable) # this is how you can call your rule
    else:
        # do something useful without rules

9

括弧を削除すると、関数名を変数名にすることができます(したがって、引数として渡すことができます)。括弧を追加することにより、変数名を関数名にすることができます。

あなたの例ではrules、括弧と引数の言及を省いて、変数を関数の1つと同等にします。次に、game()関数rules( v )内で、括弧とvパラメーターを指定して呼び出します。

if puzzle == type1:
    rules = Rule1
else:
    rules = Rule2

def Game(listA, listB, rules):
    if rules( v ) == True:
        do...
    else:
        do...
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.