Est-il possible de passer des fonctions avec des arguments à une autre fonction en Python?
Dites quelque chose comme:
def perform(function):
return function()
Mais les fonctions à passer auront des arguments comme:
action1()
action2(p)
action3(p,r)
def action1(arg1, arg2=None, arg3=None)
comment pourriez-vous passer un argument que vous avez l'intention d'être affecté à arg3, par exemple?perform
etaction1
,action2
sur différents fichiers? @ S.LottVoici à quoi sert lambda:
la source
Vous pouvez utiliser la fonction partielle de functools comme ça.
Fonctionne également avec les mots clés
la source
functools.partial
est également plus polyvalent si vous avezperform
besoin de transmettre d'autres paramètres àf
. Par exemple, on pourrait appelerperform(partial(Action3, p))
etperform(f)
faire quelque chose commef("this is parameter r")
.Utilisez functools.partial, pas lambdas! Et ofc Perform est une fonction inutile, vous pouvez passer directement les fonctions.
la source
(des mois plus tard) un petit exemple réel où lambda est utile, non partiel:
disons que vous voulez diverses coupes transversales à 1 dimension à travers une fonction à 2 dimensions, comme des tranches à travers une rangée de collines.
quadf( x, f )
prend un 1-df
et l'appelle pour diversx
.Pour l'appeler pour les coupes verticales à y = -1 0 1 et les coupes horizontales à x = -1 0 1,
Pour autant que je sache, je ne
partial
peux pas faire ça -(Comment ajouter des balises numpy, partial, lambda à cela?)
la source
C'est ce qu'on appelle des fonctions partielles et il y a au moins 3 façons de le faire. Ma façon préférée utilise lambda car elle évite la dépendance à l'égard d'un paquet supplémentaire et est la moins verbeuse. Supposons que vous ayez une fonction
add(x, y)
et que vous souhaitiez passeradd(3, y)
à une autre fonction en tant que paramètre de sorte que l'autre fonction décide de la valeur poury
.Utilisez lambda
Créez votre propre emballage
Ici, vous devez créer une fonction qui renvoie la fonction partielle. C'est évidemment beaucoup plus verbeux.
Utiliser partiel à partir de functools
Ceci est presque identique à celui
lambda
montré ci-dessus. Alors pourquoi en avons-nous besoin? Il y a peu de raisons . En bref,partial
peut être un peu plus rapide dans certains cas (voir son implémentation ) et que vous pouvez l'utiliser pour une liaison anticipée vs une liaison tardive de lambda.la source
Voici une façon de le faire avec une fermeture:
la source