나는 파이썬을 사용하여 퍼즐을 풀고 있으며 내가 풀고있는 퍼즐에 따라 특별한 규칙 세트를 사용해야 할 것입니다. 파이썬의 다른 함수에 함수를 어떻게 전달할 수 있습니까?
예
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
답변
함수와 모든 인수를 함수에 전달하는 경우 :
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
.
답변
다음과 같이 전달하십시오.
Game(list_a, list_b, Rule1)
그러면 Game 함수는 다음과 같이 보일 수 있습니다 (여전히 의사 코드).
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...