Tại sao không in công việc trong lambda?


163

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


1
docs.python.org/reference/expressions.html#lambda . Nó nói "biểu thức", là một liên kết đến một định nghĩa đầy đủ 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 đủ?
S.Lott

3
@Lott Tôi đã hiểu nhầm về biểu thức / tuyên bố là gì và bản in thuộc về đâu. bây giờ nó có ý nghĩa
Anycorn

Câu trả lời:


187

lambdaCơ thể của A phải là một biểu thức duy nhất . Trong Python 2.x, printlà một câu lệnh. Tuy nhiên, trong Python 3, printlà 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

5
Bây giờ tôi thấy tại sao nó là một vấn đề 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 đã sửa nó. Cảm ơn.
Thomas Dignan

1
Tôi có thể biết tại sao from __future__ import print_functionphải ở đầu mã không? thx
Ben

Tôi sẽ thấy bản in của những gì chúng tôi đã viết ở đây?
Sk. Irfan

Tôi đồng ý với nhận xét của Ben: Tôi không nhận được nhập khẩu này. Python (2 hoặc 3) có print()phương thức tích hợp sẵn.
ivanleoncz

27

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.


3
Như một lưu ý bổ sung - sử dụng từ tương lai ở trên. Chỉ sử dụng cái này khi không có sẵn - đây sẽ là phiên bản lỗi thời ngay bây giờ.
Daniel Staple

24

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.


3
Ngoài ra còn có from __future__ import print_function, cho phép điều này trong py2.x
tzaman

5
Hoặc cách kháclambda: sys.stdout.write('hi')
đánh dấu

@fmark: Ngoại trừ việc đó không đơn giản trong 2.x: bạn cần xử lý sys.stdout.softspace và (ít nhất) viết một dòng mới sau đó.
Fred Nurk

11

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 printmộ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

11

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

4

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]

3

Cơ thể của lambda phải là một biểu hiện duy nhất . printlà một tuyên bố, vì vậy nó ra, không may.


cảm ơn bạn, tôi không chắc chắn về định nghĩa biểu thức so với tuyên bố, bây giờ nó có ý nghĩa
Anycorn

2

Ở đây , bạn thấy một câu trả lời cho câu hỏi của bạn. printkhông phải là biểu thức trong Python, nó nói.


1
Câu trả lời không đầy đủ, nhưng liên kết tốt đẹp.
Stephen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.