web-dev-qa-db-fra.com

Y a-t-il un moyen de jouer "si" en python lambda

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

268
Guy

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.

523
Robert Rossney

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.

35
SilentGhost

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. 

21
jimifiki

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.

19
Glenn Maynard

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
14
David Wolever

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
8
filotn

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
2
Juan Pablo Lopez

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))
1
Adarsh Somasundar

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

1
Victor Lucas

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
0
Benyamin Jafari

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)))
0
Rahul Raj