2009-10-18 11 views
189

In Python 2.6, was ich tun möchte auszuführen:Gibt es eine Möglichkeit "wenn" in Python Lambda

f = lambda x: if x==2 print x else raise Exception() 
f(2) #should print "2" 
f(3) #should throw an exception 

dies eindeutig nicht die Syntax ist. Ist es möglich, eine if in lambda durchzuführen und wenn ja, wie?

dank

+1

importieren Sie können nicht drucken oder erhöhen in einem Lambda. Lambdas sind nur Funktionen, Sie können stattdessen immer eine Funktion verwenden. –

+10

Ich stimme dir nicht zu. Ich brauche 4 verschiedene, sehr kurze Funktionen wie die obige, die in eine Liste/ein Wörterbuch eingefügt werden müssen, damit ich sie über iterieren und auswählen kann, welche in jeder Iteration verwendet werden sollen. Statt vieler Codezeilen von nur wenigen Bits vor der Iteration selbst kann ich sie auf nur 4 Zeilen Init-Code reduzieren. Je weniger desto besser. – Guy

+5

4 Zeilen Code ist keine lobenswerte Lösung, wenn andere den Code lesen, interpretieren, verstehen und pflegen müssen.Ferner zeigt das "Drucken/Anheben" -Problem in dem Beispiel dies, was nicht in Lambdas gemacht werden kann und sollte. –

Antwort

398

Die Syntax Sie suchen:

lambda x: True if x % 2 == 0 else False 

Aber man kann nicht print oder raise in einem Lambda verwenden.

+21

in Python 3, können Sie drucken – recursive

+37

f = Lambda x: x% 2 == 0 würde auch funktionieren. – unutbu

+8

Sicher, aber die Frage war "Wie benutze ich' if' in einem Lambda? " nicht "Was ist der beste Weg, um ein Lambda zu schreiben, das True zurückgibt, wenn eine Zahl gerade ist?" –

13

Lambdas in Python sind ziemlich restriktiv im Hinblick auf das, was Sie verwenden erlaubt sind. Insbesondere können Sie keine Schlüsselwörter (außer Operatoren wie and, not, or usw.) in ihrem Körper haben.

Also, es gibt keine Möglichkeit, ein Lambda für Ihr Beispiel verwenden könnte (weil Sie nicht raise verwenden können), aber wenn Sie bereit sind, auf dass zuzugestehen ... könnten Sie:

f = lambda x: x == 2 and x or None 
+9

Lambda's spezifische Einschränkung ist, dass Sie keine Anweisungen, nur Ausdrücke verwenden dürfen. –

29

warum Definieren Sie nicht einfach eine Funktion?

def f(x): 
    if x == 2: 
     print(x) 
    else: 
     raise ValueError 

gibt es wirklich keine Rechtfertigung, Lambda in diesem Fall zu verwenden.

+3

'print' ist in 2.6 noch keine Funktion. :) –

+6

@ Lukáš Lalinský: es funktioniert immer noch in 2.x. Es wird als ein Paar redundanter Klammern behandelt. – newacct

+17

Sie kennen seinen tatsächlichen Anwendungsfall nicht, also können Sie auf keinen Fall sagen, dass es keinen Grund gibt, ein Lambda zu verwenden. –

19

Sie können leicht eine Ausnahme in einem Lambda auslösen, wenn dies das ist, was Sie wirklich tun möchten.

def Raise(exception): 
    raise exception 
x = lambda y: 1 if y < 2 else Raise(ValueError("invalid value")) 

Ist das eine gute Idee? Mein Instinkt besteht im Allgemeinen darin, die Fehlerberichterstattung aus lambdas herauszulassen; Lass es einen Wert von None haben und erhöhe den Fehler im Caller. Ich denke nicht, dass dies von Natur aus böse ist - ich betrachte die "y if x else z" -Syntax selbst als schlimmer - stelle nur sicher, dass du nicht versuchst, zu viel in einen Lambda-Körper zu stopfen.

+1

Es in einem Anrufer zu erhöhen, ist wahrscheinlich die schönere Methode, wenn Sie mich fragen. –

+0

Möglicherweise, aber es hängt stark vom Einzelfall ab. Natürlich können Sie das Lambda nach dem Erstellen auch dekorieren. 'x = RaiseValueErrorOnNone (x)', wiederum abhängig vom Fall. –

21

Wahrscheinlich die schlechteste Python Linie, die ich bisher geschrieben habe:

f = lambda x: sys.stdout.write(["2\n",][2*(x==2)-2]) 

Wenn x == 2 drucken Sie,

wenn x = 2 Sie heben!.

3

beachten Sie mehrere verwenden können, sonst ... wenn Anweisungen in Ihrer Lambda-Definition:

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

Wenn Sie noch drucken möchten, können Sie zukünftige Modul

from __future__ import print_function 

f = lambda x: print(x) if x%2 == 0 else False 
Verwandte Themen