Я решаю головоломку с помощью 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)
.
python
function
first-class-functions
jchanger
источник
источник
myfunction
:myfunction
означает саму функцию,myfunction()
означает вызвать функцию и вместо этого получить ее возвращаемое значение.Рассматривайте функцию как переменную в своей программе, чтобы вы могли легко передавать их другим функциям:
def test (): print "test was invoked" def invoker(func): func() invoker(test) # prints test was invoked
источник
invoker
функции затем потребуется предоставить эти аргументы при вызове функции.Для передачи как функции, так и любых аргументов функции:
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
.источник
Просто передайте это, например:
и тогда ваша игровая функция может выглядеть примерно так (все еще псевдокодом):
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...
источник