2011-06-09 13 views
64

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

Di:

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

Así que esto es básicamente dos preguntas:

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

BTW, extraArgs es una lista/tupla de los argumentos de otrafunc.

+0

Relacionados: https://stackoverflow.com/questions/47502068/is-there-a-formal-name-for-a-function-that-accepts-a-functions-as-an-argument/47634215#47634215 – alseether

Respuesta

73

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

Sí.

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

Para ser más específicos ... 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 
>>> 
+0

¿Puede extraArgs ser una función también? si es así, ¿cómo lo llamas? – Sekai

+0

@sekai Sí, extraArgs también puede ser una función. –

+0

debe pasar como y (z, * t) – sabujp

2
  1. Sí, está permitido.
  2. se utiliza la función como lo haría cualquier otro: anotherfunc(*extraArgs)
15

funciones en Python son objetos de primera clase. Pero su definición de función is a bit off.

def myfunc(anotherfunc, extraArgs, extraKwArgs): 
    return anotherfunc(*extraArgs, **extraKwArgs) 
3

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

  • mapa (función, iterable, ...) - Aplicar la función de cada elemento de iterable y devuelve una lista de los resultados.
  • filter (function, iterable) - Construya una lista a partir de los elementos de iterable para los que la función devuelve true.
  • reducir (función, iterable [, inicializador]) - Aplicar la función de dos argumentos acumulativamente a los elementos de iterable, de izquierda a derecha, para reducir el valor iterable a un único valor.
  • lambdas
2
  1. Sí. Al incluir la llamada de 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 se llama a myfunc, esto se hace:

myfunc(anotherfunc(inputarg1, inputarg2)) 

Esto imprimirá el valor de retorno de anotherfunc.

Espero que esto ayude!

19

Todos los ejemplos anteriores dan como resultado TypeErrors a menos que su definición de la función de llamar a la otra función utiliza *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, **kwargs tienen que estar en ese orden y tienen que ser los últimos argumentos de la función que llama a la función.

+0

Más información sobre * args & ** kwargs se pueden encontrar aquí https://pythontips.com/2013/08/04/args-and-kwargs-in-python-explained/ –

Cuestiones relacionadas