web-dev-qa-db-ja.com

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

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)のいずれかにルールが切り替えられるため、正しく定義されているかどうかを知る必要があります。

他のパラメーターと同様に渡します。

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

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

print b(a,10)
131
John Millikin

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

def test ():
   print "test was invoked"

def invoker(func):
   func()

invoker(test)  # prints test was invoked
21
Piotr Czapla

一般化されたアプローチ

関数と関数へのパラメーターの両方を渡すために(たとえば、異なる関数に同じ反復ルーチンを使用する)、次の(python2.x)の例を検討してください。

def test(a, b):
    '''The function to pass'''
    print a+b

def looper(func, **kwargs):
    '''A basic iteration function'''
    for i in range(5):
        # Our passed function with passed parameters
        func(*Tuple(value for _, value in kwargs.iteritems()))

if __== '__main__':
    # This will print `3` five times
    looper(test, a=1, b=2)

説明

  • Tuple( i for i in (1, 2, 3))は、リスト、設定、Tuple ...の項目からTupleを作成するTupleジェネレーターです。この場合、**kwargsからの値
  • Tuple()の前にある*はその内容を解凍し、渡された関数にパラメーターとして効果的に渡します
  • ジェネレーターの_は、keyの単なるプレースホルダーです。これを使用していないためです

For python3.x

  • print a+bの代わりにprint(a+b)
  • kwargs.items()の代わりにkwargs.iteritems()
10
ryanjdillon

次のように渡すだけです:

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
8
Ian Clelland

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

この例では、変数rulesを関数の1つと同等にし、括弧と引数の説明を省略します。次に、game()関数で、括弧とvパラメーターを使用してrules( v )を呼び出します。

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

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