Функция Python как аргумент функции?

Может ли функция Python быть аргументом другой функции?

Скажи:

def myfunc(anotherfunc, extraArgs):
    # run anotherfunc and also pass the values from extraArgs to it
    pass

Итак, это в основном два вопроса:

  • Разрешено ли вообще?
  • И если это так, как я могу использовать функцию внутри другой функции? Должен ли я использовать exec(), eval() или что-то в этом роде? Никогда не нужно было возиться с ними.

BTW, extraArgs - это список/кортеж аргументов anotherfunc.

Ответ 1

Может ли функция Python быть аргументом другой функции?

Да.

def myfunc(anotherfunc, extraArgs):
    anotherfunc(*extraArgs)

Более конкретно... с различными аргументами...

>>> def x(a,b):
...     print "param 1 %s param 2 %s"%(a,b)
...
>>> def y(z,t):
...     z(*t)
...
>>> y(x,("hello","manuel"))
param 1 hello param 2 manuel
>>>

Ответ 2

Все приведенные выше примеры приводят к TypeErrors, если ваш def для функции, вызывающей другую функцию, использует *args (а также необязательно), **kwargs:

def a(x, y):
  print x, y

def b(other, function, *args, **kwargs):
  function(*args, **kwargs)
  print other

b('world', a, 'hello', 'dude')

Выход

hello dude
world

Обратите внимание, что function, *args, **kwargs должны быть в этом порядке и должны быть последними аргументами функции, вызывающей функцию.

Ответ 3

Функции в Python - это объекты первого класса. Но ваше определение функции немного выключено.

def myfunc(anotherfunc, extraArgs, extraKwArgs):
  return anotherfunc(*extraArgs, **extraKwArgs)

Ответ 4

Конечно, поэтому python реализует следующие методы, где первый параметр является функцией:

  • map (function, iterable,...) - применить функцию к каждому элементу итерабельного и верните список результатов.
  • filter (function, iterable) - создать список из этих элементов итерации, для которой функция возвращает true.
  • уменьшить (функция, итерация [, инициализатор]) - применить функцию два аргумента кумулятивно относятся к пунктам итерации, слева направо справа, чтобы уменьшить значение итерации до одного значения.
  • lambdas

Ответ 5

  • Да, это разрешено.
  • Вы используете эту функцию, как и любой другой: anotherfunc(*extraArgs)

Ответ 6

  • Да. Включив вызов функции в свой входной аргумент /s, вы можете одновременно вызвать две (или более) функции.

Например:

def anotherfunc(inputarg1, inputarg2):
    pass
def myfunc(func = anotherfunc):
    print func

Когда вы вызываете myfunc, вы делаете это:

myfunc(anotherfunc(inputarg1, inputarg2))

Это будет напечатать возвращаемое значение anotherfunc.

Надеюсь, это поможет!