512 Stimmen

Gibt es eine Möglichkeit, "if" in Pythons Lambda auszuführen?

Python 2.6 möchte ich tun:

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

Das ist eindeutig nicht die Syntax. Ist es möglich, eine if en lambda und wenn ja, wie kann man das tun?

3 Stimmen

In einem Lambda kann man nicht drucken oder erhöhen. Lambdas sind nur Funktionen, Sie können stattdessen immer eine Funktion verwenden.

11 Stimmen

Ich bin anderer Meinung als Sie. Ich brauche 4 verschiedene, sehr kurze Funktionen wie die oben genannten, die in eine Liste/Wörterbuch gesetzt werden müssen, so dass ich über sie iterieren kann und auswählen, welche in jeder Iteration zu verwenden. Anstelle von vielen Zeilen Code von nur inits, vor der Iteration, selbst kann ich es auf nur 4 Zeilen von Init-Code zu bringen. Je weniger, desto besser

6 Stimmen

4 Zeilen Code sind keine lobenswerte Lösung, wenn andere Leute den Code lesen, interpretieren, verstehen und pflegen müssen. Außerdem zeigt das "print/raise"-Problem in dem Beispiel, dass dies in Lambdas nicht möglich ist und auch nicht sein sollte.

890voto

Robert Rossney Punkte 91100

Die Syntax, nach der Sie suchen:

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

Aber Sie können nicht verwenden print o raise in einem Lambda.

48voto

SilentGhost Punkte 285785

Warum definieren Sie nicht einfach eine Funktion?

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

Es gibt wirklich keine Rechtfertigung für die Verwendung von Lambda in diesem Fall.

43voto

jimifiki Punkte 5142

Wahrscheinlich die schlechteste Python-Zeile, die ich bisher geschrieben habe:

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

Wenn x == 2 ist, wird gedruckt,

wenn x != 2 ist, erhöhen Sie.

28voto

Glenn Maynard Punkte 53282

Sie können leicht eine Ausnahme in einem Lambda auslösen, wenn Sie das wirklich tun wollen.

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

Ist das eine gute Idee? Mein Instinkt im Allgemeinen ist es, die Fehlerberichterstattung aus Lambdas zu verlassen; lassen Sie es einen Wert von None haben und den Fehler im Aufrufer zu erhöhen. Ich glaube nicht, dass dies inhärent böse ist, obwohl--ich halte die "y wenn x sonst z"-Syntax selbst schlechter--stellen Sie einfach sicher, dass Sie nicht versuchen, zu viel in einen Lambda-Körper zu stopfen.

21voto

filotn Punkte 496

Hinweis: Sie können mehrere sonst...wenn Anweisungen in Ihrer Lambda-Definition:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X