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 ...
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 ...
Odpowiedzi:
A lambda
„s ciało musi być pojedynczy wyraz . W Pythonie 2.x print
jest instrukcja. Jednak w Pythonie 3 print
jest 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
from __future__ import print_function
znajdować się na początku kodu? thx
print()
wbudowaną metodę.
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.
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.
from __future__ import print_function
, co umożliwia to w py2.x
lambda: sys.stdout.write('hi')
Treść wyrażenia lambda musi być wyrażeniem zwracającym wartość. print
będąc oświadczeniem, nic nie zwraca, nawet None
. Podobnie nie możesz przypisać wyniku print
do 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
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")
def printf(fmt, *args): print(fmt % args)
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]