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


358

In Python 2.6 möchte ich Folgendes tun:

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

Dies ist eindeutig nicht die Syntax. Ist es möglich, ein ifIn durchzuführen lambdaund wenn ja, wie?

Vielen Dank


2
Sie können kein Lambda drucken oder erhöhen. Lambdas sind nur Funktionen, Sie können stattdessen immer eine Funktion verwenden.
Lennart Regebro

10
Ich stimme dir nicht zu. Ich benötige 4 verschiedene, sehr kurze Funktionen wie die oben genannte, die in eine Liste / ein Wörterbuch aufgenommen werden müssen, damit ich sie durchlaufen und auswählen kann, welche in jeder Iteration verwendet werden sollen. Anstelle vieler Codezeilen von nur inits kann ich es vor der Iteration selbst auf nur 4 Zeilen Init-Code reduzieren. Je weniger desto besser ..
Guy

5
4 Codezeilen sind keine lobenswerte Lösung, wenn andere Personen den Code lesen, interpretieren, verstehen und pflegen müssen. Ferner zeigt das "Drucken / Erhöhen" -Problem im Beispiel dies, was in Lambdas nicht durchgeführt werden kann und sollte.
S.Lott

@LennartRegebro Lambdas sind keine Funktionen in Python, sie sind nur Ausdrücke, deshalb gibt es viele Dinge, die Sie nicht mit ihnen machen können.
Aaron McMillin

1
@AaronMcMillin Lambdas sind Funktionen. Sie sind aus Syntaxgründen auf Ausdrücke beschränkt, aber sie sind Funktionen.
Lennart Regebro

Antworten:


660

Die Syntax, nach der Sie suchen:

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

Aber Sie können nicht printoder raisein einem Lambda verwenden.


33
In Python 3 können Sie print
rekursiv

11
Sicher, aber die Frage war: "Wie verwende ich ifein Lambda?" nicht "Was ist der beste Weg, um ein Lambda zu schreiben, das True zurückgibt, wenn eine Zahl gerade ist?"
Robert Rossney

99
Es ist eine schreckliche Syntax - leicht das schlechteste Python-Sprachkonstrukt, das sich in seiner Bewertung außerhalb der Reihenfolge den Absurditätsstufen von Perl nähert -, aber es wurde gefragt. Sie stimmen ernsthaft Antworten ab, um richtig zu sein?
Glenn Maynard

41
Es ist die richtige Antwort auf die Frage "Wie schreibe ich eine Lambda-Funktion, die mir sagt, ob eine Zahl gerade ist?" Es ist jedoch keine richtige Antwort auf die Frage, die das OP ursprünglich gestellt hat. Doch viel tun Sie nicht wie das Beispiel , das ich erfunden, meine Post nicht in der Tat klar die Frage des OP beantworten.
Robert Rossney

10
Es ist schmerzlich offensichtlich, dass jemand, der "x% 2 == 0" vorschlägt - oder einen Kommentar, der mindestens sieben Personen empfiehlt, abstimmt - nicht einmal die ursprüngliche Frage gelesen hat.
Glenn Maynard

40

Warum definieren Sie nicht einfach eine Funktion?

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

In diesem Fall gibt es wirklich keine Rechtfertigung für die Verwendung von Lambda.


3
printist noch keine Funktion in 2.6. :)
Lukáš Lalinský

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

24
Sie kennen seinen tatsächlichen Anwendungsfall nicht, daher können Sie nicht sagen, dass es keinen Grund gibt, ein Lambda zu verwenden.
Glenn Maynard

6
@Glenn Maynard: Es gibt fast keinen Grund, ein Lambda zu verwenden, Punkt. Das Zuweisen eines Lambda zu einer Variablen - als Ersatz für def- ist im Allgemeinen eine sehr schlechte Idee (tm). Verwenden Sie einfach einen defso sterblichen Programmierer, der ihn lesen, interpretieren, verstehen und pflegen kann.
S.Lott

17
Es gibt viele legitime Verwendungen von Lambdas. Wenn Ihnen nichts einfällt, ist das nicht Lambdas Schuld. (Ich bin natürlich kein Fan der Syntax selbst - es ist eine ungeschickte Problemumgehung für die Tatsache, dass Pythons schlecht konzipierte Einrückungssyntax keine Inline-Funktionen wie normale Sprachen verarbeiten kann.)
Glenn Maynard

