Функция Python как аргумент функции? - PullRequest
99 голосов
/ 09 июня 2011

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

Скажи:

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

Так что это в основном два вопроса:

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

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

Ответы [ 10 ]

121 голосов
/ 09 июня 2011

Может ли функция 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
>>>
32 голосов
/ 17 сентября 2015

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

16 голосов
/ 09 июня 2011

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

def myfunc(anotherfunc, extraArgs, extraKwArgs):
  return anotherfunc(*extraArgs, **extraKwArgs)
4 голосов
/ 09 июня 2011

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

  • map (function, iterable, ...) - применять функцию к каждому элементу итерируемого и возвращаемого значениясписок результатов.
  • фильтр (функция, итеративная) - Построить список из тех элементов итерируемой, для которых функция возвращает true.
  • Reduce (функция, итерируемая [, инициализатор]) - Кумулятивно применить функцию из двух аргументов.к элементам итерируемого слева направо, чтобы свести итерируемое к одному значению.
  • лямбда
2 голосов
/ 17 мая 2014
  1. Да.Включив вызов функции в свои входные аргументы, вы можете вызывать две (или более) функции одновременно.

Например:

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

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

myfunc(anotherfunc(inputarg1, inputarg2))

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

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

2 голосов
/ 09 июня 2011
  1. Да, это разрешено.
  2. Вы используете функцию так же, как и любую другую: anotherfunc(*extraArgs)
1 голос
/ 08 февраля 2019

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

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

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 голос
/ 26 июля 2018
def x(a):
    print(a)
    return a

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

y(x, 1)

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

1 голос
/ 29 апреля 2018
def x(a):
    print(a)
    return a

def y(a):
    return a

y(x(1))
0 голосов
/ 16 октября 2018
def rotatedimention(l,m=[]):
    p=input("please enter a number to rotate the dimention:")
    for i in l:
        if i==l[int(p)]:
            break
        else:
            m.append(i)

    for j in m:
        l.remove(j)
    return l+m
rotatedimention([121,21,41412,3412124,223424,2324114])
...