Dans python 2.6 , je veux faire:
f = lambda x: if x==2 print x else raise Exception()
f(2) #should print "2"
f(3) #should throw an exception
Ce n'est clairement pas la syntaxe. Est-il possible d'effectuer une if
dans lambda
et si oui comment le faire?
merci
La syntaxe que vous recherchez:
lambda x: True if x % 2 == 0 else False
Mais vous ne pouvez pas utiliser print
ou raise
dans un lambda.
pourquoi ne définissez-vous pas simplement une fonction?
def f(x):
if x == 2:
print(x)
else:
raise ValueError
il n'y a vraiment aucune justification pour utiliser lambda dans ce cas.
Probablement la pire ligne de python que j'ai écrite jusqu'à présent:
f = lambda x: sys.stdout.write(["2\n",][2*(x==2)-2])
Si x == 2 vous imprimez,
si x! = 2 vous relancez.
Vous pouvez facilement lever une exception dans un lambda, si c'est ce que vous voulez vraiment faire.
def Raise(exception):
raise exception
x = lambda y: 1 if y < 2 else Raise(ValueError("invalid value"))
Est-ce une bonne idée? Mon instinct en général est de laisser les erreurs rapportées en lambdas; laissez-le avoir une valeur de None et générez l'erreur dans l'appelant. Cependant, je ne pense pas que cela soit fondamentalement pervers - je considère que la syntaxe "y si x autre z" est pire en soi - assurez-vous simplement que vous n'essayez pas de trop intégrer un corps lambda.
Les Lambdas en Python sont assez restrictifs en ce qui concerne ce que vous êtes autorisé à utiliser. En particulier, vous ne pouvez pas avoir de mot-clé (à l'exception d'opérateurs comme and
, not
, or
, etc.) dans leur corps.
Donc, il n’est pas possible d’utiliser un lambda pour votre exemple (parce que vous ne pouvez pas utiliser raise
), mais si vous êtes prêt à concéder sur cela… Vous pouvez utiliser:
f = lambda x: x == 2 and x or None
notez que vous pouvez utiliser plusieurs sinon ... si dans votre définition de lambda:
f = lambda x: 1 if x>0 else 0 if x ==0 else -1
Si vous voulez toujours imprimer, vous pouvez importer un futur module
from __future__ import print_function
f = lambda x: print(x) if x%2 == 0 else False
ce dont vous avez besoin est exactement
def fun():
raise Exception()
f = lambda x:print x if x==2 else fun()
appelez maintenant la fonction comme vous le souhaitez
f(2)
f(3)
Cet extrait devrait vous aider à:
x = lambda age: 'Older' if age > 30 else 'Younger'
print(x(40))
Vous pouvez également utiliser les opérateurs logiques pour avoir quelque chose comme une conditionnelle
func = lambda element: (expression and DoSomething) or DoSomethingIfExpressionIsFalse
Vous pouvez en savoir plus sur les opérateurs logiques ici
Essayez le:
is_even = lambda x: True if x % 2 == 0 else False
print(is_even(10))
print(is_even(11))
En dehors:
True
False
Les exemples de code suivants fonctionnent pour moi. Je ne sais pas si cela concerne directement cette question, mais espérons que cela aidera dans d’autres cas.
a = ''.join(map(lambda x: str(x*2) if x%2==0 else "", range(10)))