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


116

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

Сказать:

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

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

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

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


Ответы:


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


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


4

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

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

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

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

Например:

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

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

myfunc(anotherfunc(inputarg1, inputarg2))

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

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


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

Вывод

  • Это внутренняя функция перед выполнением
  • Я функция аргумента
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.