Instruction conditionnelle dans une ligne lambda fonction en python?
Excuses si cela a déjà été posées, mais je ne pouvais pas le voir partout.
Essentiellement, je suis venu à travers un scénario où j'ai besoin de faire usage d'une instruction if à l'intérieur d'une fonction lambda. Ce qui le rend difficile est que, idéalement, il doit être sur une seule ligne de code (si c'est encore possible?)
Normalement, je voudrais écrire ceci:
T = 250
if (T > 200):
rate = 200*exp(-T)
else:
rate = 400*exp(-T)
return (rate)
Cependant j'ai besoin qu'elle ressemble à ceci:
rate = lambda(T) : if (T>200): return(200*exp(-T)); else: return(400*exp(-T))
Je me rends compte que le plus facile chose à faire serait de prendre la décision prise à l'extérieur de la lambda fonctions, et ensuite avoir une fonction lambda pour chaque cas, mais ce n'est pas vraiment approprié ici. Les lambda fonctions sont stockées dans un tableau et accessible lorsque cela est nécessaire, avec chaque élément du tableau correspondant à un "taux" de sorte d'avoir deux lignes séparées pour le même "taux" serait gâcher les choses. Toute aide serait grandement appréciée, ou si ce n'est pas possible, la confirmation des autres serait sympa 🙂
- Je doute carré que vous avez besoin d'une ligne, d'une fonction lambda, parce que je doute que vous avez besoin d'une ligne de fonction, et je doute que vous avez besoin d'une fonction lambda, par opposition à un nom de fonction. Quel est le point de l'utilisation d'un
lambda
si vous êtes immédiatement allez donner votre fonction, le nom derate
de toute manière? - Dommage que je ne peux +1 DSM fois... Mais pour faire clair: plus la chose à faire est de ne pas "prendre la décision prise à l'extérieur de la lambda fonctions", mais simplement de les définir comme des fonctions classiques en premier lieu. Vous pouvez stocker des fonctions classiques dans un tableau. Il n'y a rien de spécial à propos de lambdas; ils sont des fonctions plus limitées, pas de fonctions plus puissantes.
- Bien la fonction nécessaire pour tenir dans une seule ligne, je ne pense pas que vous pourriez le faire avec une fonction nommée? Aussi ces fonctions sont stockées comme des chaînes de caractères qui sont ensuite évaluées à l'aide de "eval" dont je n'étais pas sûr de la façon de le faire avec des fonctions classiques.
- Tout d'abord, pourquoi est-il nécessaire de tenir dans une seule ligne? Deuxièmement, pourquoi sont-ils stockés sous forme de chaînes, puis de les évaluer à l'aide de
eval
? Ceux sont tous les deux très mauvaises conditions. Je pense qu'il y est une XY problème ici, et si vous nous avez dit que vous étiez en train de faire, nous avons pu expliquer la bonne façon de le faire.
Vous devez vous connecter pour publier un commentaire.
Utiliser le
exp1 if cond else exp2
syntaxe.Remarque vous ne l'utilisez pas
return
dans les expressions lambda.La bonne façon de le faire est simple:
Il n'y a absolument aucun avantage à utiliser
lambda
ici. La seule choselambda
est bon pour vous permet de créer des fonctions anonymes et les utiliser dans une expression (par opposition à une déclaration). Si vous attribuer immédiatement leslambda
à une variable, il n'est plus anonyme, et il est utilisé dans une déclaration, de sorte que vous êtes juste faire de votre code moins lisible pour aucune raison.La
rate
fonction définie de cette manière peuvent être stockées dans un tableau, passé autour, appelé, etc. exactement de la même manière une fonction lambda pourrait. Ça va être exactement la même (sauf un peu plus facile à déboguer, l'introspection, etc.).À partir d'un commentaire:
Je ne peux pas imaginer une bonne raison pour laquelle la fonction aurait jamais besoin pour tenir dans une seule ligne. Mais bien sûr, vous pouvez le faire avec une fonction nommée. Essayez ceci dans votre interprète:
De nouveau, alors qu'il est difficile d'être sûr à 100% sans la moindre idée de pourquoi pourquoi vous ne le faites pas, je suis au moins sûr à 99% que vous n'avez aucune raison ou une mauvaise raison pour cela. Presque chaque fois que vous pensez que vous voulez passer de fonctions Python autour comme des chaînes de caractères et appel
eval
de sorte que vous pouvez les utiliser, vous avez juste envie de passer de fonctions Python autour comme des fonctions et de les utiliser comme des fonctions.Mais à tout hasard que c'est vraiment ce que vous avez besoin ici: il suffit d'utiliser
exec
au lieu deeval
.Vous n'avez pas parlé de la version de Python que vous utilisez. En 3.x, le
exec
fonction a exactement la même signature que leeval
fonction:En 2.7,
exec
est un état, pas une fonction, mais vous pouvez toujours écrire dans la même syntaxe que dans le 3.x (tant que vous n'essayez pas de les affecter la valeur de retour pour rien) et cela fonctionne.Au plus tôt 2.x (avant 2.6, je pense?) vous devez le faire comme ceci à la place:
Oui, vous pouvez utiliser le raccourci syntaxe pour
if
consolidés.Notez que vous n'utilisez pas explicite
return
étatslambda
s soit.rate = lambda(t): (200 if t > 200 else 400) * exp(-t)
J'ai trouvé que je POUVAIS utiliser "si-alors" déclarations dans un lambda. Par exemple:
Par le temps de vous dire
rate = lambda whatever...
vous avez vaincu le point de lambda et devrait il suffit de définir une fonction. Mais, si vous voulez un lambda, vous pouvez utiliser 'et' et 'ou'