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


116

Чи може функція Python бути аргументом іншої функції?

Сказати:

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

Отже, це в основному два питання:

  1. Це взагалі дозволено?
  2. І якщо це так, то як я можу використовувати функцію всередині іншої функції? Чи потрібно мені використовувати exec (), eval () чи щось подібне? Ніколи не потрібно було возитися з ними.

BTW, extraArgs - це список / кортеж аргументів іншогоfunc.


Відповіді:


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 також бути функцією? якщо так, як це називати?
Айсенноусси

@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
Більше інформації про * Арге & ** kwargs можна знайти тут pythontips.com/2013/08/04/args-and-kwargs-in-python-explained
PIPO


4

Звичайно, саме тому python реалізує такі методи, коли перший параметр є функцією:

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

2
  1. Так, це дозволено.
  2. Ви використовуєте функцію, як і будь-який інший: anotherfunc(*extraArgs)

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

Наприклад:

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

Коли ви телефонуєте myfunc, ви робите це:

myfunc(anotherfunc(inputarg1, inputarg2))

Це надрукує повернене значення іншого функціоналу.

Сподіваюся, це допомагає!


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