Dlaczego print nie działa w lambdzie?

163

Dlaczego to nie działa?

lambda: print "x"

Czy to nie jest pojedyncze stwierdzenie, czy też coś innego? Dokumentacja wydaje się trochę skąpa na temat tego, co jest dozwolone w lambdzie ...

Anycorn
źródło
1
docs.python.org/reference/expressions.html#lambda . Mówi „wyrażenie”, które jest linkiem do pełnej definicji wszystkich możliwych wyrażeń. Jak to jest „rzadkie”? Co było niepoprawne lub niekompletne?
S.Lott
3
@Lott Miałem niezrozumienie, czym jest wyrażenie / stwierdzenie i gdzie należy wydrukować. ma to teraz sens
Anycorn

Odpowiedzi:

187

A lambda„s ciało musi być pojedynczy wyraz . W Pythonie 2.x printjest instrukcja. Jednak w Pythonie 3 printjest funkcją (a aplikacja funkcji jest wyrażeniem, więc będzie działać w lambdzie). Możesz (i powinieneś, w celu zapewnienia kompatybilności do przodu) użyć funkcji drukowania z portem wstecznym, jeśli używasz najnowszego Pythona 2.x:

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̲̳̳
źródło
5
Teraz rozumiem, dlaczego uczynienie z tego funkcji było takie ważne. Chciałem użyć print jako domyślnego kwarg i to naprawiło. Dzięki.
Thomas Dignan
1
Czy mogę wiedzieć, dlaczego miałbym from __future__ import print_functionznajdować się na początku kodu? thx
Ben
Gdzie mógłbym zobaczyć odbitki tego, co tutaj napisaliśmy?
Sk. Irfan
Zgadzam się z komentarzem Bena: nie rozumiem tego importu. Python (2 lub 3) ma print()wbudowaną metodę.
ivanleoncz
27

W przypadkach, w których używam tego do prostego usuwania, używam tego:

fn = lambda x: sys.stdout.write(str(x) + "\n")

który działa doskonale.

Danny Staple
źródło
3
Jako dodatkowa uwaga - użyj z przyszłości powyżej. Używaj tego tylko wtedy, gdy nie jest dostępne - co byłoby teraz poważnie nieaktualną wersją.
Danny Staple
24

to, co napisałeś, jest równoważne

def anon():
    return print "x"

co również skutkuje błędem SyntaxError, python nie pozwala przypisać wartości do drukowania w 2.xx; w pythonie3 można by powiedzieć

lambda: print('hi')

i działałoby, ponieważ zmienili print na funkcję zamiast instrukcji.

dagoof
źródło
3
Jest też from __future__ import print_function, co umożliwia to w py2.x
tzaman
5
Lub alternatywnielambda: sys.stdout.write('hi')
fmark
@fmark: Z wyjątkiem tego, że w 2.x nie jest to takie proste: musisz obsłużyć sys.stdout.softspace i (przynajmniej) później napisać nową linię.
Fred Nurk
11

Treść wyrażenia lambda musi być wyrażeniem zwracającym wartość. printbędąc oświadczeniem, nic nie zwraca, nawet None. Podobnie nie możesz przypisać wyniku printdo zmiennej:

>>> x = print "hello"
  File "<stdin>", line 1
    x = print "hello"
            ^
SyntaxError: invalid syntax

Nie możesz również umieścić przypisania zmiennej w lambdzie, ponieważ przypisania są instrukcjami:

>>> lambda y: (x = y)
  File "<stdin>", line 1
    lambda y: (x = y)
                 ^
SyntaxError: invalid syntax
Paweł Kuliniewicz
źródło
11

Możesz zrobić coś takiego.

Utwórz funkcję, która przekształci instrukcję print w funkcję:

def printf(text):
   print text

I wydrukuj:

lambda: printf("Testing")
Victor C. Martins
źródło
Bardziej elastycznie:def printf(fmt, *args): print(fmt % args)
IvyMike
4

W Pythonie 3.x wypisz CAN działa w lambdzie, bez zmiany semantyki lambda.

Używany w specjalny sposób, jest bardzo przydatny do debugowania. Wpisuję tę „późną odpowiedź”, ponieważ jest to praktyczna sztuczka, której często używam.

Załóżmy, że twoja „nieudokumentowana” lambda to:

lambda: 4

Zatem twoja `` instrumentalna '' lambda to:

lambda: (print (3), 4) [1]
Jacques de Hooge
źródło
3

Treść lambdy musi być pojedynczym wyrażeniem . printjest oświadczeniem, więc niestety nie ma.

tzaman
źródło
dziękuję, nie byłem pewien co do definicji wyrażenia w porównaniu z oświadczeniem, teraz ma to sens
Anycorn
2

Tutaj zobaczysz odpowiedź na swoje pytanie. printnie jest wyrażeniem w Pythonie, mówi.

vpit3833
źródło
1
Niekompletna odpowiedź, ale fajny link.
Stephen