¿Es posible pasar funciones con argumentos a otra función en Python?
Di algo como:
def perform(function):
return function()
Pero las funciones que se pasarán tendrán argumentos como:
action1()
action2(p)
action3(p,r)
¿Quieres decir esto?
def perform( fun, *args ):
fun( *args )
def action1( args ):
something
def action2( args ):
something
perform( action1 )
perform( action2, p )
perform( action3, p, r )
def action1(arg1, arg2=None, arg3=None)
¿cómo podría pasar un argumento que pretende asignar a arg3, por ejemplo?perform
yaction1
,action2
en diferentes archivos? @ S. LottPara esto está lambda:
fuente
Puede usar la función parcial de functools de esta manera.
También funciona con palabras clave
fuente
functools.partial
también es más versátil siperform
necesita entregar más parámetrosf
. Por ejemplo, uno podría llamarperform(partial(Action3, p))
yperform(f)
hacer algo asíf("this is parameter r")
.¡Usa functools.partial, no lambdas! Y ofc Perform es una función inútil, puede pasar funciones directamente.
fuente
(meses después) un pequeño ejemplo real donde lambda es útil, parcial no:
digamos que desea varias secciones transversales unidimensionales a través de una función bidimensional, como cortes en una fila de colinas.
quadf( x, f )
toma un 1-df
y lo llama por variosx
.Para llamarlo para cortes verticales en y = -1 0 1 y cortes horizontales en x = -1 0 1,
Que yo sepa,
partial
no puedo hacer esto.(¿Cómo agregar etiquetas numpy, parcial, lambda a esto?)
fuente
Esto se llama funciones parciales y hay al menos 3 formas de hacerlo. Mi forma favorita es usar lambda porque evita la dependencia de un paquete adicional y es el menos detallado. Suponga que tiene una función
add(x, y)
y desea pasaradd(3, y)
a otra función como parámetro de manera que la otra función decida el valory
.Utilizar lambda
Crea tu propio envoltorio
Aquí debe crear una función que devuelva la función parcial. Obviamente, esto es mucho más detallado.
Usar parcial de functools
Esto es casi idéntico al que se
lambda
muestra arriba. Entonces, ¿por qué necesitamos esto? Hay algunas razones . En resumen,partial
puede ser un poco más rápido en algunos casos (vea su implementación ) y que puede usarlo para la unión temprana vs la unión tardía de lambda.fuente
Aquí hay una manera de hacerlo con un cierre:
fuente