Tại sao tính năng này không hoạt động?Tại sao không in tác phẩm trong một lambda?
lambda: print "x"
Đây không phải là một tuyên bố đơn lẻ hay là cái gì khác? Các tài liệu có vẻ hơi thưa thớt vào những gì được cho phép trong một lambda ...
Tại sao tính năng này không hoạt động?Tại sao không in tác phẩm trong một lambda?
lambda: print "x"
Đây không phải là một tuyên bố đơn lẻ hay là cái gì khác? Các tài liệu có vẻ hơi thưa thớt vào những gì được cho phép trong một lambda ...
Một lambda
' s phải là một biểu thức đơn . 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, do đó nó sẽ hoạt động trong một 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 back-chuyển 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
Bây giờ tôi thấy lý do tại sao nó là một việc lớn như vậy để làm cho nó một chức năng. Muốn sử dụng in như một kwarg mặc định và điều này cố định nó. Cảm ơn. –
những gì bạn đã viết là tương đương với
def anon():
return print "x"
đó cũng dẫn đến một Lỗi Cú pháp, trăn 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 bản in thành hàm thay vì tuyên bố.
Phần thân của lambda phải là một biểu thức đơn. print
là một tuyên bố, vì vậy nó ra, thật không may.
cảm ơn bạn, tôi không chắc chắn về định nghĩa của biểu thức so với tuyên bố, bây giờ nó có ý nghĩa – Anycorn
Phần thân của lambda phải là biểu thức trả về 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ự như vậy, bạn không thể gán kết quả của print
cho 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 nhiệm vụ biến trong một lambda, vì nhiệm vụ là phát biểu:
>>> lambda y: (x = y)
File "<stdin>", line 1
lambda y: (x = y)
^
SyntaxError: invalid syntax
Trong trường hợp tôi đang sử dụng này cho stubbing đơn giản ra tôi sử dụng này:
fn = lambda x: sys.stdout.write(str(x) + "\n")
mà hoạt động hoàn hảo.
Lưu ý bổ sung - sử dụng từ tương lai ở trên. Chỉ sử dụng tính năng này khi không có sẵn - đây sẽ là phiên bản lỗi thời ngay bây giờ. –
Bạn có thể làm điều gì đó như thế này.
Tạo một chức năng để chuyển đổi tuyên bố in vào một chức năng:
def printf(text):
print text
Và in nó:
lambda: printf("Testing")
Với Python 3.x, in THỂ làm việc trong một lambda, mà không thay đổi ngữ nghĩa của lambda.
Được sử dụng theo cách đặc biệt này rất tiện dụng để gỡ lỗi. Tôi đăng 'câu trả lời trễ' này, bởi vì đó là một mẹo thực tế mà tôi thường sử dụng.
Giả lambda 'uninstrumented' của bạn là:
lambda: 4
Sau đó lambda 'instrumented' của bạn là:
lambda: (print (3), 4) [1]
http://docs.python.org/reference/expressions.html#lambda . Nó nói "biểu hiện", là một liên kết đến một định nghĩa hoàn chỉnh của tất cả các biểu thức có thể. Làm thế nào là "thưa thớt" này? Điều gì không chính xác hoặc không đầy đủ? –
@Lott Tôi đã hiểu nhầm về biểu thức/tuyên bố là gì và in ở đâu. nó có nghĩa là bây giờ – Anycorn