É possível passar funções com argumentos para outra função no Python?
Diga algo como:
def perform(function):
return function()
Mas as funções a serem passadas terão argumentos como:
action1()
action2(p)
action3(p,r)
Você quer dizer isso?
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)
como você poderia passar um argumento que pretende atribuir ao arg3, por exemplo?perform
eaction1
,action2
em diferentes arquivos? @ S.LottÉ para isso que serve o lambda:
fonte
Você pode usar a função parcial de functools dessa maneira.
Também funciona com palavras-chave
fonte
functools.partial
também é mais versátil seperform
precisar entregar outros parâmetros paraf
. Por exemplo, alguém poderia ligarperform(partial(Action3, p))
eperform(f)
fazer algo assimf("this is parameter r")
.Use functools.partial, não lambdas! E ofc Perform é uma função inútil, você pode repassar funções diretamente.
fonte
(meses depois), um pequeno exemplo real em que o lambda é útil, não parcial:
digamos que você queira várias seções transversais unidimensionais por meio de uma função bidimensional, como fatias por uma fileira de colinas.
quadf( x, f )
tira 1-df
e chama-o para váriosx
.Para chamá-lo para cortes verticais em y = -1 0 1 e cortes horizontais em x = -1 0 1,
Até onde eu sei,
partial
não posso fazer isso -(Como adicionar tags numpy, parcial, lambda a isso?)
fonte
Isso é chamado de funções parciais e há pelo menos três maneiras de fazer isso. Minha maneira favorita é usar o lambda porque evita a dependência de pacotes extras e é o menos detalhado. Suponha que você tenha uma função
add(x, y)
e deseja passaradd(3, y)
para outra função como parâmetro, de forma que a outra função decida o valor paray
.Use lambda
Crie seu próprio invólucro
Aqui você precisa criar uma função que retorne a função parcial. Isto é obviamente muito mais detalhado.
Use parcial de functools
Isso é quase idêntico ao
lambda
mostrado acima. Então, por que precisamos disso? Existem algumas razões . Em resumo,partial
pode ser um pouco mais rápido em alguns casos (consulte sua implementação ) e que você pode usá-lo para ligação antecipada versus ligação tardia do lambda.fonte
Aqui está uma maneira de fazer isso com um fechamento:
fonte