Python - передача функции в другую функцию


95

Я решаю головоломку с помощью 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).

Ответы:


151

Просто передайте его, как любой другой параметр:

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

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

print b(a,10)

44
функции - это первоклассные объекты в Python. вы можете передавать их, включать в dicts, списки и т. д. Просто не включайте скобки после имени функции. Например, для функции с именем myfunction: myfunctionозначает саму функцию, myfunction()означает вызвать функцию и вместо этого получить ее возвращаемое значение.
nosklo

1
А что, если функция является методом объекта и использует свойство этого объекта для выполнения своей работы?
CpILL

2
Что, если передаваемые мной функции имеют разное количество входных аргументов? Должен ли я тогда использовать аргументы ключевого слова?
Х. Вабри

Что делать, если две функции находятся в разных файлах Python?
Адриан Хименес

25

Рассматривайте функцию как переменную в своей программе, чтобы вы могли легко передавать их другим функциям:

def test ():
   print "test was invoked"

def invoker(func):
   func()

invoker(test)  # prints test was invoked

Да. В приведенном выше примере invokerфункции затем потребуется предоставить эти аргументы при вызове функции.
codeape

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)

и тогда ваша игровая функция может выглядеть примерно так (все еще псевдокодом):

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...
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.