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

Kerl
quelle
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.

Robert Rossney
quelle
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.

SilentGhost
quelle
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.

jimifiki
quelle
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.

Glenn Maynard
quelle
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
David Wolever
quelle
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
filotn
quelle
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
Juan Pablo Lopez
quelle
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

Victor Lucas
quelle
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)
Manjunath Bhadrannavar
quelle
2

Dieses Snippet soll Ihnen helfen:

x = lambda age: 'Older' if age > 30 else 'Younger'

print(x(40))
Adarsh ​​Somasundar
quelle
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)))
Rahul
quelle
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
Benyamin Jafari
quelle
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
Paul Cysne
quelle