2012-04-04 31 views
6

Trong Python 3.2, theo điều này: http://docs.python.org/py3k/reference/expressions.html#summaryTrong Python 3.2, là "lambda" được coi là "từ khóa", "toán tử" hay cả hai?

lambda là toán tử có mức ưu tiên thấp nhất trong Python.

Và theo này: http://docs.python.org/py3k/reference/lexical_analysis.html#keywords

lambda là một từ khóa ngôn ngữ Python.

Tuy nhiên, theo này: http://docs.python.org/py3k/reference/lexical_analysis.html#other-tokens

nhà khai thác và từ khóa là các đơn vị khác nhau.

Tôi đang cố gắng giải thích một cách có hệ thống Python 3.2 cho người nào đó và tôi không muốn gây nhầm lẫn cho họ. Tôi, bản thân mình, đang bối rối, mặc dù, trên các định nghĩa chính xác của các nhà khai thác và từ khóa.

Dự đoán tốt nhất của tôi là thuật ngữ "toán tử" có nghĩa là một cái gì đó hơi khác khi được sử dụng trong ngữ cảnh của trình phân tích cú pháp Python so với Python lexer.

+0

Tôi khá chắc chắn rằng nó hợp lý để gọi 'lambda' một từ khóa chứ không phải là toán tử. – alberge

+1

@alberge Lý do của bạn là gì? – Paragon

+2

Tôi rõ ràng gắn những ngón tay trước não. Một số từ khóa python * là * toán tử. Chúng dường như là các tập hợp trùng lặp. – alberge

Trả lời

2

lambda rõ ràng là từ khóa; đó là một từ đặc biệt được nhận dạng bởi trình phân tích cú pháp, nếu không sẽ nằm trong định nghĩa của một số identifier.

lambda không phải là semantically một nhà điều hành. Toán tử chỉ là một hàm, nhưng được gọi với một cú pháp khác. Chúng ta có thể tưởng tượng thay thế toán tử + bằng hàm add; tất cả các chương trình của chúng tôi với phần bổ sung sẽ có nhiều chi tiết hơn và khó đọc hơn, nhưng chúng tôi vẫn có thể viết chúng. Mặt khác, cấu trúc ngôn ngữ lambda không thể thay thế bằng chức năng; lambda x: x+1 không chỉ tính kết quả từ các giá trị xx+1, bởi vì trong ngữ cảnh này, chúng không phải là giá trị (x là tên của tham số cho hàm được xác định và x+1 là mã của phần lambda).

Trong cùng một trang bạn liên kết với chúng ta có: http://docs.python.org/py3k/reference/lexical_analysis.html#operators

Các thẻ sau đây là nhà khai thác:

+  -  *  ** /  //  % 
<<  >>  &  |  ^  ~ 
<  >  <=  >=  ==  != 

Đó là toàn bộ nội dung của tiểu mục trên các nhà khai thác. Từ điều này, tôi có nghĩa là trong ngữ cảnh xác định mã của ngôn ngữ "toán tử" là toán tử biểu tượng, trong khi phần trên từ khóa rõ ràng là "những thứ này sẽ là từ định danh là từ khóa". Đó là lý do tại sao tôi nghĩ các toán tử từ khóa như not, is, in, v.v. không được liệt kê. Nhưng chắc chắn có những thứ là các toán tử ngữ nghĩa là các từ khóa, cho dù trình phân tích cú pháp có xét đến các lớp riêng biệt hay không.

Tôi không chắc chắn lý do tại sao http://docs.python.org/py3k/reference/expressions.html#summary mô tả lambda làm toán tử; Tôi chắc chắn sẽ không. Nói đúng ra nó không nói rõ ràng "lambda là toán tử có mức ưu tiên thấp nhất", nó chỉ liệt kê lambda trong một bảng có tiêu đề cột là "Toán tử". Có lẽ nó chỉ là một sự tiện lợi; mô tả lambda là một điều có ưu tiên thấp là một cách hay để làm rõ cách Python phân tích cú pháp lambda x: x + 1 (về mặt lý thuyết có thể là (lambda x: x) + 1 hoặc lambda x: (x + 1)).

