[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


답변

함수와 모든 인수를 함수에 전달하는 경우 :

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...


답변