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


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

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.


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.


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

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")

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]

3

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


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

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.