+0

Chỉ vì chúng ta không thể thay thế cấu trúc 'lambda' bằng một hàm khác, nó không làm cho' lambda' không phải là một hàm. Nó là một hàm hơi đơn nhất (nếu bạn lấy tham số matcher), nó có một biểu thức và trả về một hàm. Nó rõ ràng là một toán tử vì nó có một biểu thức và trả về một biểu thức (của hàm kiểu). – poke

+0

@poke Không, nó không phải là một chức năng, chính vì nó cần một biểu thức. Bạn không chuyển biểu thức cho hàm, bạn chuyển giá trị. Nếu bạn cố gắng xem 'lambda' bạn không" vượt qua "nó một giá trị, bạn vượt qua nó một biểu thức (mà không thể được" thông qua "cho bất kỳ loại khác của chức năng). Nếu không, nó sẽ là hợp lệ để ràng buộc các biểu thức cho một tên và vượt qua tên thay vì: 'x = fire_ze_missiles(); f = lambda: x' là ** rất ** khác với 'f = lambda: fire_ze_missiles()', trong khi 'x = fire_ze_missiles(); y = x + 1' tương đương với 'y = fire_ze_missiles() + 1'. – Ben

+0

Tôi đồng ý: 'lambda' không" giống như "một nhà điều hành. Và như bạn lưu ý các bảng ưu tiên không chỉ dành cho các toán tử: chúng thực sự là một cách để con người đối phó với các điểm mạnh ràng buộc khi nhìn vào những gì nếu không sẽ là một phân tích không rõ ràng.Chúng tôi chỉ đơn thuần sử dụng để nhìn thấy sự mơ hồ như vậy khi giao dịch với các biểu thức-với-nhà khai thác. – torek

2

Điều đó không nói rằng họ đang loại trừ lẫn nhau, chỉ là:

"các loại sau của thẻ tồn tại: định danh, từ khóa, literals, khai thác, và delimiters"

Tôi thuộc loại người và người Mỹ. Cấp, nó có thể có nghĩa là ngụ ý rằng họ đang loại trừ lẫn nhau, trong trường hợp đó các tài liệu không phù hợp.

+0

Câu đó làm phiền tôi, bởi vì điều đó và bởi vì nó không đưa ra một thuật ngữ ô cho INDENT, DEINDENT và NEWLINE. Khi giải thích khái niệm về một mã thông báo Python, tôi không biết liệu tôi có nên kết hợp ba thứ đó thành một loại duy nhất hay để riêng chúng hay không. Tôi đoán đó là không liên quan đến câu hỏi này, nhưng tôi đang cố gắng thực sự hệ thống hóa các khái niệm cơ bản của Python. –

+0

Ba yếu tố đó là tất cả dấu phân cách/dấu phân tách. INDENT AND DEINDENT được sử dụng để đánh dấu các câu lệnh ghép (và các hàm và các lớp), trong khi NEWLINE tách các câu lệnh đơn giản. –

+0

Tôi đã học ngữ pháp; Bạn có biết thuật ngữ chính thức cho nó và bạn có thể trích dẫn nó? Tài liệu tôi đang viết - Tôi muốn nó chỉ sử dụng biệt ngữ chính thức, nếu có thể. –

4

Nhà khai thác và từ khóa là các thực thể riêng biệt.

Không có. is, in, and, or, not và tôi chắc chắn một số khác là cả hai.

+0

Tại sao danh sách này không phải là toán tử? Nó ngụ ý (không chính thức) rằng nó liệt kê tất cả các thẻ là các toán tử. Đó là những mã thông báo rõ ràng, nhưng không có trong danh sách: http://docs.python.org/py3k/reference/lexical_analysis.html#operators –

+0

Đơn giản chỉ vì chúng đã có trong danh sách từ khóa dành riêng. – poke

Các vấn đề liên quan