¿La función Python como un argumento de función?

116

¿Puede una función de Python ser un argumento de otra función?

Decir:

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

Entonces, estas son básicamente dos preguntas:

  1. ¿Está permitido en absoluto?
  2. Y si es así, ¿cómo uso la función dentro de la otra función? ¿Necesitaría usar exec (), eval () o algo así? Nunca necesité meterme con ellos.

Por cierto, extraArgs es una lista / tupla de los argumentos de otra función.

a7664
fuente

Respuestas:

138

¿Puede una función de Python ser un argumento de otra función?

Si.

def myfunc(anotherfunc, extraArgs):
    anotherfunc(*extraArgs)

Para ser más específico ... con varios argumentos ...

>>> 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
>>>
Manuel Salvadores
fuente
¿ExtraArgs también puede ser una función? si es así, ¿cómo se llama?
Aysennoussi
@sekai Sí, extraArgs también puede ser una función.
Manuel Salvadores
3
donde esta documentado?
4dc0
32

Aquí hay otra manera de usar *args(y también opcionalmente), **kwargs:

def a(x, y):
  print x, y

def b(other, function, *args, **kwargs):
  function(*args, **kwargs)
  print other

b('world', a, 'hello', 'dude')

Salida

hello dude
world

Tenga en cuenta que function, *args, **kwargstiene que ser en ese orden y tienen que ser los últimos argumentos de la función de llamar a la función.

sabujp
fuente
3
Puede encontrar más información sobre * args y ** kwargs aquí pythontips.com/2013/08/04/args-and-kwargs-in-python-explained
Pipo
16

Las funciones en Python son objetos de primera clase. Pero la definición de su función está un poco fuera de lugar .

def myfunc(anotherfunc, extraArgs, extraKwArgs):
  return anotherfunc(*extraArgs, **extraKwArgs)
Ignacio Vázquez-Abrams
fuente
4

Claro, es por eso que Python implementa los siguientes métodos donde el primer parámetro es una función:

  • map (función, iterable, ...): aplica la función a cada elemento de iterable y devuelve una lista de los resultados.
  • filter (función, iterable): construye una lista a partir de aquellos elementos de iterable para los que la función devuelve verdadero.
  • reduce (función, iterable [, inicializador]): aplica la función de dos argumentos de forma acumulativa a los elementos de iterable, de izquierda a derecha, para reducir el iterable a un solo valor.
  • lambdas
Artsiom Rudzenka
fuente
2
  1. Sí, está permitido.
  2. Utiliza la función como lo haría con cualquier otra: anotherfunc(*extraArgs)
sepp2k
fuente
2
  1. Si. Al incluir la llamada a la función en sus argumentos de entrada, puede llamar a dos (o más) funciones a la vez.

Por ejemplo:

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

Cuando llamas a myfunc, haces esto:

myfunc(anotherfunc(inputarg1, inputarg2))

Esto imprimirá el valor de retorno de anotherfunc.

¡Espero que esto ayude!

Arial
fuente
2

Función dentro de la función: también podemos usar la función como parámetro.

En otras palabras, podemos decir que una salida de una función también es una referencia para un objeto, vea a continuación cómo la salida de la función interna hace referencia a la función externa como a continuación.

def out_func(a):

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

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

el resultado será .. 14

Espero que esto ayude.

Temizzi
fuente
1
def x(a):
    print(a)
    return a

def y(a):
    return a

y(x(1))
Richard Hayman-Joyce
fuente
2
Considere agregar alguna explicación a su respuesta.
HMD
No está pasando la función como un argumento aquí, sino el valor de retorno.
Bob Bobster
1
def x(a):
    print(a)
    return a

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

y(x, 1)

Eso creo que sería una muestra más adecuada. Ahora, lo que me pregunto es si hay una forma de codificar la función para usar dentro del envío de argumentos a otra función. Creo que hay en C ++, pero en Python no estoy seguro.

Boris Epstein
fuente
1

Los decoradores son muy poderosos en Python ya que permiten a los programadores pasar funciones como argumento y también pueden definir funciones dentro de otra función.

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

Salida

  • Esta es la función interna antes de la ejecución.
  • Soy función de argumento
Usman Gani
fuente