Tại sao điều này không làm việc?
lambda: print "x"
Đây không phải là một tuyên bố duy nhất, hay nó là một cái gì đó khác? Tài liệu có vẻ hơi thưa thớt về những gì được phép trong lambda ...
Tại sao điều này không làm việc?
lambda: print "x"
Đây không phải là một tuyên bố duy nhất, hay nó là một cái gì đó khác? Tài liệu có vẻ hơi thưa thớt về những gì được phép trong lambda ...
Câu trả lời:
lambda
Cơ thể của A phải là một biểu thức duy nhất . Trong Python 2.x, print
là một câu lệnh. Tuy nhiên, trong Python 3, print
là một hàm (và một ứng dụng hàm là một biểu thức, vì vậy nó sẽ hoạt động trong lambda). Bạn có thể (và nên, để tương thích về phía trước :) sử dụng chức năng in cổng sau nếu bạn đang sử dụng Python 2.x mới nhất:
In [1324]: from __future__ import print_function
In [1325]: f = lambda x: print(x)
In [1326]: f("HI")
HI
from __future__ import print_function
phải ở đầu mã không? thx
print()
phương thức tích hợp sẵn.
Trong trường hợp tôi đang sử dụng cái này cho đơn giản, tôi sử dụng cái này:
fn = lambda x: sys.stdout.write(str(x) + "\n")
mà hoạt động hoàn hảo.
những gì bạn đã viết tương đương với
def anon():
return print "x"
Điều này cũng dẫn đến một SyntaxError, python không cho phép bạn gán một giá trị để in trong 2.xx; trong python3 bạn có thể nói
lambda: print('hi')
và nó sẽ hoạt động vì chúng đã thay đổi in thành một hàm thay vì một câu lệnh.
from __future__ import print_function
, cho phép điều này trong py2.x
lambda: sys.stdout.write('hi')
Cơ thể của lambda phải là một biểu thức trả về một giá trị. print
, là một tuyên bố, không trả lại bất cứ điều gì, thậm chí không None
. Tương tự, bạn không thể gán kết quả của print
một biến:
>>> x = print "hello"
File "<stdin>", line 1
x = print "hello"
^
SyntaxError: invalid syntax
Bạn cũng không thể đặt một phép gán biến trong lambda, vì các phép gán là các câu lệnh:
>>> lambda y: (x = y)
File "<stdin>", line 1
lambda y: (x = y)
^
SyntaxError: invalid syntax
Bạn có thể làm một cái gì đó như thế này.
Tạo một hàm để chuyển đổi câu lệnh in thành một hàm:
def printf(text):
print text
Và in nó:
lambda: printf("Testing")
def printf(fmt, *args): print(fmt % args)
Với Python 3.x, in CÓ THỂ hoạt động trong lambda, mà không thay đổi ngữ nghĩa của lambda.
Được sử dụng theo một cách đặc biệt, điều này rất thuận tiện để gỡ lỗi. Tôi đăng 'câu trả lời muộn' này, vì đó là một mẹo thực tế mà tôi thường sử dụng.
Giả sử lambda 'không được hiểu' của bạn là:
lambda: 4
Sau đó, lambda 'cụ' của bạn là:
lambda: (print (3), 4) [1]