Warum funktioniert das nicht?
lambda: print "x"
Ist das nicht eine einzige Aussage oder ist es etwas anderes? Die Dokumentation scheint ein wenig spärlich zu sein, was in einem Lambda erlaubt ist ...
Warum funktioniert das nicht?
lambda: print "x"
Ist das nicht eine einzige Aussage oder ist es etwas anderes? Die Dokumentation scheint ein wenig spärlich zu sein, was in einem Lambda erlaubt ist ...
Antworten:
A lambda
‚s Körper ein zu einzelnen Ausdruck . In Python 2.x print
ist eine Anweisung. In Python 3 print
handelt es sich jedoch um eine Funktion (und eine Funktionsanwendung ist ein Ausdruck, sodass sie in einem Lambda funktioniert). Sie können (und sollten aus Gründen der Vorwärtskompatibilität :) die rückportierte Druckfunktion verwenden, wenn Sie das neueste Python 2.x verwenden:
In [1324]: from __future__ import print_function
In [1325]: f = lambda x: print(x)
In [1326]: f("HI")
HI
from __future__ import print_function
am Anfang des Codes stehen muss? thx
print()
als eingebaute Methode.
In Fällen, in denen ich dies zum einfachen Ausstechen verwende, verwende ich Folgendes:
fn = lambda x: sys.stdout.write(str(x) + "\n")
das funktioniert perfekt.
Was Sie geschrieben haben, ist gleichbedeutend mit
def anon():
return print "x"
was auch zu einem SyntaxError führt, lässt Python Sie keinen Wert zuweisen, der in 2.xx gedruckt werden soll; in python3 könnte man sagen
lambda: print('hi')
und es würde funktionieren, weil sie print so geändert haben, dass es eine Funktion anstelle einer Anweisung ist.
from __future__ import print_function
, was dies in py2.x ermöglicht
lambda: sys.stdout.write('hi')
Der Körper eines Lambda muss ein Ausdruck sein, der einen Wert zurückgibt. print
Als Aussage gibt es nichts zurück, nicht einmal None
. Ebenso können Sie das Ergebnis print
einer Variablen nicht zuordnen :
>>> x = print "hello"
File "<stdin>", line 1
x = print "hello"
^
SyntaxError: invalid syntax
Sie können auch keine Variablenzuweisung in ein Lambda einfügen, da Zuweisungen Anweisungen sind:
>>> lambda y: (x = y)
File "<stdin>", line 1
lambda y: (x = y)
^
SyntaxError: invalid syntax
Sie können so etwas tun.
Erstellen Sie eine Funktion, um die print-Anweisung in eine Funktion umzuwandeln:
def printf(text):
print text
Und drucken Sie es aus:
lambda: printf("Testing")
def printf(fmt, *args): print(fmt % args)
Mit Python 3.x kann print CAN in einem Lambda funktionieren, ohne die Semantik des Lambda zu ändern.
In besonderer Weise verwendet, ist dies sehr praktisch zum Debuggen. Ich poste diese 'späte Antwort', weil es ein praktischer Trick ist, den ich oft benutze.
Angenommen, Ihr "nicht instrumentiertes" Lambda ist:
lambda: 4
Dann ist Ihr "instrumentiertes" Lambda:
lambda: (print (3), 4) [1]
Hier sehen Sie eine Antwort auf Ihre Frage. print
ist kein Ausdruck in Python, heißt es.