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)
関数をプログラム内の変数として扱い、他の関数に簡単に渡すことができるようにします。
def test ():
print "test was invoked"
def invoker(func):
func()
invoker(test) # prints test was invoked
一般化されたアプローチ
関数と関数へのパラメーターの両方を渡すために(たとえば、異なる関数に同じ反復ルーチンを使用する)、次の(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()
次のように渡すだけです:
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
関数名は、括弧を削除することで変数名になります(したがって、引数として渡すことができます)。括弧を追加することにより、変数名を関数名にできます。
この例では、変数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...