Warum druckt kein Lambda?

163

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

Anycorn
quelle
1
docs.python.org/reference/expressions.html#lambda . Es heißt "Ausdruck", was eine Verknüpfung zu einer vollständigen Definition aller möglichen Ausdrücke darstellt. Wie ist das "spärlich"? Was war falsch oder unvollständig?
S.Lott
3
@Lott Ich hatte ein Missverständnis darüber, was Ausdruck / Aussage ist und wo Print hingehört. es macht jetzt Sinn
Anycorn

Antworten:

187

A lambda‚s Körper ein zu einzelnen Ausdruck . In Python 2.x printist eine Anweisung. In Python 3 printhandelt 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
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
quelle
5
Jetzt verstehe ich, warum es so wichtig war, es zu einer Funktion zu machen. Wollte print als Standard-kwarg verwenden und dies hat es behoben. Vielen Dank.
Thomas Dignan
1
Darf ich wissen, warum from __future__ import print_functionam Anfang des Codes stehen muss? thx
Ben
Wo würde ich die Abzüge von dem sehen, was wir hier geschrieben haben?
Sk. Irfan
Ich stimme Bens Kommentar zu: Ich bekomme diesen Import nicht. Python (2 oder 3) hat print()als eingebaute Methode.
ivanleoncz
27

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.

Danny Staple
quelle
3
Als zusätzliche Anmerkung - verwenden Sie die von Zukunft oben. Verwenden Sie dies nur, wenn dies nicht verfügbar ist - was momentan eine ernsthaft veraltete Version wäre.
Danny Staple
24

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.

dagoof
quelle
3
Es gibt auch from __future__ import print_function, was dies in py2.x ermöglicht
tzaman
5
Oder alternativlambda: sys.stdout.write('hi')
fmark
@fmark: Außer es ist nicht so einfach in 2.x: Sie müssen sys.stdout.softspace behandeln und (zumindest) danach eine neue Zeile schreiben.
Fred Nurk
11

Der Körper eines Lambda muss ein Ausdruck sein, der einen Wert zurückgibt. printAls Aussage gibt es nichts zurück, nicht einmal None. Ebenso können Sie das Ergebnis printeiner 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
Paul Kuliniewicz
quelle
11

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")
Victor C. Martins
quelle
def printf(fmt, *args): print(fmt % args)
Flexibler
4

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]
Jacques de Hooge
quelle
3

Der Körper eines Lambda muss ein einzelner Ausdruck sein . printist eine Aussage, also ist es leider raus.

Zaman
quelle
danke, ich war mir nicht sicher über die Definition von Ausdruck versus Aussage, jetzt macht es Sinn
Anycorn
2

Hier sehen Sie eine Antwort auf Ihre Frage. printist kein Ausdruck in Python, heißt es.

vpit3833
quelle
1
Unvollständige Antwort, aber netter Link.
Stephen