Python-함수를 다른 함수로 전달


94

나는 파이썬을 사용하여 퍼즐을 풀고 있으며 내가 풀고있는 퍼즐에 따라 특별한 규칙 세트를 사용해야 할 것입니다. 파이썬의 다른 함수에 함수를 어떻게 전달할 수 있습니까?

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

답변:


151

다른 매개 변수처럼 전달하면됩니다.

def a(x):
    return "a(%s)" % (x,)

def b(f,x):
    return f(x)

print b(a,10)

44
함수는 파이썬에서 일류 객체입니다. 당신은 그것들을 넘겨주고, 딕셔너리, 목록 등에 포함시킬 수 있습니다. 함수 이름 뒤에 괄호를 포함하지 마십시오. 예를 들어 myfunction: 라는 함수의 myfunction경우 함수 자체를 myfunction()의미하고 대신 함수를 호출하고 반환 값을 가져 오는 것을 의미합니다.
nosklo

1
함수가 객체에 대한 메서드이고 해당 객체의 속성을 사용하여 작업을 수행하면 어떻게 될까요?
CpILL

2
전달하는 함수에 다양한 수의 입력 인수가 있으면 어떻게합니까? 그런 다음 키워드 인수를 사용해야합니까?
H. Vabri 2017

두 함수가 별도의 파이썬 파일에 있으면 어떻게됩니까?
Adrian Jimenez

25

프로그램에서 함수를 변수로 취급하여 다른 함수에 쉽게 전달할 수 있습니다.

def test ():
   print "test was invoked"

def invoker(func):
   func()

invoker(test)  # prints test was invoked

예. 위의 예에서 invoker함수는 함수를 호출 할 때 해당 인수를 제공해야합니다.
codeape 2014-01-17

15

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

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.


9

다음과 같이 전달하십시오.

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

9

함수 이름은 괄호를 제거하여 변수 이름이 될 수 있습니다 (따라서 인수로 전달됨). 변수 이름은 괄호를 추가하여 함수 이름이 될 수 있습니다.

귀하의 예에서 변수 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...
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.