Ответ 1
Просто передайте его, как и любой другой параметр:
def a(x):
return "a(%s)" % (x,)
def b(f,x):
return f(x)
print b(a,10)
Я решаю головоломку с использованием 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
Просто передайте его, например:
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
к одной из ваших функций, оставляя круглые скобки и упоминание аргумента. Затем в вашей функции game()
вызовите rules( v )
с круглыми скобками и параметром v
.
if puzzle == type1:
rules = Rule1
else:
rules = Rule2
def Game(listA, listB, rules):
if rules( v ) == True:
do...
else:
do...
Обобщенный подход
Для передачи как функции, так и параметров функции (например, с использованием той же итерационной процедуры для разных функций) рассмотрим следующий пример (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 __name__ == '__main__':
# This will print `3` five times
looper(test, a=1, b=2)
Некоторое объяснение
tuple( i for i in (1, 2, 3))
является генератором кортежей, создающим кортеж из элементов в списке, наборе, кортеже... в нашем случае значения из **kwargs
*
перед tuple()
будет распаковывать его содержимое, эффективно передавая их в качестве параметров переданной функции_
в генераторе - это просто место для key
, так как мы не используем это Для python3.x
:
print(a+b)
вместо print a+b
kwargs.items()
вместо kwargs.iteritems()