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


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

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.


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.


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

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

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]

3

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


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.


1
Niekompletna odpowiedź, ale fajny link.
Stephen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.