2010-06-04 5 views
135

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

+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 đủ? –

+3

@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

Trả lời

164

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 
+5

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

23

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

+3

Cũng có 'từ __future__ import print_function', cho phép điều này trong py2.x – tzaman

+5

Hoặc cách khác' lambda: sys.stdout.write ('hi') ' – fmark

+0

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

3

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.

+0

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

11

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 
2

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

+1

Câu trả lời chưa hoàn chỉnh, nhưng liên kết tốt đẹp. – Stephen

22

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.

+3

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

8

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

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]