25

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

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

Wenn Sie x == 2 drucken,

wenn x! = 2, erhöhen Sie.


Ein dickes Lob, ich denke, dies ist die einzige Antwort auf der Seite, die die Frage tatsächlich beantwortet
theEpsilon

22

Sie können leicht eine Ausnahme in einem Lambda auslösen, wenn Sie dies 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 im Allgemeinen ist es, die Fehlerberichterstattung aus Lambdas herauszulassen; Lassen Sie es den Wert None haben und lösen Sie den Fehler im Aufrufer aus. Ich denke jedoch nicht, dass dies von Natur aus böse ist - ich halte die Syntax "y if x else z" selbst für schlechter - stellen Sie nur sicher, dass Sie nicht versuchen, zu viel in einen Lambda-Körper zu stopfen.


1
Wenn Sie mich fragen, ist es wahrscheinlich die schönere Methode, es bei einem Anrufer anzusprechen.
Dominic Bou-Samra

Möglicherweise, aber es hängt stark vom jeweiligen Fall ab. Natürlich können Sie das Lambda auch nach dem Erstellen dekorieren. x = RaiseValueErrorOnNone(x)wiederum je nach Fall.
Glenn Maynard

15

Lambdas in Python sind ziemlich restriktiv in Bezug auf das, was Sie verwenden dürfen. Insbesondere können Sie keine Schlüsselwörter haben ( mit Ausnahme von Operatoren wie and, not, orusw.) in ihrem Körper.

Es gibt also keine Möglichkeit, ein Lambda für Ihr Beispiel zu verwenden (weil Sie es nicht verwenden können raise), aber wenn Sie bereit sind, dies zuzugeben, können Sie Folgendes verwenden:

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

16
Die spezifische Einschränkung von Lambda besteht darin, dass Sie keine Anweisungen, sondern nur Ausdrücke verwenden dürfen.
Daniel Werner

13

Beachten Sie, dass Sie mehrere andere ... if- Anweisungen in Ihrer Lambda-Definition verwenden können:

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

2

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

from __future__ import print_function

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

2

Sie können auch logische Operatoren verwenden, um so etwas wie eine Bedingung zu haben

func = lambda element: (expression and DoSomething) or DoSomethingIfExpressionIsFalse

Weitere Informationen zu logischen Operatoren finden Sie hier


Es passt nicht zu Pythons Philosophie in Bezug auf Klarheit. Obwohl logisch äquivalent, wird die ifSyntax immer dieser vorgezogen. Die offensichtliche Art, Bedingungen zu überprüfen.
0xc0de

Vielen Dank! Ich habe dies in einer Arbeit mit funktionaler Sprache im College verwendet, weil der Professor Einschränkungen auferlegt hat, der besagt, dass ich keine ifAussage verwenden kann, daher fand ich diesen nicht offensichtlichen Weg.
Victor Lucas

2

was du genau brauchst ist

def fun():
    raise Exception()
f = lambda x:print x if x==2 else fun()

Rufen Sie nun die Funktion so auf, wie Sie es benötigen

f(2)
f(3)


0

Der folgende Beispielcode funktioniert bei mir. Ich bin mir nicht sicher, ob es direkt mit dieser Frage zusammenhängt, hoffe aber, dass es in einigen anderen Fällen hilft.

a = ''.join(map(lambda x: str(x*2) if x%2==0 else "", range(10)))

0

Versuch es:

is_even = lambda x: True if x % 2 == 0 else False
print(is_even(10))
print(is_even(11))

Aus:

True
False

0

Eine einfache Möglichkeit, ein If in Lambda durchzuführen, ist die Verwendung des Listenverständnisses.

Sie können in Lambda keine Ausnahme auslösen, aber in Python 3.x können Sie auf diese Weise etwas tun, das Ihrem Beispiel nahe kommt:

f = lambda x: print(x) if x==2 else print("exception")

Ein anderes Beispiel:

1 zurückgeben, wenn M sonst 0

f = lambda x: 1 if x=="M" else 0
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.