2012-10-03 7 views
20

Ich schrieb einige Lambda-Funktionen und konnte das nicht herausfinden. Gibt es eine Möglichkeit, in Python so etwas wie lambda x: x if (x<3) zu haben? Als lambda a,b: a if (a > b) else b funktioniert ok. Bis jetzt scheint lambda x: x < 3 and x or None der nächste zu sein, den ich gefunden habe.Python Lambda mit wenn, aber ohne sonst

Antwort

36

Ein Lambda muss wie jede Funktion einen Rückgabewert haben.

lambda x: x if (x<3) funktioniert nicht, weil es nicht angibt, was zurückgegeben werden soll, wenn nicht x<3. Standardmäßig Funktionen geben None, so könnten Sie

lambda x: x if (x<3) else None 

Aber vielleicht tun, was Sie suchen ist eine Liste Verständnis mit einem if Zustand. Zum Beispiel:

In [21]: data = [1, 2, 5, 10, -1] 

In [22]: [x for x in data if x < 3] 
Out[22]: [1, 2, -1] 
+0

@ ubuntu - danke. Ich bin mir nicht sicher, warum ich angenommen habe, dass es niemanden zurückgeben sollte, ohne es zu spezifizieren. – root

+3

Das ist eine vernünftige Annahme, da Funktionen standardmäßig None zurückgeben. Das Wichtigste, an das man sich erinnern sollte, ist, dass das folgende "Lambda x:" ein * Ausdruck * sein muss, keine Aussage. – unutbu

+3

@root Manchmal finde ich es praktisch, an ein 'Lambda' zu denken, als ob es tatsächlich als' def Lambda (x, y): return ... 'geschrieben wäre –

6

Was ist los mit lambda x: x if x < 3 else None?

+0

mein Verständnis ist, dass Liste Verständnis geeignetere in diesem Szenario ist – zinking

+0

Die Frage ist nicht Iteration nicht erwähnt, so dass ich bin mir nicht sicher, was du meinst. Kannst du es ausarbeiten? – user4815162342

+0

du bist richtig, es ist wahrscheinlich nur eine Vermutung. -_- – zinking

1

Sie können immer versuchen, aufzurufen, 'Filter' für die bedingte Kontrollen. Grundsätzlich muss map() bei jedem Auftreten der iterables arbeiten, so dass es nicht auswählen kann. Aber Filter kann helfen, die Auswahl einzugrenzen. Ich erstelle zum Beispiel eine Liste von 1 bis 19, möchte aber ein Tupel von Quadraten mit nur geraden Zahlen erstellen.

x = list(range(1,20)) 

y = tuple(map(lambda n: n**2, filter(lambda n: n%2==0,x))) 

print (y)