Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

print b(a,10)

Ответ 2

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

def test ():
   print "test was invoked"

def invoker(func):
   func()

invoker(test)  # prints test was invoked

Ответ 3

Просто передайте его, например:

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

Ответ 4

Имя функции может стать именем переменной (и таким образом передаваться как аргумент), отбрасывая круглые скобки. Имя переменной может стать именем функции, добавив круглые скобки.

В вашем примере приравниваем переменную 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...

Ответ 5

Обобщенный подход

Для передачи как функции, так и параметров функции (например, с использованием той же итерационной процедуры для разных функций) рассмотрим следующий пример (python2.x):

def test(a, b):
    '''The function to pass'''
    print a+b

def looper(func, **kwargs):
    '''A basic iteration function'''
    for i in range(5):
        # Our passed function with passed parameters
        func(*tuple(value for _, value in kwargs.iteritems()))

if __name__ == '__main__':
    # This will print `3` five times
    looper(test, a=1, b=2)

Некоторое объяснение

  • tuple( i for i in (1, 2, 3)) является генератором кортежей, создающим кортеж из элементов в списке, наборе, кортеже... в нашем случае значения из **kwargs
  • * перед tuple() будет распаковывать его содержимое, эффективно передавая их в качестве параметров переданной функции
  • _ в генераторе - это просто место для key, так как мы не используем это

Для python3.x:

  • print(a+b) вместо print a+b
  • kwargs.items() вместо kwargs.iteritems()