Est-il possible d'effectuer « si » en python lambda
-
22-09-2019 - |
Question
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
Ceci est clairement pas la syntaxe. Est-il possible d'effectuer une if
dans lambda
et si oui, comment le faire?
Merci
La solution
La syntaxe que vous cherchez:
lambda x: True if x % 2 == 0 else False
Mais vous ne pouvez pas utiliser print
ou raise
dans un lambda.
Autres conseils
pourquoi ne pas définir simplement une fonction?
def f(x):
if x == 2:
print(x)
else:
raise ValueError
il n'y a vraiment aucune raison d'utiliser lambda dans ce cas.
Vous pouvez facilement soulever 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 l'erreur de déclaration sur lambdas; laissez-il une valeur de None et augmenter l'erreur dans l'appelant. Je ne pense pas que ce soit un mal en soi, même si - je considère le « y si x autre z » syntaxe se pire -. Assurez-vous de n'essayez pas de trop de choses dans un corps lambda
Probablement la pire ligne de python j'ai écrit jusqu'à présent:
f = lambda x: sys.stdout.write(["2\n",][2*(x==2)-2])
Si x == 2 impression,
si x! = 2 que vous soulevez.
lambdas en Python sont assez restrictives en ce qui concerne ce que vous êtes autorisé à utiliser. Plus précisément, vous ne pouvez pas avoir des mots-clés (sauf pour les opérateurs comme and
, not
, or
, etc.) dans leur corps.
Alors, il n'y a aucun moyen que vous pouvez utiliser un lambda pour votre exemple (parce que vous ne pouvez pas utiliser raise
), mais si vous êtes prêt à concéder ce ... Vous pouvez utiliser:
f = lambda x: x == 2 and x or None
Notez que vous pouvez utiliser plusieurs d'autre ... si déclarations contenues dans votre définition lambda:
f = lambda x: 1 if x>0 else 0 if x ==0 else -1
Si vous voulez continuer à imprimer, vous pouvez importer futur module
from __future__ import print_function
f = lambda x: print(x) if x%2 == 0 else False
ce que vous avez besoin est exactement
def fun():
raise Exception()
f = lambda x:print x if x==2 else fun()
appeler la fonction de la façon dont vous avez besoin
f(2)
f(3)
Cet extrait devrait vous aider:
x = lambda age: 'Older' if age > 30 else 'Younger'
print(x(40))
exemple de code fonctionne pour moi. Je ne sais pas si elle est directement liée à cette question, mais elle pourra être utile dans d'autres cas.
a = ''.join(map(lambda x: str(x*2) if x%2==0 else "", range(10)))
Essayez:
is_even = lambda x: True if x % 2 == 0 else False
print(is_even(10))
print(is_even(11))
Out:
True
False