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

116

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

Сказать:

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

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

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

Кстати, extraArgs - это список / кортеж аргументов другой функции.

a7664
источник
По теме: stackoverflow.com/questions/47502068/…
alseether 04

Ответы:

138

Может ли функция 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
>>>
Мануэль Сальвадорес
источник
Может ли extraArgs быть функцией? если да, то как это назвать?
Aysennoussi
@sekai Да, extraArgs тоже может быть функцией.
Мануэль Сальвадорес
3
где это задокументировано?
4dc0
32

Вот еще один способ использования *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должны быть в таком порядке и должно быть последними аргументами функции вызывающей функции.

Sabujp
источник
3
Более подробную информацию о * args и ** kwargs можно найти здесь pythontips.com/2013/08/04/args-and-kwargs-in-python-explained
Pipo
16

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

def myfunc(anotherfunc, extraArgs, extraKwArgs):
  return anotherfunc(*extraArgs, **extraKwArgs)
Игнасио Васкес-Абрамс
источник
4

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

  • map (function, iterable, ...) - применить функцию к каждому элементу итерации и вернуть список результатов.
  • filter (function, iterable) - построить список из тех элементов итерации, для которых функция возвращает true.
  • reduce (function, iterable [, initializer]) - применить функцию двух аргументов кумулятивно к элементам итерации слева направо, чтобы уменьшить итерацию до единственного значения.
  • лямбды
Артем Рудзенко
источник
2
  1. Да, можно.
  2. Вы используете эту функцию так же, как и любую другую: anotherfunc(*extraArgs)
sepp2k
источник
2
  1. Да. Включив вызов функции в свой входной аргумент (ы), вы можете одновременно вызывать две (или более) функции.

Например:

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

Когда вы вызываете myfunc, вы делаете следующее:

myfunc(anotherfunc(inputarg1, inputarg2))

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

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

Arial
источник
2

Функция внутри функции: мы также можем использовать функцию как параметр ..

Другими словами, мы можем сказать, что вывод функции также является ссылкой на объект, см. Ниже, как вывод внутренней функции ссылается на внешнюю функцию, как показано ниже.

def out_func(a):

  def in_func(b):
       print(a + b + b + 3)
  return in_func

obj = out_func(1)
print(obj(5))

результат будет .. 14

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

Темиззи
источник
1
def x(a):
    print(a)
    return a

def y(a):
    return a

y(x(1))
Ричард Хейман-Джойс
источник
2
Пожалуйста, подумайте о добавлении некоторых пояснений к вашему ответу.
HMD
Здесь вы не передаете функцию в качестве аргумента, вместо этого возвращаемое значение.
Боб Бобстер,
1
def x(a):
    print(a)
    return a

def y(func_to_run, a):
    return func_to_run(a)

y(x, 1)

Думаю, это был бы более подходящий образец. Теперь меня интересует, есть ли способ закодировать функцию для использования в передаче аргументов другой функции. Я считаю, что это есть в C ++, но в Python я не уверен.

Борис Эпштейн
источник
1

Декораторы очень эффективны в Python, поскольку они позволяют программистам передавать функцию в качестве аргумента, а также могут определять функцию внутри другой функции.

def decorator(func):
      def insideFunction():
        print("This is inside function before execution")
        func()
      return insideFunction

def func():
    print("I am argument function")

func_obj = decorator(func) 
func_obj()

Вывод

  • Это внутренняя функция перед выполнением
  • Я функция аргумента
Усман Гани
источник