Функция 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.
Надеюсь, это поможет!