2009-10-18 9 views
189

En python 2.6, je veux faire:Y at-il un moyen d'effectuer « si » dans le lambda de python

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 un if dans lambda et si oui comment le faire?

grâce

+1

Vous ne pouvez pas imprimer ou élever dans un lambda. Les Lambdas ne sont que des fonctions, vous pouvez toujours utiliser une fonction à la place. –

+10

Je ne suis pas d'accord avec vous. J'ai besoin de 4 fonctions différentes, très courtes comme celle ci-dessus, qui doivent être mises dans une liste/un dictionnaire pour pouvoir les parcourir et sélectionner celles qui seront utilisées dans chaque itération. Au lieu de nombreuses lignes de code de juste inits, avant l'itération, je peux l'abaisser à seulement 4 lignes de code init. Moins on est de fous. – Guy

+5

4 lignes de code ne sont pas une solution louable quand d'autres personnes doivent lire, interpréter, comprendre et maintenir le code.En outre, le problème "print/raise" dans l'exemple montre ce qui ne peut pas et ne devrait pas être fait dans lambdas. –

Répondre

398

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.

+21

en python 3, vous pouvez utiliser l'impression – recursive

+37

f = lambda x: x% 2 == 0 fonctionnerait également. – unutbu

+8

Bien sûr, mais la question était "comment puis-je utiliser" si "dans un lambda?" pas "quelle est la meilleure façon d'écrire un lambda qui renvoie Vrai si un nombre est pair?" –

13

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 de mots-clés (sauf pour les opérateurs comme and, not, or, etc) dans leur corps.

Donc, 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 
+9

La restriction spécifique de lambda est que vous n'êtes pas autorisé à utiliser des instructions, seulement des expressions. –

29

pourquoi vous ne définissez 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.

+3

'print' n'est pas encore une fonction dans 2.6. :) –

+6

@ Lukáš Lalinský: ça marche toujours dans 2.x. il sera traité comme une paire de parenthèses redondantes – newacct

+17

Vous ne connaissez pas son cas d'utilisation réel, donc vous ne pouvez pas dire qu'il n'y a aucune raison d'utiliser un lambda. –

19

Vous pouvez facilement déclencher 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 le rapport d'erreur hors de lambdas; laissez-lui une valeur de None et augmentez l'erreur dans l'appelant. Cependant, je ne pense pas que ce soit intrinsèquement mauvais - je considère la syntaxe «y if x else z» comme pire - assurez-vous simplement que vous n'essayez pas de trop inserer dans un corps lambda.

+1

L'élever dans un appelant est probablement la méthode la plus jolie si vous me demandez. –

+0

Peut-être, mais cela dépend fortement du cas particulier. Bien sûr, vous pouvez également décorer le lambda après l'avoir créé. 'x = RaiseValueErrorOnNone (x)', encore une fois, selon le cas. –

21

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 vous soulevez!.

3

note que vous pouvez utiliser plusieurs autre ... si déclarations contenues dans votre définition lambda:

f = lambda x: 1 if x>0 else 0 if x ==0 else -1 
2

Si vous voulez toujours imprimer vous pouvez importer le module futur

from __future__ import print_function 

f = lambda x: print(x) if x%2 == 0 else False 
Questions connexes