Hướng dẫn mathematical expressions in python - biểu thức toán học trong python

Chương này giải thích ý nghĩa của các yếu tố của biểu thức trong Python.

Show

Ghi chú cú pháp: Trong các chương này và các chương sau, ký hiệu BNF mở rộng sẽ được sử dụng để mô tả cú pháp, không phải phân tích từ vựng. Khi (một thay thế) một quy tắc cú pháp có biểu mẫu In this and the following chapters, extended BNF notation will be used to describe syntax, not lexical analysis. When (one alternative of) a syntax rule has the form

name ::=  othername

Và không có ngữ nghĩa nào được đưa ra, ngữ nghĩa của hình thức

parenth_form ::=  "(" [starred_expression] ")"
4 này giống như đối với
parenth_form ::=  "(" [starred_expression] ")"
5.

6.1. Chuyển đổi số họcArithmetic conversions¶

Khi một mô tả về toán tử số học bên dưới sử dụng cụm từ, các đối số số được chuyển đổi thành một loại chung, điều này có nghĩa là việc triển khai toán tử cho các loại tích hợp hoạt động như sau:

  • Nếu một trong hai đối số là một số phức, thì cái còn lại được chuyển đổi thành phức tạp;

  • Mặt khác, nếu một trong hai đối số là một số điểm nổi, thì một đối số khác được chuyển đổi thành điểm nổi;

  • Nếu không, cả hai phải là số nguyên và không cần chuyển đổi.

Một số quy tắc bổ sung áp dụng cho các toán tử nhất định (ví dụ: một chuỗi là đối số bên trái cho toán tử ‘%,). Phần mở rộng phải xác định hành vi chuyển đổi của riêng họ.

6.2. Nguyên tửAtoms¶

Các nguyên tử là các yếu tố cơ bản nhất của biểu thức. Các nguyên tử đơn giản nhất là định danh hoặc nghĩa đen. Các hình thức được bao bọc trong ngoặc đơn, ngoặc hoặc niềng răng cũng được phân loại theo cách cú pháp như các nguyên tử. Cú pháp cho các nguyên tử là:

atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom

6.2.1. Định danh (tên)Identifiers (Names)¶

Một định danh xảy ra dưới dạng nguyên tử là một tên. Xem phần Định danh và các từ khóa để định nghĩa từ vựng và đặt tên phần và ràng buộc để tài liệu đặt tên và ràng buộc.Identifiers and keywords for lexical definition and section Naming and binding for documentation of naming and binding.

Khi tên bị ràng buộc với một đối tượng, việc đánh giá nguyên tử mang lại đối tượng đó. Khi một tên không bị ràng buộc, một nỗ lực để đánh giá nó sẽ tăng ngoại lệ

parenth_form ::=  "(" [starred_expression] ")"
6.

Tên riêng biệt mang tính: Khi một định danh xảy ra theo văn bản trong một định nghĩa lớp bắt đầu với hai hoặc nhiều ký tự dấu gạch dưới và không kết thúc trong hai hoặc nhiều dấu gạch dưới, nó được coi là một tên riêng của lớp đó. Tên riêng được chuyển đổi thành một dạng dài hơn trước khi mã được tạo cho chúng. Biến đổi chèn tên lớp, với các dấu gạch dưới hàng đầu được xóa và một dấu gạch dưới được chèn, trước tên. Ví dụ, định danh

parenth_form ::=  "(" [starred_expression] ")"
7 xảy ra trong một lớp có tên
parenth_form ::=  "(" [starred_expression] ")"
8 sẽ được chuyển đổi thành
parenth_form ::=  "(" [starred_expression] ")"
9. Sự biến đổi này độc lập với bối cảnh cú pháp trong đó định danh được sử dụng. Nếu tên được chuyển đổi cực kỳ dài (dài hơn 255 ký tự), việc thực hiện cắt ngắn được xác định có thể xảy ra. Nếu tên lớp chỉ bao gồm dấu gạch dưới, không có sự chuyển đổi nào được thực hiện.
When an identifier that textually occurs in a class definition begins with two or more underscore characters and does not end in two or more underscores, it is considered a private name of that class. Private names are transformed to a longer form before code is generated for them. The transformation inserts the class name, with leading underscores removed and a single underscore inserted, in front of the name. For example, the identifier
parenth_form ::=  "(" [starred_expression] ")"
7 occurring in a class named
parenth_form ::=  "(" [starred_expression] ")"
8 will be transformed to
parenth_form ::=  "(" [starred_expression] ")"
9. This transformation is independent of the syntactical context in which the identifier is used. If the transformed name is extremely long (longer than 255 characters), implementation defined truncation may happen. If the class name consists only of underscores, no transformation is done.

6.2.2. Theo nghĩa chữLiterals¶

Python hỗ trợ chuỗi và byte chữ và các chữ số khác nhau:

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber

Đánh giá một nghĩa đen mang lại một đối tượng của loại đã cho (chuỗi, byte, số nguyên, số điểm nổi, số phức) với giá trị đã cho. Giá trị có thể được xấp xỉ trong trường hợp dấu phẩy động và nghĩa đen (phức tạp). Xem phần Bình luận để biết chi tiết.Literals for details.

Tất cả các chữ tương ứng với các loại dữ liệu bất biến và do đó, nhận dạng đối tượng ít quan trọng hơn giá trị của nó. Nhiều đánh giá của các nghĩa đen có cùng một giá trị (cùng một sự xuất hiện trong văn bản chương trình hoặc một sự xuất hiện khác nhau) có thể có được cùng một đối tượng hoặc một đối tượng khác với cùng một giá trị.

6.2.3. Hình thức ngoặc đơnParenthesized forms¶

Một hình thức ngoặc đơn là một danh sách biểu thức tùy chọn được đặt trong ngoặc đơn:

parenth_form ::=  "(" [starred_expression] ")"

Một danh sách biểu thức được đặt dấu ngoặc đơn mang lại bất cứ điều gì mà danh sách biểu thức đó mang lại: Nếu danh sách chứa ít nhất một dấu phẩy, nó sẽ mang lại một tuple; Mặt khác, nó mang lại biểu thức duy nhất tạo nên danh sách biểu thức.

Một cặp dấu ngoặc đơn trống mang lại một đối tượng Tuple trống. Vì các bộ dữ liệu là bất biến, các quy tắc tương tự như đối với các nghĩa đen được áp dụng (nghĩa là, hai lần xuất hiện của tuple trống có thể hoặc không thể mang lại cùng một đối tượng).

Lưu ý rằng các bộ dữ liệu không được hình thành bởi các dấu ngoặc đơn, mà là bằng cách sử dụng toán tử dấu phẩy. Ngoại lệ là bộ tuple trống, trong đó các dấu ngoặc đơn được yêu cầu - cho phép không có gì không được khám phá, không có gì trong các biểu thức sẽ gây ra sự mơ hồ và cho phép các lỗi chính tả phổ biến vượt qua.

6.2.4. Hiển thị danh sách, bộ và từ điểnDisplays for lists, sets and dictionaries¶

Để xây dựng một danh sách, một tập hợp hoặc một python từ điển cung cấp cú pháp đặc biệt có tên là Display Display, mỗi bộ trong số chúng trong hai hương vị:

  • Nội dung container được liệt kê rõ ràng hoặc

  • Chúng được tính toán thông qua một tập hợp các hướng dẫn lặp và lọc, được gọi là sự hiểu biết.

Các yếu tố cú pháp chung cho sự hiểu biết là:

comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]

Sự hiểu biết bao gồm một biểu thức duy nhất theo sau là ít nhất một mệnh đề

comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
0 và 0 hoặc nhiều hơn
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
0 hoặc
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
2. Trong trường hợp này, các phần tử của container mới là các phần tử sẽ được sản xuất bằng cách xem xét từng điều khoản
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
0 hoặc
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
2, làm tổ từ trái sang phải và đánh giá biểu thức để tạo ra một phần tử mỗi lần đạt được khối trong cùng.

Tuy nhiên, ngoài biểu thức có thể lặp lại trong mệnh đề

comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
0 ngoài cùng bên trái, sự hiểu biết được thực hiện trong một phạm vi được lồng nhau riêng biệt. Điều này đảm bảo rằng các tên được gán cho trong danh sách mục tiêu don lồng rò rỉ vào phạm vi kèm theo.

Biểu thức có thể lặp lại trong mệnh đề

comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
0 ngoài cùng bên trái được đánh giá trực tiếp trong phạm vi kèm theo và sau đó được chuyển làm đối số cho phạm vi lồng nhau ngầm. Các mệnh đề
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
0 tiếp theo và bất kỳ điều kiện lọc nào trong mệnh đề
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
0 ngoài cùng bên trái không thể được đánh giá trong phạm vi kèm theo vì chúng có thể phụ thuộc vào các giá trị thu được từ điều đáng thể bên trái. Ví dụ:
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
9.

Để đảm bảo sự hiểu biết luôn dẫn đến một thùng chứa thuộc loại thích hợp, các biểu thức

list_display ::=  "[" [starred_list | comprehension] "]"
0 và
list_display ::=  "[" [starred_list | comprehension] "]"
1 bị cấm trong phạm vi lồng nhau ngầm.

Vì Python 3.6, trong hàm

list_display ::=  "[" [starred_list | comprehension] "]"
2, một mệnh đề
list_display ::=  "[" [starred_list | comprehension] "]"
3 có thể được sử dụng để lặp qua một trình lặp không đồng bộ. Sự hiểu biết trong hàm
list_display ::=  "[" [starred_list | comprehension] "]"
2 có thể bao gồm một mệnh đề
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
0 hoặc
list_display ::=  "[" [starred_list | comprehension] "]"
3 theo biểu thức hàng đầu, có thể chứa các mệnh đề
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
0 hoặc
list_display ::=  "[" [starred_list | comprehension] "]"
3 bổ sung và cũng có thể sử dụng các biểu thức
list_display ::=  "[" [starred_list | comprehension] "]"
9. Nếu một sự hiểu biết chứa các biểu thức
list_display ::=  "[" [starred_list | comprehension] "]"
3 hoặc
list_display ::=  "[" [starred_list | comprehension] "]"
9, nó được gọi là một sự hiểu biết không đồng bộ. Một sự hiểu biết không đồng bộ có thể đình chỉ việc thực hiện chức năng coroutine trong đó nó xuất hiện. Xem thêm Pep 530.asynchronous iterator. A comprehension in an
list_display ::=  "[" [starred_list | comprehension] "]"
2 function may consist of either a
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
0 or
list_display ::=  "[" [starred_list | comprehension] "]"
3 clause following the leading expression, may contain additional
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
0 or
list_display ::=  "[" [starred_list | comprehension] "]"
3 clauses, and may also use
list_display ::=  "[" [starred_list | comprehension] "]"
9 expressions. If a comprehension contains either
list_display ::=  "[" [starred_list | comprehension] "]"
3 clauses or
list_display ::=  "[" [starred_list | comprehension] "]"
9 expressions it is called an asynchronous comprehension. An asynchronous comprehension may suspend the execution of the coroutine function in which it appears. See also PEP 530.

Mới trong Phiên bản 3.6: Sự toàn diện không đồng bộ đã được giới thiệu.Asynchronous comprehensions were introduced.

Đã thay đổi trong phiên bản 3.8:

list_display ::=  "[" [starred_list | comprehension] "]"
0 và
list_display ::=  "[" [starred_list | comprehension] "]"
1 bị cấm trong phạm vi lồng nhau ngầm.
list_display ::=  "[" [starred_list | comprehension] "]"
0 and
list_display ::=  "[" [starred_list | comprehension] "]"
1 prohibited in the implicitly nested scope.

6.2.5. Danh sách hiển thịList displays¶

Màn hình danh sách là một loạt các biểu thức có thể trống được đặt trong ngoặc vuông:

list_display ::=  "[" [starred_list | comprehension] "]"

Hiển thị danh sách mang lại một đối tượng danh sách mới, nội dung được chỉ định bởi một danh sách các biểu thức hoặc sự hiểu biết. Khi một danh sách các biểu thức được phân tách bằng dấu phẩy được cung cấp, các yếu tố của nó được đánh giá từ trái sang phải và được đặt vào đối tượng danh sách theo thứ tự đó. Khi một sự hiểu biết được cung cấp, danh sách được xây dựng từ các yếu tố do sự hiểu biết.

6.2.6. Đặt màn hình hiển thịSet displays¶

Một màn hình tập hợp được biểu thị bằng niềng răng xoăn và có thể phân biệt với màn hình từ điển bằng cách thiếu các dấu chấm phân tách các khóa và giá trị:

set_display ::=  "{" (starred_list | comprehension) "}"

Hiển thị tập hợp mang lại một đối tượng SET có thể thay đổi mới, các nội dung được chỉ định bởi một chuỗi các biểu thức hoặc sự hiểu biết. Khi một danh sách các biểu thức được phân tách bằng dấu phẩy được cung cấp, các yếu tố của nó được đánh giá từ trái sang phải và được thêm vào đối tượng đã đặt. Khi một sự hiểu biết được cung cấp, tập hợp được xây dựng từ các yếu tố do sự hiểu biết.

Một tập hợp trống không thể được xây dựng với

set_display ::=  "{" (starred_list | comprehension) "}"
4; Điều này xây dựng một từ điển trống.

6.2.7. Dictionary Hiển thịDictionary displays¶

Màn hình từ điển là một loạt các cặp khóa/dữ liệu có thể được đặt trong niềng răng xoăn:

dict_display       ::=  "{" [key_datum_list | dict_comprehension] "}"
key_datum_list     ::=  key_datum ("," key_datum)* [","]
key_datum          ::=  expression ":" expression | "**" or_expr
dict_comprehension ::=  expression ":" expression comp_for

Một màn hình từ điển mang lại một đối tượng từ điển mới.

Nếu một chuỗi được phân tách bằng dấu phẩy được đưa ra, chúng được đánh giá từ trái sang phải để xác định các mục của từ điển: mỗi đối tượng khóa được sử dụng làm khóa vào từ điển để lưu trữ mốc dữ liệu tương ứng. Điều này có nghĩa là bạn có thể chỉ định cùng một khóa nhiều lần trong danh sách khóa/mốc và giá trị từ điển cuối cùng cho khóa đó sẽ là cái cuối cùng được đưa ra.

Một dấu hoa thị kép

set_display ::=  "{" (starred_list | comprehension) "}"
5 biểu thị từ điển giải nén. Toán tử của nó phải là một bản đồ. Mỗi mục ánh xạ được thêm vào từ điển mới. Các giá trị sau này thay thế các giá trị đã được đặt bởi các cặp khóa/dữ liệu trước đó và giải nén từ điển trước đó.mapping. Each mapping item is added to the new dictionary. Later values replace values already set by earlier key/datum pairs and earlier dictionary unpackings.

Mới trong phiên bản 3.5: Giải nén vào màn hình từ điển, ban đầu được đề xuất bởi PEP 448.Unpacking into dictionary displays, originally proposed by PEP 448.

Một sự hiểu biết chính thống, trái ngược với danh sách và thiết lập sự hiểu biết, cần hai biểu thức được phân tách bằng một dấu hai chấm, theo sau là thông thường cho đối với các điều khoản và các điều khoản. Khi sự hiểu biết được chạy, các phần tử giá trị và khóa kết quả được chèn trong từ điển mới theo thứ tự chúng được sản xuất.

Hạn chế đối với các loại giá trị chính được liệt kê trước đó trong phần phân cấp loại tiêu chuẩn. . Datum cuối cùng (về mặt văn bản bên phải trong màn hình) được lưu trữ cho một giá trị khóa nhất đã chiếm ưu thế.The standard type hierarchy. (To summarize, the key type should be hashable, which excludes all mutable objects.) Clashes between duplicate keys are not detected; the last datum (textually rightmost in the display) stored for a given key value prevails.

Đã thay đổi trong phiên bản 3.8: Trước Python 3.8, theo trình độ của Dict, thứ tự đánh giá của khóa và giá trị không được xác định rõ. Trong CPython, giá trị được đánh giá trước khóa. Bắt đầu với 3,8, khóa được đánh giá trước giá trị, theo đề xuất của PEP 572.Prior to Python 3.8, in dict comprehensions, the evaluation order of key and value was not well-defined. In CPython, the value was evaluated before the key. Starting with 3.8, the key is evaluated before the value, as proposed by PEP 572.

6.2.8. Biểu thức máy phátGenerator expressions¶

Biểu thức máy phát là ký hiệu máy phát điện compact trong ngoặc đơn:

generator_expression ::=  "(" expression comp_for ")"

Một biểu thức máy phát mang lại một đối tượng máy phát mới. Cú pháp của nó giống như đối với các toàn bộ, ngoại trừ việc nó được đặt trong ngoặc đơn thay vì dấu ngoặc hoặc niềng răng xoăn.

Các biến được sử dụng trong biểu thức máy phát được đánh giá một cách lười biếng khi phương thức

set_display ::=  "{" (starred_list | comprehension) "}"
6 được gọi cho đối tượng Trình tạo (theo cùng kiểu với các trình tạo bình thường). Tuy nhiên, biểu thức có thể lặp lại trong mệnh đề
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
0 ngoài cùng bên trái được đánh giá ngay lập tức, do đó một lỗi được tạo ra sẽ được phát ra tại điểm xác định biểu thức máy phát, thay vì tại điểm lấy lại giá trị đầu tiên. Các mệnh đề
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
0 tiếp theo và bất kỳ điều kiện lọc nào trong mệnh đề
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
0 ngoài cùng bên trái không thể được đánh giá trong phạm vi kèm theo vì chúng có thể phụ thuộc vào các giá trị thu được từ điều đáng thể bên trái. Ví dụ:
dict_display       ::=  "{" [key_datum_list | dict_comprehension] "}"
key_datum_list     ::=  key_datum ("," key_datum)* [","]
key_datum          ::=  expression ":" expression | "**" or_expr
dict_comprehension ::=  expression ":" expression comp_for
0.

Các dấu ngoặc đơn có thể được bỏ qua trong các cuộc gọi chỉ với một đối số. Xem phần gọi để biết chi tiết.Calls for details.

Để tránh can thiệp vào hoạt động dự kiến ​​của biểu thức máy phát, các biểu thức

list_display ::=  "[" [starred_list | comprehension] "]"
0 và
list_display ::=  "[" [starred_list | comprehension] "]"
1 bị cấm trong trình tạo được xác định ngầm.

Nếu một biểu thức trình tạo chứa các biểu thức

list_display ::=  "[" [starred_list | comprehension] "]"
3 hoặc
list_display ::=  "[" [starred_list | comprehension] "]"
9, nó được gọi là biểu thức máy phát không đồng bộ. Một biểu thức máy phát không đồng bộ trả về một đối tượng máy phát không đồng bộ mới, đây là một trình lặp không đồng bộ (xem iterator không đồng bộ).Asynchronous Iterators).

Mới trong phiên bản 3.6: Biểu thức tạo không đồng bộ đã được giới thiệu.Asynchronous generator expressions were introduced.

Đã thay đổi trong phiên bản 3.7: Trước Python 3.7, các biểu thức tạo không đồng bộ chỉ có thể xuất hiện trong

list_display ::=  "[" [starred_list | comprehension] "]"
2 Coroutines. Bắt đầu với 3.7, bất kỳ chức năng nào cũng có thể sử dụng các biểu thức máy phát không đồng bộ.Prior to Python 3.7, asynchronous generator expressions could only appear in
list_display ::=  "[" [starred_list | comprehension] "]"
2 coroutines. Starting with 3.7, any function can use asynchronous generator expressions.

Đã thay đổi trong phiên bản 3.8:

list_display ::=  "[" [starred_list | comprehension] "]"
0 và
list_display ::=  "[" [starred_list | comprehension] "]"
1 bị cấm trong phạm vi lồng nhau ngầm.
list_display ::=  "[" [starred_list | comprehension] "]"
0 and
list_display ::=  "[" [starred_list | comprehension] "]"
1 prohibited in the implicitly nested scope.

6.2.9. Năng lượng biểu thức năng suấtYield expressions¶

yield_atom       ::=  "(" yield_expression ")"
yield_expression ::=  "yield" [expression_list | "from" expression]

Biểu thức năng suất được sử dụng khi xác định hàm tạo hoặc hàm tạo không đồng bộ và do đó chỉ có thể được sử dụng trong phần thân của định nghĩa hàm. Sử dụng biểu thức năng suất trong cơ thể chức năng, làm cho chức năng đó là chức năng của trình tạo và sử dụng nó trong cơ thể

list_display ::=  "[" [starred_list | comprehension] "]"
2 Chức năng khiến chức năng Coroutine trở thành một hàm tạo không đồng bộ. Ví dụ:generator function or an asynchronous generator function and thus can only be used in the body of a function definition. Using a yield expression in a function’s body causes that function to be a generator function, and using it in an
list_display ::=  "[" [starred_list | comprehension] "]"
2 function’s body causes that coroutine function to be an asynchronous generator function. For example:

atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
0

Do tác dụng phụ của chúng đối với phạm vi chứa, các biểu thức

list_display ::=  "[" [starred_list | comprehension] "]"
0 không được phép là một phần của phạm vi được xác định ngầm được sử dụng để thực hiện các biểu thức toàn diện và trình tạo.

Đã thay đổi trong phiên bản 3.8: Các biểu thức năng suất bị cấm trong các phạm vi lồng nhau ngầm được sử dụng để thực hiện các biểu thức toàn diện và trình tạo.Yield expressions prohibited in the implicitly nested scopes used to implement comprehensions and generator expressions.

Các chức năng của máy phát được mô tả dưới đây, trong khi các hàm máy phát không đồng bộ được mô tả riêng biệt trong phần Các hàm máy phát không đồng bộ.Asynchronous generator functions.

Khi một hàm máy phát được gọi, nó sẽ trả về một trình lặp được gọi là trình tạo. Trình tạo đó sau đó kiểm soát việc thực thi hàm máy phát. Việc thực hiện bắt đầu khi một trong các phương thức của máy phát điện được gọi. Vào thời điểm đó, việc thực hiện tiến hành biểu thức năng suất đầu tiên, trong đó nó bị đình chỉ một lần nữa, trả lại giá trị của

generator_expression ::=  "(" expression comp_for ")"
0 cho người gọi máy phát điện. Bằng cách đình chỉ, chúng tôi có nghĩa là tất cả các trạng thái địa phương được giữ lại, bao gồm các ràng buộc hiện tại của các biến cục bộ, con trỏ hướng dẫn, ngăn xếp đánh giá nội bộ và trạng thái của bất kỳ xử lý ngoại lệ nào. Khi thực thi được nối lại bằng cách gọi một trong các phương thức của Trình tạo, hàm có thể tiến hành chính xác như thể biểu thức năng suất chỉ là một cuộc gọi bên ngoài khác. Giá trị của biểu thức năng suất sau khi tiếp tục phụ thuộc vào phương thức tiếp tục thực thi. Nếu
set_display ::=  "{" (starred_list | comprehension) "}"
6 được sử dụng (thường thông qua
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
0 hoặc
generator_expression ::=  "(" expression comp_for ")"
3 tích hợp) thì kết quả là
generator_expression ::=  "(" expression comp_for ")"
4. Mặt khác, nếu
generator_expression ::=  "(" expression comp_for ")"
5 được sử dụng, thì kết quả sẽ là giá trị được truyền vào phương pháp đó.

Tất cả điều này làm cho các chức năng của máy phát khá giống với coroutines; Họ mang lại nhiều lần, họ có nhiều hơn một điểm vào và việc thực hiện của họ có thể bị đình chỉ. Sự khác biệt duy nhất là hàm máy phát không thể kiểm soát khi thực hiện nên tiếp tục sau khi nó mang lại; Điều khiển luôn được chuyển đến người gọi máy phát điện.

Biểu thức năng suất được cho phép ở bất cứ đâu trong cấu trúc

generator_expression ::=  "(" expression comp_for ")"
6. Nếu trình tạo không được nối lại trước khi nó được hoàn thiện (bằng cách đạt được số lượng tham chiếu bằng không hoặc bằng cách được thu thập rác), phương thức máy phát điện-____ ____87 sẽ được gọi, cho phép bất kỳ điều khoản
generator_expression ::=  "(" expression comp_for ")"
8 đang chờ xử lý nào.

Khi

generator_expression ::=  "(" expression comp_for ")"
9 được sử dụng, biểu thức được cung cấp phải là một điều không thể điều chỉnh được. Các giá trị được tạo ra bởi việc lặp lại rằng IT có thể được chuyển trực tiếp cho người gọi của các phương thức máy phát điện hiện tại. Bất kỳ giá trị nào được truyền vào với
generator_expression ::=  "(" expression comp_for ")"
5 và bất kỳ trường hợp ngoại lệ nào được truyền vào với
yield_atom       ::=  "(" yield_expression ")"
yield_expression ::=  "yield" [expression_list | "from" expression]
1 đều được truyền đến trình lặp cơ bản nếu nó có các phương thức thích hợp. Nếu đây không phải là trường hợp, thì
generator_expression ::=  "(" expression comp_for ")"
5 sẽ tăng
yield_atom       ::=  "(" yield_expression ")"
yield_expression ::=  "yield" [expression_list | "from" expression]
3 hoặc
yield_atom       ::=  "(" yield_expression ")"
yield_expression ::=  "yield" [expression_list | "from" expression]
4, trong khi
yield_atom       ::=  "(" yield_expression ")"
yield_expression ::=  "yield" [expression_list | "from" expression]
1 sẽ chỉ tăng ngoại lệ ngay lập tức.

Khi bộ lặp cơ bản hoàn tất, thuộc tính

yield_atom       ::=  "(" yield_expression ")"
yield_expression ::=  "yield" [expression_list | "from" expression]
6 của ví dụ
yield_atom       ::=  "(" yield_expression ")"
yield_expression ::=  "yield" [expression_list | "from" expression]
7 được nâng lên trở thành giá trị của biểu thức năng suất. Nó có thể được đặt một cách rõ ràng khi tăng
yield_atom       ::=  "(" yield_expression ")"
yield_expression ::=  "yield" [expression_list | "from" expression]
7 hoặc tự động khi trình điều khiển là một trình tạo (bằng cách trả về một giá trị từ trình phân chia).

Đã thay đổi trong phiên bản 3.3: Đã thêm

generator_expression ::=  "(" expression comp_for ")"
9 để ủy quyền luồng điều khiển cho một tiểu thư.Added
generator_expression ::=  "(" expression comp_for ")"
9 to delegate control flow to a subiterator.

Các dấu ngoặc đơn có thể được bỏ qua khi biểu thức năng suất là biểu thức duy nhất ở phía bên phải của một câu lệnh gán.

Xem thêm

PEP 255 - Máy phát điện đơn giản - Simple Generators

Đề xuất thêm các máy phát điện và tuyên bố

list_display ::=  "[" [starred_list | comprehension] "]"
0 vào Python.

PEP 342 - Coroutines thông qua các máy phát điện nâng cao - Coroutines via Enhanced Generators

Đề xuất tăng cường API và cú pháp của các máy phát điện, làm cho chúng có thể sử dụng như các coroutines đơn giản.

PEP 380 - Cú pháp để ủy thác cho bộ chia - Syntax for Delegating to a Subgenerator

Đề xuất giới thiệu cú pháp

atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
01, giúp phái đoàn trở nên dễ dàng.

PEP 525 - Máy phát điện không đồng bộ - Asynchronous Generators

Đề xuất mở rộng trên PEP 492 bằng cách thêm các khả năng của máy phát vào các chức năng coroutine.PEP 492 by adding generator capabilities to coroutine functions.

6.2.9.1. Phương pháp máy phát điệnGenerator-iterator methods¶

Tiểu mục này mô tả các phương thức của một trình lặp máy phát. Chúng có thể được sử dụng để kiểm soát việc thực hiện hàm máy phát.

Lưu ý rằng việc gọi bất kỳ phương thức trình tạo nào bên dưới khi trình tạo đã thực thi tăng ngoại lệ

atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
02.

________ 103 ________ 104 ()()

Bắt đầu thực thi hàm trình tạo hoặc tiếp tục nó ở biểu thức năng suất được thực hiện cuối cùng. Khi một hàm máy phát được nối lại với phương thức

set_display ::=  "{" (starred_list | comprehension) "}"
6, biểu thức năng suất hiện tại luôn đánh giá thành
generator_expression ::=  "(" expression comp_for ")"
4. Việc thực hiện sau đó tiếp tục đến biểu thức năng suất tiếp theo, trong đó trình tạo bị treo trở lại và giá trị của
generator_expression ::=  "(" expression comp_for ")"
0 được trả lại cho người gọi ____ ____ 66. Nếu máy phát thoát ra mà không mang lại giá trị khác, ngoại lệ
yield_atom       ::=  "(" yield_expression ")"
yield_expression ::=  "yield" [expression_list | "from" expression]
7 sẽ được nâng lên.

Phương pháp này thường được gọi là ngầm, ví dụ: bởi một vòng lặp

comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
0 hoặc bằng hàm
generator_expression ::=  "(" expression comp_for ")"
3 tích hợp.

________ 103 ________ 113 (Giá trị) ¶(value)

Tiếp tục thực thi và người hâm mộ gửi một giá trị vào hàm trình tạo. Đối số giá trị trở thành kết quả của biểu thức năng suất hiện tại. Phương thức

generator_expression ::=  "(" expression comp_for ")"
5 trả về giá trị tiếp theo được tạo bởi trình tạo hoặc tăng
yield_atom       ::=  "(" yield_expression ")"
yield_expression ::=  "yield" [expression_list | "from" expression]
7 nếu trình tạo thoát ra mà không mang lại giá trị khác. Khi
generator_expression ::=  "(" expression comp_for ")"
5 được gọi để khởi động trình tạo, nó phải được gọi bằng
generator_expression ::=  "(" expression comp_for ")"
4 làm đối số, bởi vì không có biểu thức năng suất nào có thể nhận được giá trị.

________ 103 ________ 119 (Giá trị) ________ 103 ________ 119 (Loại [, Giá trị [, Traceback]]))(value)
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
03
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
19(type[, value[, traceback]])

Tăng một ngoại lệ tại điểm mà máy phát được tạm dừng và trả về giá trị tiếp theo được mang lại bởi hàm máy phát. Nếu máy phát thoát ra mà không mang lại giá trị khác, ngoại lệ

yield_atom       ::=  "(" yield_expression ")"
yield_expression ::=  "yield" [expression_list | "from" expression]
7 sẽ được nâng lên. Nếu chức năng trình tạo không bắt được ngoại lệ được truyền, hoặc tăng một ngoại lệ khác, thì ngoại lệ đó sẽ truyền cho người gọi.

Trong sử dụng điển hình, điều này được gọi với một trường hợp ngoại lệ duy nhất tương tự như cách sử dụng từ khóa

atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
23.

Tuy nhiên, đối với khả năng tương thích ngược, chữ ký thứ hai được hỗ trợ, theo một quy ước từ các phiên bản cũ của Python. Đối số loại phải là một lớp ngoại lệ và giá trị phải là một thể hiện ngoại lệ. Nếu giá trị không được cung cấp, hàm tạo loại được gọi để có được một thể hiện. Nếu TraceBack được cung cấp, nó được đặt trên ngoại lệ, nếu không, bất kỳ thuộc tính

atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
24 hiện có nào được lưu trữ trong giá trị có thể được xóa.

________ 103 ________ 126 ()()

Tăng

atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
27 tại điểm mà hàm máy phát được tạm dừng. Nếu hàm máy phát thì thoát ra một cách duyên dáng, đã bị đóng hoặc tăng
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
27 (bằng cách không bắt được ngoại lệ), hãy đóng trả về cho người gọi của nó. Nếu trình tạo mang lại một giá trị, một
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
29 sẽ được nâng lên. Nếu trình tạo tăng bất kỳ ngoại lệ nào khác, nó sẽ được truyền đến người gọi.
generator_expression ::=  "(" expression comp_for ")"
7 không làm gì nếu trình tạo đã thoát do ngoại lệ hoặc lối thoát bình thường.

6.2.9.2. Ví dụ;Examples¶

Dưới đây là một ví dụ đơn giản thể hiện hành vi của các trình tạo và hàm máy phát:

atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
1

Để biết các ví dụ sử dụng

list_display ::=  "[" [starred_list | comprehension] "]"
1, hãy xem PEP 380: Cú pháp để ủy thác cho một trình phân chia trong trò chơi What What New In Python.PEP 380: Syntax for Delegating to a Subgenerator in “What’s New in Python.”

6.2.9.3. Chức năng máy phát không đồng bộAsynchronous generator functions¶

Sự hiện diện của biểu thức năng suất trong hàm hoặc phương thức được xác định bằng cách sử dụng

list_display ::=  "[" [starred_list | comprehension] "]"
2 xác định thêm hàm là hàm tạo không đồng bộ.asynchronous generator function.

Khi một hàm máy phát không đồng bộ được gọi, nó sẽ trả về một trình lặp không đồng bộ được gọi là một đối tượng máy phát không đồng bộ. Đối tượng đó sau đó kiểm soát việc thực thi hàm trình tạo. Một đối tượng máy phát không đồng bộ thường được sử dụng trong câu lệnh

list_display ::=  "[" [starred_list | comprehension] "]"
3 trong hàm coroutine tương tự như cách sử dụng đối tượng trình tạo trong câu lệnh
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
0.

Gọi một trong những phương thức máy phát không đồng bộ trở lại một đối tượng có thể chờ đợi và việc thực thi bắt đầu khi đối tượng này được chờ đợi. Vào thời điểm đó, việc thực hiện tiến hành biểu thức năng suất đầu tiên, trong đó nó bị đình chỉ một lần nữa, trả lại giá trị

generator_expression ::=  "(" expression comp_for ")"
0 cho coroutine đang chờ đợi. Như với một máy phát điện, hệ thống treo có nghĩa là tất cả các trạng thái cục bộ được giữ lại, bao gồm các ràng buộc hiện tại của các biến cục bộ, con trỏ hướng dẫn, ngăn xếp đánh giá nội bộ và trạng thái của bất kỳ xử lý ngoại lệ nào. Khi việc thực thi được nối lại bằng cách chờ đối tượng tiếp theo được trả về bởi các phương thức tạo không đồng bộ, chức năng có thể tiến hành chính xác như thể biểu thức năng suất chỉ là một cuộc gọi bên ngoài khác. Giá trị của biểu thức năng suất sau khi tiếp tục phụ thuộc vào phương thức tiếp tục thực thi. Nếu
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
36 được sử dụng thì kết quả là
generator_expression ::=  "(" expression comp_for ")"
4. Mặt khác, nếu
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
38 được sử dụng, thì kết quả sẽ là giá trị được truyền vào phương pháp đó.awaitable object, and the execution starts when this object is awaited on. At that time, the execution proceeds to the first yield expression, where it is suspended again, returning the value of
generator_expression ::=  "(" expression comp_for ")"
0 to the awaiting coroutine. As with a generator, suspension means that all local state is retained, including the current bindings of local variables, the instruction pointer, the internal evaluation stack, and the state of any exception handling. When the execution is resumed by awaiting on the next object returned by the asynchronous generator’s methods, the function can proceed exactly as if the yield expression were just another external call. The value of the yield expression after resuming depends on the method which resumed the execution. If
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
36 is used then the result is
generator_expression ::=  "(" expression comp_for ")"
4. Otherwise, if
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
38 is used, then the result will be the value passed in to that method.

Nếu một trình tạo không đồng bộ xảy ra thoát ra sớm bằng

atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
39, tác vụ người gọi bị hủy hoặc các ngoại lệ khác, mã làm sạch Async của Trình tạo sẽ chạy và có thể tăng các ngoại lệ hoặc truy cập các biến ngữ cảnh trong bối cảnh bất ngờ có lẽ sau thời gian tồn tại của các nhiệm vụ, nó hoặc trong quá trình tắt vòng lặp sự kiện khi móc thu gom rác máy phát điện không đồng bộ được gọi. Để ngăn chặn điều này, người gọi phải đóng một cách rõ ràng trình tạo async bằng cách gọi phương thức
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
40 để hoàn thiện trình tạo và cuối cùng tách nó ra khỏi vòng lặp sự kiện.

Trong hàm tạo không đồng bộ, các biểu thức năng suất được cho phép ở bất cứ đâu trong cấu trúc

generator_expression ::=  "(" expression comp_for ")"
6. Tuy nhiên, nếu một máy phát không đồng bộ không được nối lại trước khi nó được hoàn thiện (bằng cách đạt được số lượng tham chiếu bằng không hoặc bằng cách thu thập rác), thì một biểu thức năng suất trong cấu trúc
generator_expression ::=  "(" expression comp_for ")"
6 có thể dẫn đến việc không thực hiện các điều khoản đang chờ xử lý. Trong trường hợp này, trách nhiệm của vòng lặp sự kiện hoặc bộ lập lịch chạy trình tạo không đồng bộ để gọi phương thức máy phát máy phát điện không đồng bộ
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
40 và chạy đối tượng Coroutine kết quả, do đó cho phép bất kỳ điều khoản đang chờ xử lý nào.

Để chăm sóc việc hoàn thiện khi chấm dứt vòng lặp sự kiện, một vòng lặp sự kiện nên xác định chức năng Finalizer có trình tạo máy phát không đồng bộ và có lẽ gọi

atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
40 và thực hiện coroutine. Bộ kết thúc này có thể được đăng ký bằng cách gọi
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
47. Khi lần đầu tiên lặp lại, một máy phát điện không đồng bộ sẽ lưu trữ bộ hoàn thiện đã đăng ký để được gọi khi hoàn thiện. Để biết ví dụ tham chiếu của phương thức Finalizer, hãy xem việc triển khai
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
48 trong lib/asyncio/base_events.py.

Biểu thức

generator_expression ::=  "(" expression comp_for ")"
9 là lỗi cú pháp khi được sử dụng trong hàm tạo không đồng bộ.

6.2.9.4. Phương pháp máy phát điện không đồng bộAsynchronous generator-iterator methods¶

Tiểu mục này mô tả các phương thức của một trình lặp máy phát không đồng bộ, được sử dụng để kiểm soát việc thực hiện hàm máy phát.

Coroutine ________ 150 ________ 151 ()()

Trả về một sự chờ đợi mà khi chạy bắt đầu thực thi trình tạo không đồng bộ hoặc tiếp tục nó ở biểu thức năng suất được thực hiện cuối cùng. Khi một hàm máy phát không đồng bộ được nối lại với phương thức

atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
36, biểu thức năng suất hiện tại luôn đánh giá thành
generator_expression ::=  "(" expression comp_for ")"
4 trong phần được trả lại có thể chờ đợi, khi chạy sẽ tiếp tục đến biểu thức năng suất tiếp theo. Giá trị của
generator_expression ::=  "(" expression comp_for ")"
0 của biểu thức năng suất là giá trị của ngoại lệ
yield_atom       ::=  "(" yield_expression ")"
yield_expression ::=  "yield" [expression_list | "from" expression]
7 được tăng lên bởi coroutine hoàn thành. Nếu máy phát không đồng bộ thoát ra mà không mang lại một giá trị khác, thay vào đó có thể chờ đợi là ngoại lệ
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
56, báo hiệu rằng việc lặp không đồng bộ đã hoàn thành.

Phương pháp này thường được gọi là ngầm bằng một vòng

list_display ::=  "[" [starred_list | comprehension] "]"
3.

Coroutine ________ 150 ________ 159 (Giá trị) ¶(value)

Trả về một sự chờ đợi, khi chạy tiếp tục thực hiện trình tạo không đồng bộ. Như với phương thức

generator_expression ::=  "(" expression comp_for ")"
5 cho một trình tạo, điều này sẽ gửi một giá trị vào hàm trình tạo không đồng bộ và đối số giá trị trở thành kết quả của biểu thức năng suất hiện tại. Việc chờ được trả về bằng phương thức
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
38 sẽ trả về giá trị tiếp theo được tạo bởi trình tạo dưới dạng giá trị của
yield_atom       ::=  "(" yield_expression ")"
yield_expression ::=  "yield" [expression_list | "from" expression]
7 được nâng lên hoặc tăng
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
56 nếu trình tạo không đồng bộ thoát ra mà không mang lại giá trị khác. Khi
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
38 được gọi để khởi động trình tạo không đồng bộ, nó phải được gọi bằng
generator_expression ::=  "(" expression comp_for ")"
4 làm đối số, bởi vì không có biểu thức năng suất nào có thể nhận được giá trị.

Coroutine ________ 150 ________ 167 (loại [, value [, traceback]]) ¶(type[, value[, traceback]])

Trả về một sự chờ đợi, làm tăng ngoại lệ là loại

atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
68 tại điểm mà bộ tạo không đồng bộ được tạm dừng và trả về giá trị tiếp theo được mang lại bởi hàm máy phát là giá trị của ngoại lệ
yield_atom       ::=  "(" yield_expression ")"
yield_expression ::=  "yield" [expression_list | "from" expression]
7 tăng. Nếu máy phát không đồng bộ thoát ra mà không mang lại giá trị khác, ngoại lệ
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
56 được nâng lên bởi sự chờ đợi. Nếu hàm máy phát không bắt được ngoại lệ được truyền, hoặc tăng một ngoại lệ khác, thì khi có thể chờ đợi được chạy, ngoại lệ sẽ truyền cho người gọi của sự chờ đợi.

Coroutine ________ 150 ________ 172 ()()

Trả về một sự chờ đợi rằng khi chạy sẽ ném

atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
27 vào hàm máy phát không đồng bộ tại điểm mà nó bị tạm dừng. Nếu chức năng máy phát không đồng bộ thì thoát ra một cách duyên dáng, đã bị đóng hoặc tăng
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
27 (bằng cách không bắt được ngoại lệ), thì khả năng chờ được trả lại sẽ tăng ngoại lệ
yield_atom       ::=  "(" yield_expression ")"
yield_expression ::=  "yield" [expression_list | "from" expression]
7. Bất kỳ thiết bị chờ đợi nào được trả lại bởi các cuộc gọi tiếp theo đến trình tạo không đồng bộ sẽ tăng ngoại lệ
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
56. Nếu máy phát không đồng bộ mang lại một giá trị, một
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
29 được nâng lên bởi sự chờ đợi. Nếu máy phát không đồng bộ tăng bất kỳ ngoại lệ nào khác, nó sẽ được truyền đến người gọi của người đang chờ đợi. Nếu trình tạo không đồng bộ đã thoát ra do ngoại lệ hoặc lối thoát thông thường, thì các cuộc gọi tiếp theo đến
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
40 sẽ trả về một sự chờ đợi không có gì.

6.3. Nguyên thủyPrimaries¶

Các nguyên tắc đại diện cho các hoạt động ràng buộc chặt chẽ nhất của ngôn ngữ. Cú pháp của họ là:

atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
2

6.3.1. Tài liệu tham khảo thuộc tínhAttribute references¶

Tài liệu tham khảo thuộc tính là một chính theo sau là một khoảng thời gian và một tên:

atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
3

Chính phải đánh giá thành một đối tượng của một loại hỗ trợ các tham chiếu thuộc tính, mà hầu hết các đối tượng đều làm. Đối tượng này sau đó được yêu cầu tạo thuộc tính có tên là định danh. Sản xuất này có thể được tùy chỉnh bằng cách ghi đè phương thức

atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
79. Nếu thuộc tính này không có sẵn, ngoại lệ
yield_atom       ::=  "(" yield_expression ")"
yield_expression ::=  "yield" [expression_list | "from" expression]
3 sẽ được nâng lên. Mặt khác, loại và giá trị của đối tượng được tạo ra được xác định bởi đối tượng. Nhiều đánh giá của cùng một tham chiếu thuộc tính có thể mang lại các đối tượng khác nhau.

6.3.2. Đăng kýSubscriptions¶

Đăng ký một thể hiện của một lớp container thường sẽ chọn một phần tử từ container. Việc đăng ký một lớp chung thường sẽ trả về một đối tượng chung.container class will generally select an element from the container. The subscription of a generic class will generally return a GenericAlias object.

atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
4

Khi một đối tượng được đăng ký, trình thông dịch sẽ đánh giá danh sách chính và biểu thức.

Chính phải đánh giá đến một đối tượng hỗ trợ đăng ký. Một đối tượng có thể hỗ trợ đăng ký thông qua việc xác định một hoặc cả

atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
81 và
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
82. Khi chính được đăng ký, kết quả được đánh giá của danh sách biểu thức sẽ được chuyển cho một trong những phương pháp này. Để biết thêm chi tiết về khi
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
83 được gọi thay vì
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
84, xem __class_getitem__ so với __getItem__.__class_getitem__ versus __getitem__.

Nếu danh sách biểu thức chứa ít nhất một dấu phẩy, nó sẽ đánh giá thành một

atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
85 chứa các mục của danh sách biểu thức. Mặt khác, danh sách biểu thức sẽ đánh giá đến giá trị của danh sách thành viên duy nhất.

Đối với các đối tượng tích hợp, có hai loại đối tượng hỗ trợ đăng ký qua

atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
81:

  1. Ánh xạ. Nếu chính là ánh xạ, danh sách biểu thức phải đánh giá đến một đối tượng có giá trị là một trong các khóa của ánh xạ và đăng ký chọn giá trị trong ánh xạ tương ứng với khóa đó. Một ví dụ về lớp ánh xạ tích hợp là lớp

    atom      ::=  identifier | literal | enclosure
    enclosure ::=  parenth_form | list_display | dict_display | set_display
                   | generator_expression | yield_atom
    
    87.mapping, the expression list must evaluate to an object whose value is one of the keys of the mapping, and the subscription selects the value in the mapping that corresponds to that key. An example of a builtin mapping class is the
    atom      ::=  identifier | literal | enclosure
    enclosure ::=  parenth_form | list_display | dict_display | set_display
                   | generator_expression | yield_atom
    
    87 class.

  2. Trình tự. Nếu chính là một chuỗi, danh sách biểu thức phải đánh giá thành

    atom      ::=  identifier | literal | enclosure
    enclosure ::=  parenth_form | list_display | dict_display | set_display
                   | generator_expression | yield_atom
    
    88 hoặc
    atom      ::=  identifier | literal | enclosure
    enclosure ::=  parenth_form | list_display | dict_display | set_display
                   | generator_expression | yield_atom
    
    89 (như được thảo luận trong phần sau). Ví dụ về các lớp trình tự xây dựng bao gồm các lớp
    atom      ::=  identifier | literal | enclosure
    enclosure ::=  parenth_form | list_display | dict_display | set_display
                   | generator_expression | yield_atom
    
    90,
    atom      ::=  identifier | literal | enclosure
    enclosure ::=  parenth_form | list_display | dict_display | set_display
                   | generator_expression | yield_atom
    
    91 và
    atom      ::=  identifier | literal | enclosure
    enclosure ::=  parenth_form | list_display | dict_display | set_display
                   | generator_expression | yield_atom
    
    85.sequence, the expression list must evaluate to an
    atom      ::=  identifier | literal | enclosure
    enclosure ::=  parenth_form | list_display | dict_display | set_display
                   | generator_expression | yield_atom
    
    88 or a
    atom      ::=  identifier | literal | enclosure
    enclosure ::=  parenth_form | list_display | dict_display | set_display
                   | generator_expression | yield_atom
    
    89 (as discussed in the following section). Examples of builtin sequence classes include the
    atom      ::=  identifier | literal | enclosure
    enclosure ::=  parenth_form | list_display | dict_display | set_display
                   | generator_expression | yield_atom
    
    90,
    atom      ::=  identifier | literal | enclosure
    enclosure ::=  parenth_form | list_display | dict_display | set_display
                   | generator_expression | yield_atom
    
    91 and
    atom      ::=  identifier | literal | enclosure
    enclosure ::=  parenth_form | list_display | dict_display | set_display
                   | generator_expression | yield_atom
    
    85 classes.

Cú pháp chính thức không cung cấp đặc biệt cho các chỉ số tiêu cực trong các chuỗi. Tuy nhiên, tất cả các chuỗi tích hợp đều cung cấp một phương thức

atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
81 diễn giải các chỉ số âm bằng cách thêm độ dài của chuỗi vào chỉ mục để, ví dụ,
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
94 chọn mục cuối cùng của
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
95. Giá trị kết quả phải là một số nguyên không âm ít hơn số lượng mục trong chuỗi và đăng ký chọn mục có chỉ số là giá trị đó (tính từ 0). Do sự hỗ trợ cho các chỉ số âm và cắt xảy ra trong phương thức đối tượng
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
81, các lớp con ghi đè phương pháp này sẽ cần thêm hỗ trợ đó một cách rõ ràng.sequences. However, built-in sequences all provide a
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
81 method that interprets negative indices by adding the length of the sequence to the index so that, for example,
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
94 selects the last item of
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
95. The resulting value must be a nonnegative integer less than the number of items in the sequence, and the subscription selects the item whose index is that value (counting from zero). Since the support for negative indices and slicing occurs in the object’s
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
81 method, subclasses overriding this method will need to explicitly add that support.

Một

atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
97 là một loại trình tự đặc biệt có các mục là các ký tự. Một ký tự không phải là một loại dữ liệu riêng biệt mà là một chuỗi chính xác một ký tự.

6.3.3. Ngả gòSlicings¶

Việc cắt lát chọn một loạt các mục trong một đối tượng chuỗi (ví dụ: một chuỗi, tuple hoặc danh sách). Slicings có thể được sử dụng làm biểu thức hoặc làm mục tiêu trong các câu lệnh gán hoặc

atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
98. Cú pháp để cắt lát:

atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
5

Có sự mơ hồ trong cú pháp chính thức ở đây: bất cứ điều gì trông giống như một danh sách biểu thức cũng trông giống như một danh sách lát cắt, vì vậy bất kỳ đăng ký nào cũng có thể được hiểu là một sự cắt lát. Thay vì làm phức tạp thêm cú pháp, điều này được định hướng bằng cách xác định rằng trong trường hợp này, việc giải thích là một thuê bao được ưu tiên so với việc giải thích như một sự cắt lát (đây là trường hợp nếu danh sách lát cắt không chứa lát cắt thích hợp).

Các ngữ nghĩa cho một sự cắt lát như sau. Chính được lập chỉ mục (sử dụng cùng một phương thức

atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
81 làm đăng ký bình thường) với một khóa được xây dựng từ danh sách lát cắt, như sau. Nếu danh sách lát cắt chứa ít nhất một dấu phẩy, chìa khóa là một tuple chứa việc chuyển đổi các mục lát; Mặt khác, việc chuyển đổi mục lát đơn đơn là chìa khóa. Việc chuyển đổi một mục lát cắt là một biểu thức là biểu thức đó. Việc chuyển đổi một lát cắt thích hợp là một đối tượng lát cắt (xem phần phân cấp loại tiêu chuẩn) có các thuộc tính
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
00,
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
01 và
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
02 là các giá trị của các biểu thức được đưa ra dưới dạng giới hạn dưới, giới hạn trên và sải bước, tương ứng, thay thế
generator_expression ::=  "(" expression comp_for ")"
4 cho các biểu thức bị thiếu.The standard type hierarchy) whose
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
00,
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
01 and
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
02 attributes are the values of the expressions given as lower bound, upper bound and stride, respectively, substituting
generator_expression ::=  "(" expression comp_for ")"
4 for missing expressions.

6.3.4. Cuộc gọi vàCalls¶

Một cuộc gọi gọi là đối tượng có thể gọi (ví dụ: một hàm) với một loạt các đối số có thể trống:function) with a possibly empty series of arguments:

atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
6

Một dấu phẩy theo dõi tùy chọn có thể có mặt sau các đối số vị trí và từ khóa nhưng không ảnh hưởng đến ngữ nghĩa.

Chính phải đánh giá thành một đối tượng có thể gọi được (các hàm do người dùng xác định, các hàm tích hợp, phương thức của các đối tượng tích hợp, đối tượng lớp, phương thức của các phiên bản lớp và tất cả các đối tượng có phương thức

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
04 có thể gọi được). Tất cả các biểu thức đối số được đánh giá trước khi cuộc gọi được thực hiện. Vui lòng tham khảo các định nghĩa chức năng phần cho cú pháp của danh sách tham số chính thức.Function definitions for the syntax of formal parameter lists.

Nếu các đối số từ khóa có mặt, trước tiên chúng được chuyển đổi thành các đối số vị trí, như sau. Đầu tiên, một danh sách các vị trí không được lấp đầy được tạo cho các tham số chính thức. Nếu có n đối số vị trí, chúng được đặt trong n khe đầu tiên. Tiếp theo, đối với mỗi đối số từ khóa, mã định danh được sử dụng để xác định vị trí tương ứng (nếu định danh giống như tên tham số chính thức đầu tiên, khe đầu tiên được sử dụng, v.v.). Nếu khe đã được lấp đầy, ngoại lệ

yield_atom       ::=  "(" yield_expression ")"
yield_expression ::=  "yield" [expression_list | "from" expression]
4 sẽ được nâng lên. Mặt khác, giá trị của đối số được đặt trong khe, điền vào nó (ngay cả khi biểu thức là
generator_expression ::=  "(" expression comp_for ")"
4, nó sẽ lấp đầy khe). Khi tất cả các đối số đã được xử lý, các vị trí vẫn chưa được lấp đầy với giá trị mặc định tương ứng từ định nghĩa hàm. (Các giá trị mặc định được tính toán, một lần, khi hàm được xác định; do đó, một đối tượng có thể thay đổi như danh sách hoặc từ điển được sử dụng làm giá trị mặc định thường tránh được.) Nếu có bất kỳ vị trí chưa được thực hiện nào mà không có giá trị mặc định được chỉ định, ngoại lệ
yield_atom       ::=  "(" yield_expression ")"
yield_expression ::=  "yield" [expression_list | "from" expression]
4 được nâng lên. Mặt khác, danh sách các khe đầy được sử dụng làm danh sách đối số cho cuộc gọi.

Chi tiết triển khai CPYThon: Việc triển khai có thể cung cấp các chức năng tích hợp mà các tham số vị trí không có tên, ngay cả khi chúng được đặt tên cho mục đích của tài liệu và do đó không thể được cung cấp bởi từ khóa. Trong Cpython, đây là trường hợp cho các chức năng được thực hiện trong C sử dụng

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
08 để phân tích các đối số của họ. An implementation may provide built-in functions whose positional parameters do not have names, even if they are ‘named’ for the purpose of documentation, and which therefore cannot be supplied by keyword. In CPython, this is the case for functions implemented in C that use
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
08 to parse their arguments.

Nếu có nhiều đối số vị trí hơn có các khe tham số chính thức, ngoại lệ

yield_atom       ::=  "(" yield_expression ")"
yield_expression ::=  "yield" [expression_list | "from" expression]
4 được nâng lên, trừ khi có tham số chính thức sử dụng cú pháp
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
10; Trong trường hợp này, tham số chính thức đó nhận được một tuple chứa các đối số vị trí dư thừa (hoặc một bộ rỗng nếu không có đối số vị trí dư thừa).

Nếu bất kỳ đối số từ khóa nào không tương ứng với tên tham số chính thức, ngoại lệ

yield_atom       ::=  "(" yield_expression ")"
yield_expression ::=  "yield" [expression_list | "from" expression]
4 được nêu ra, trừ khi có tham số chính thức sử dụng cú pháp
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
12; Trong trường hợp này, tham số chính thức đó nhận được một từ điển chứa các đối số từ khóa dư thừa (sử dụng các từ khóa làm khóa và giá trị đối số làm giá trị tương ứng) hoặc từ điển trống (mới) nếu không có đối số từ khóa dư thừa.

Nếu cú ​​pháp

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
13 xuất hiện trong lệnh gọi hàm,
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
14 phải đánh giá thành một điều khác. Các yếu tố từ các vòng lặp này được đối xử như thể chúng là các đối số vị trí bổ sung. Đối với cuộc gọi
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
15, nếu y đánh giá theo trình tự y1, thì, ym, điều này tương đương với một cuộc gọi với các đối số vị trí m+4 x1, x2, y1, ốp, ym, x3, x4.iterable. Elements from these iterables are treated as if they were additional positional arguments. For the call
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
15, if y evaluates to a sequence y1, …, yM, this is equivalent to a call with M+4 positional arguments x1, x2, y1, …, yM, x3, x4.

Hậu quả của điều này là mặc dù cú pháp

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
13 có thể xuất hiện sau các đối số từ khóa rõ ràng, nhưng nó được xử lý trước các đối số từ khóa (và bất kỳ đối số
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
17 nào - xem bên dưới). Vì thế:

atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
7

Điều không bình thường đối với cả đối số từ khóa và cú pháp

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
13 sẽ được sử dụng trong cùng một cuộc gọi, vì vậy trong thực tế, sự nhầm lẫn này không phát sinh.

Nếu cú ​​pháp

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
17 xuất hiện trong lệnh gọi hàm,
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
14 phải đánh giá theo ánh xạ, nội dung được coi là đối số từ khóa bổ sung. Nếu một tham số khớp, một khóa đã được cung cấp một giá trị (bằng một đối số từ khóa rõ ràng hoặc từ một lần giải nén khác), ngoại lệ
yield_atom       ::=  "(" yield_expression ")"
yield_expression ::=  "yield" [expression_list | "from" expression]
4 sẽ được nâng lên.mapping, the contents of which are treated as additional keyword arguments. If a parameter matching a key has already been given a value (by an explicit keyword argument, or from another unpacking), a
yield_atom       ::=  "(" yield_expression ")"
yield_expression ::=  "yield" [expression_list | "from" expression]
4 exception is raised.

Khi

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
17 được sử dụng, mỗi khóa trong ánh xạ này phải là một chuỗi. Mỗi giá trị từ ánh xạ được gán cho tham số chính thức đầu tiên đủ điều kiện cho gán từ khóa có tên bằng khóa. Một khóa không cần phải là một định danh Python (ví dụ:
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
23 có thể chấp nhận được, mặc dù nó sẽ không khớp với bất kỳ tham số chính thức nào có thể được khai báo). Nếu không có khớp với tham số chính thức, cặp giá trị khóa được thu thập bằng tham số
set_display ::=  "{" (starred_list | comprehension) "}"
5, nếu có, hoặc nếu không có, ngoại lệ
yield_atom       ::=  "(" yield_expression ")"
yield_expression ::=  "yield" [expression_list | "from" expression]
4 được nâng lên.

Các tham số chính thức sử dụng cú pháp

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
10 hoặc
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
12 không thể được sử dụng làm khe đối số vị trí hoặc làm tên đối số từ khóa.

Đã thay đổi trong phiên bản 3.5: Các cuộc gọi chức năng Chấp nhận bất kỳ số lượng nào của

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
28 và
set_display ::=  "{" (starred_list | comprehension) "}"
5 Giải nén, các đối số vị trí có thể tuân theo các khoản giải nén không thể sử dụng được (
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
28) và các đối số từ khóa có thể tuân theo việc giải nén từ điển (
set_display ::=  "{" (starred_list | comprehension) "}"
5). Ban đầu được đề xuất bởi PEP 448.Function calls accept any number of
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
28 and
set_display ::=  "{" (starred_list | comprehension) "}"
5 unpackings, positional arguments may follow iterable unpackings (
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
28), and keyword arguments may follow dictionary unpackings (
set_display ::=  "{" (starred_list | comprehension) "}"
5). Originally proposed by PEP 448.

Một cuộc gọi luôn trả về một số giá trị, có thể là

generator_expression ::=  "(" expression comp_for ")"
4, trừ khi nó làm tăng một ngoại lệ. Làm thế nào giá trị này được tính toán phụ thuộc vào loại đối tượng có thể gọi được.

Nếu nó là-

một chức năng do người dùng xác định:

Khối mã cho hàm được thực thi, chuyển nó theo danh sách đối số. Điều đầu tiên mà khối mã sẽ làm là liên kết các tham số chính thức với các đối số; Điều này được mô tả trong các định nghĩa chức năng phần. Khi khối mã thực thi câu lệnh

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
33, điều này chỉ định giá trị trả về của lệnh gọi hàm.Function definitions. When the code block executes a
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
33 statement, this specifies the return value of the function call.

một chức năng hoặc phương pháp tích hợp:

Kết quả là tùy thuộc vào thông dịch viên; Xem các chức năng tích hợp cho các mô tả về các chức năng và phương pháp tích hợp.Built-in Functions for the descriptions of built-in functions and methods.

Một đối tượng lớp:

Một ví dụ mới của lớp đó được trả về.

Phương thức thể hiện lớp:

Hàm do người dùng định nghĩa tương ứng được gọi, với một danh sách đối số dài hơn danh sách đối số của cuộc gọi: phiên bản trở thành đối số đầu tiên.

Một phiên bản lớp:

Lớp phải xác định phương pháp

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
04; Hiệu ứng sau đó giống như khi phương pháp đó được gọi.

6.4. Đang chờ biểu thứcAwait expression¶

Đình chỉ việc thực hiện coroutine trên một đối tượng có thể chờ đợi. Chỉ có thể được sử dụng bên trong một chức năng coroutine.coroutine on an awaitable object. Can only be used inside a coroutine function.

atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
8

Mới trong phiên bản 3.5.

6.5. Nhà điều hành điệnThe power operator¶

Toán tử năng lượng liên kết chặt chẽ hơn các toán tử Unary ở bên trái của nó; Nó liên kết ít chặt chẽ hơn so với các toán tử Unary ở bên phải của nó. Cú pháp là:

atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
9

Do đó, trong một chuỗi các toán tử năng lượng và các toán tử đơn, các toán tử được đánh giá từ phải sang trái (điều này không hạn chế thứ tự đánh giá cho các toán hạng):

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
35 dẫn đến
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
36.

Toán tử năng lượng có cùng ngữ nghĩa với hàm

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
37 tích hợp, khi được gọi với hai đối số: nó mang lại đối số bên trái của nó được nâng lên cho sức mạnh của đối số bên phải của nó. Các đối số số lần đầu tiên được chuyển đổi thành một loại chung và kết quả là loại đó.

Đối với các toán hạng INT, kết quả có cùng loại với các toán hạng trừ khi đối số thứ hai là âm; Trong trường hợp đó, tất cả các đối số được chuyển đổi thành float và kết quả nổi được phân phối. Ví dụ:

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
38 trả về
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
39, nhưng
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
40 trả về
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
41.

Tăng

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
42 lên một sức mạnh tiêu cực dẫn đến
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
43. Tăng một số âm cho một công suất phân số dẫn đến số
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
44. (Trong các phiên bản trước, nó đã tăng
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
02.)

Hoạt động này có thể được tùy chỉnh bằng phương pháp

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
46 đặc biệt.

6.6. Các hoạt động không theo số học và bitwise khôngUnary arithmetic and bitwise operations¶

Tất cả các hoạt động số học và bitwise không có cùng ưu tiên:

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
0

Toán tử

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
47 (trừ) không mang lại sự phủ định của đối số số của nó; Hoạt động có thể được ghi đè với phương pháp đặc biệt
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
48.

Toán tử

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
49 (cộng) không thay đổi đối số số của nó; Hoạt động có thể được ghi đè với phương pháp đặc biệt
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
50.

Toán tử

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
51 (đảo ngược) không mang lại sự đảo ngược bitwise của đối số số nguyên của nó. Sự đảo ngược bitwise của
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
95 được định nghĩa là
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
53. Nó chỉ áp dụng cho các số tích hợp hoặc cho các đối tượng tùy chỉnh ghi đè phương thức đặc biệt
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
54.

Trong cả ba trường hợp, nếu đối số không có loại thích hợp, ngoại lệ

yield_atom       ::=  "(" yield_expression ")"
yield_expression ::=  "yield" [expression_list | "from" expression]
4 sẽ được nêu ra.

6.7. Hoạt động số học nhị phânBinary arithmetic operations¶

Các hoạt động số học nhị phân có mức độ ưu tiên thông thường. Lưu ý rằng một số hoạt động này cũng áp dụng cho một số loại không phải là số. Ngoài toán tử điện, chỉ có hai cấp độ, một cấp cho các toán tử nhân và một cho toán tử phụ gia:

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
1

Toán tử

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
28 (phép nhân) mang lại sản phẩm của các đối số của nó. Các đối số phải cả hai là số hoặc một đối số phải là một số nguyên và một đối số phải là một chuỗi. Trong trường hợp trước, các số được chuyển đổi thành một loại chung và sau đó nhân với nhau. Trong trường hợp sau, sự lặp lại trình tự được thực hiện; Một yếu tố lặp lại tiêu cực mang lại một chuỗi trống.

Hoạt động này có thể được tùy chỉnh bằng các phương thức

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
57 và
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
58 đặc biệt.

Toán tử

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
59 (AT) được dự định sẽ được sử dụng để nhân ma trận. Không có loại Python xây dựng thực hiện toán tử này.

Mới trong phiên bản 3.5.

Các nhà khai thác

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
60 (bộ phận) và
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
61 (phân chia sàn) mang lại thương số cho các lập luận của họ. Các đối số số lần đầu tiên được chuyển đổi thành một loại chung. Sự phân chia số nguyên mang lại một chiếc phao, trong khi phân chia sàn của số nguyên dẫn đến một số nguyên; Kết quả là sự phân chia toán học với chức năng ‘sàn được áp dụng cho kết quả. Phân chia theo 0 làm tăng ngoại lệ
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
43.

Hoạt động này có thể được tùy chỉnh bằng các phương thức

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
63 và
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
64 đặc biệt.

Toán tử

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
65 (modulo) mang lại phần còn lại từ sự phân chia của đối số thứ nhất theo thứ hai. Các đối số số lần đầu tiên được chuyển đổi thành một loại chung. Một đối số đúng không làm tăng ngoại lệ
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
43. Các đối số có thể là số điểm nổi, ví dụ,
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
67 bằng
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
68 (vì
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
69 bằng
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
70.) Toán tử modulo luôn mang lại kết quả với cùng một dấu hiệu với toán hạng thứ hai của nó (hoặc không); Giá trị tuyệt đối của kết quả nhỏ hơn hoàn toàn so với giá trị tuyệt đối của toán hạng thứ hai 1.

Các toán tử phân chia sàn và các toán tử modulo được kết nối bằng danh tính sau:

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
71. Phân chia sàn và modulo cũng được kết nối với chức năng tích hợp
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
72:
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
73. 2.

Ngoài việc thực hiện thao tác modulo trên các số, toán tử

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
65 cũng bị quá tải bởi các đối tượng chuỗi để thực hiện định dạng chuỗi kiểu cũ (còn được gọi là nội suy). Cú pháp cho định dạng chuỗi được mô tả trong tham chiếu thư viện Python, phần định dạng chuỗi kiểu printf.printf-style String Formatting.

Hoạt động modulo có thể được tùy chỉnh bằng phương pháp

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
75 đặc biệt.

Toán tử phân chia sàn, toán tử modulo và hàm

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
72 không được xác định cho các số phức. Thay vào đó, hãy chuyển đổi thành số điểm nổi bằng hàm
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
77 nếu thích hợp.

Toán tử

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
49 (bổ sung) mang lại tổng số đối số của nó. Các đối số phải cả hai là số hoặc cả hai là chuỗi cùng loại. Trong trường hợp trước, các số được chuyển đổi thành một loại chung và sau đó được thêm vào với nhau. Trong trường hợp sau, các chuỗi được nối.

Hoạt động này có thể được tùy chỉnh bằng các phương thức

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
79 và
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
80 đặc biệt.

Toán tử

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
47 (phép trừ) mang lại sự khác biệt của các đối số của nó. Các đối số số lần đầu tiên được chuyển đổi thành một loại chung.

Hoạt động này có thể được tùy chỉnh bằng phương pháp

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
82 đặc biệt.

6.8. Hoạt động thay đổiShifting operations¶

Các hoạt động thay đổi được ưu tiên thấp hơn các hoạt động số học:

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
2

Các nhà khai thác chấp nhận số nguyên làm đối số. Họ chuyển đối số đầu tiên sang trái hoặc phải theo số lượng bit được đưa ra bởi đối số thứ hai.

Hoạt động này có thể được tùy chỉnh bằng các phương thức

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
83 và
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
84 đặc biệt.

Một sự thay đổi đúng bởi n bit được định nghĩa là phân chia sàn bởi

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
85. Một sự thay đổi bên trái theo n bit được định nghĩa là nhân với
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
85.

6.9. Hoạt động bitwise nhị phânBinary bitwise operations¶

Mỗi trong ba hoạt động bitwise có mức độ ưu tiên khác nhau:

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
3

Toán tử

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
87 mang lại bitwise và của các đối số của nó, phải là số nguyên hoặc một trong số chúng phải là một đối tượng tùy chỉnh ghi đè
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
88 hoặc
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
89 Các phương thức đặc biệt.

Toán tử

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
90 mang lại XOR bitwise (độc quyền hoặc) của các đối số của nó, phải là số nguyên hoặc một trong số chúng phải là một đối tượng tùy chỉnh ghi đè
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
91 hoặc
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
92 Các phương thức đặc biệt.

Toán tử

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
93 mang lại bitwise (bao gồm) hoặc của các đối số của nó, phải là số nguyên hoặc một trong số chúng phải là một đối tượng tùy chỉnh ghi đè
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
94 hoặc
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
95 Các phương thức đặc biệt.

6.10. So sánh lorComparisons¶

Không giống như C, tất cả các hoạt động so sánh trong Python đều có cùng mức độ ưu tiên, thấp hơn so với bất kỳ hoạt động số học, dịch chuyển hoặc bitwise nào. Cũng không giống như C, các biểu thức như

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
96 có cách giải thích thông thường trong toán học:

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
4

So sánh mang lại giá trị boolean:

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
97 hoặc
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
98. Phương pháp so sánh phong phú tùy chỉnh có thể trả về các giá trị phi Boolean. Trong trường hợp này, Python sẽ gọi
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
99 về giá trị đó trong bối cảnh Boolean.

So sánh có thể được chuỗi tùy ý, ví dụ,

parenth_form ::=  "(" [starred_expression] ")"
00 tương đương với
parenth_form ::=  "(" [starred_expression] ")"
01, ngoại trừ
parenth_form ::=  "(" [starred_expression] ")"
02 chỉ được đánh giá một lần (nhưng trong cả hai trường hợp
parenth_form ::=  "(" [starred_expression] ")"
03 hoàn toàn không được đánh giá khi
parenth_form ::=  "(" [starred_expression] ")"
04 được tìm thấy là sai).

Chính thức, nếu A, B, C, xông, Y, Z là biểu thức và OP1, OP2, Mạnh, OPN là các toán tử so sánh, sau đó

parenth_form ::=  "(" [starred_expression] ")"
05 tương đương với
parenth_form ::=  "(" [starred_expression] ")"
06, ngoại trừ mỗi biểu thức được đánh giá nhiều nhất một lần.

Lưu ý rằng

parenth_form ::=  "(" [starred_expression] ")"
07 không có nghĩa là bất kỳ loại so sánh nào giữa A và C, do đó, ví dụ,
parenth_form ::=  "(" [starred_expression] ")"
08 là hoàn toàn hợp pháp (mặc dù có lẽ không đẹp).

6.10.1. So sánh giá trịValue comparisons¶

Các toán tử

parenth_form ::=  "(" [starred_expression] ")"
09,
parenth_form ::=  "(" [starred_expression] ")"
10,
parenth_form ::=  "(" [starred_expression] ")"
11,
parenth_form ::=  "(" [starred_expression] ")"
12,
parenth_form ::=  "(" [starred_expression] ")"
13 và
parenth_form ::=  "(" [starred_expression] ")"
14 So sánh các giá trị của hai đối tượng. Các đối tượng không cần phải có cùng loại.

Các đối tượng, giá trị và loại chương nói rằng các đối tượng có giá trị (ngoài loại và danh tính). Giá trị của một đối tượng là một khái niệm khá trừu tượng trong Python: ví dụ, không có phương thức truy cập kinh điển nào cho một giá trị đối tượng. Ngoài ra, không có yêu cầu rằng giá trị của một đối tượng nên được xây dựng theo một cách cụ thể, ví dụ: bao gồm tất cả các thuộc tính dữ liệu của nó. Các toán tử so sánh thực hiện một khái niệm cụ thể về giá trị của một đối tượng là gì. Người ta có thể nghĩ về chúng là xác định giá trị của một đối tượng một cách gián tiếp, bằng cách thực hiện so sánh của chúng.Objects, values and types states that objects have a value (in addition to type and identity). The value of an object is a rather abstract notion in Python: For example, there is no canonical access method for an object’s value. Also, there is no requirement that the value of an object should be constructed in a particular way, e.g. comprised of all its data attributes. Comparison operators implement a particular notion of what the value of an object is. One can think of them as defining the value of an object indirectly, by means of their comparison implementation.

Bởi vì tất cả các loại là các phân nhóm (trực tiếp hoặc gián tiếp) của

parenth_form ::=  "(" [starred_expression] ")"
15, chúng thừa hưởng hành vi so sánh mặc định từ
parenth_form ::=  "(" [starred_expression] ")"
15. Các loại có thể tùy chỉnh hành vi so sánh của chúng bằng cách thực hiện các phương pháp so sánh phong phú như
parenth_form ::=  "(" [starred_expression] ")"
17, được mô tả trong tùy chỉnh cơ bản.Basic customization.

Hành vi mặc định để so sánh bình đẳng (

parenth_form ::=  "(" [starred_expression] ")"
11 và
parenth_form ::=  "(" [starred_expression] ")"
14) dựa trên danh tính của các đối tượng. Do đó, so sánh bình đẳng của các trường hợp có cùng nhận dạng dẫn đến sự bình đẳng và so sánh bình đẳng của các trường hợp với các danh tính khác nhau dẫn đến bất bình đẳng. Một động lực cho hành vi mặc định này là mong muốn rằng tất cả các đối tượng phải là phản xạ (nghĩa là
parenth_form ::=  "(" [starred_expression] ")"
20 ngụ ý
parenth_form ::=  "(" [starred_expression] ")"
21).

Một so sánh đơn hàng mặc định (

parenth_form ::=  "(" [starred_expression] ")"
09,
parenth_form ::=  "(" [starred_expression] ")"
10,
parenth_form ::=  "(" [starred_expression] ")"
13 và
parenth_form ::=  "(" [starred_expression] ")"
12) không được cung cấp; Một nỗ lực tăng
yield_atom       ::=  "(" yield_expression ")"
yield_expression ::=  "yield" [expression_list | "from" expression]
4. Một động lực cho hành vi mặc định này là thiếu một bất biến tương tự như đối với sự bình đẳng.

Hành vi của so sánh bình đẳng mặc định, rằng các trường hợp với các danh tính khác nhau luôn không đồng đều, có thể trái ngược với những loại sẽ cần có định nghĩa hợp lý về giá trị đối tượng và bình đẳng dựa trên giá trị. Các loại như vậy sẽ cần phải tùy chỉnh hành vi so sánh của họ, và trên thực tế, một số loại tích hợp đã thực hiện điều đó.

Danh sách sau đây mô tả hành vi so sánh của các loại tích hợp quan trọng nhất.

  • Số lượng các loại số tích hợp (loại số-int, float, phức tạp) và các loại thư viện tiêu chuẩn

    parenth_form ::=  "(" [starred_expression] ")"
    
    27 và
    parenth_form ::=  "(" [starred_expression] ")"
    
    28 có thể được so sánh trong và trên các loại của chúng, với hạn chế các số phức tạp không hỗ trợ so sánh thứ tự. Trong giới hạn của các loại liên quan, chúng so sánh chính xác về mặt toán học (về mặt thuật toán) mà không mất độ chính xác.Numeric Types — int, float, complex) and of the standard library types
    parenth_form ::=  "(" [starred_expression] ")"
    
    27 and
    parenth_form ::=  "(" [starred_expression] ")"
    
    28 can be compared within and across their types, with the restriction that complex numbers do not support order comparison. Within the limits of the types involved, they compare mathematically (algorithmically) correct without loss of precision.

    Các giá trị không phải là một số

    parenth_form ::=  "(" [starred_expression] ")"
    
    29 và
    parenth_form ::=  "(" [starred_expression] ")"
    
    30 là đặc biệt. Bất kỳ sự so sánh được đặt hàng của một số với một giá trị không một số là sai. Một hàm ý phản trực giác là các giá trị không phải là một số không bằng với chính chúng. Ví dụ: nếu
    parenth_form ::=  "(" [starred_expression] ")"
    
    31,
    parenth_form ::=  "(" [starred_expression] ")"
    
    32,
    parenth_form ::=  "(" [starred_expression] ")"
    
    33 và
    parenth_form ::=  "(" [starred_expression] ")"
    
    34 đều sai, trong khi
    parenth_form ::=  "(" [starred_expression] ")"
    
    35 là đúng. Hành vi này tuân thủ IEEE 754.

  • generator_expression ::=  "(" expression comp_for ")"
    
    4 và
    parenth_form ::=  "(" [starred_expression] ")"
    
    37 là những người độc thân. PEP 8 khuyên rằng các so sánh cho các singletons phải luôn luôn được thực hiện với
    parenth_form ::=  "(" [starred_expression] ")"
    
    38 hoặc
    parenth_form ::=  "(" [starred_expression] ")"
    
    39, không bao giờ là nhà khai thác bình đẳng.PEP 8 advises that comparisons for singletons should always be done with
    parenth_form ::=  "(" [starred_expression] ")"
    
    38 or
    parenth_form ::=  "(" [starred_expression] ")"
    
    39, never the equality operators.

  • Trình tự nhị phân (các trường hợp của

    parenth_form ::=  "(" [starred_expression] ")"
    
    40 hoặc
    parenth_form ::=  "(" [starred_expression] ")"
    
    41) có thể được so sánh trong và trên các loại của chúng. Họ so sánh từ vựng bằng cách sử dụng các giá trị số của các yếu tố của chúng.

  • Các chuỗi (các trường hợp của

    atom      ::=  identifier | literal | enclosure
    enclosure ::=  parenth_form | list_display | dict_display | set_display
                   | generator_expression | yield_atom
    
    90) so sánh từ vựng bằng cách sử dụng các điểm mã unicode số (kết quả của hàm tích hợp
    parenth_form ::=  "(" [starred_expression] ")"
    
    43) của các ký tự của chúng. 3

    Chuỗi và trình tự nhị phân không thể được so sánh trực tiếp.

  • Trình tự (các trường hợp của

    atom      ::=  identifier | literal | enclosure
    enclosure ::=  parenth_form | list_display | dict_display | set_display
                   | generator_expression | yield_atom
    
    85,
    atom      ::=  identifier | literal | enclosure
    enclosure ::=  parenth_form | list_display | dict_display | set_display
                   | generator_expression | yield_atom
    
    91 hoặc
    parenth_form ::=  "(" [starred_expression] ")"
    
    46) chỉ có thể được so sánh trong mỗi loại của chúng, với hạn chế rằng phạm vi không hỗ trợ so sánh thứ tự. So sánh bình đẳng giữa các loại này dẫn đến bất bình đẳng và việc so sánh đặt hàng giữa các loại này tăng
    yield_atom       ::=  "(" yield_expression ")"
    yield_expression ::=  "yield" [expression_list | "from" expression]
    
    4.

    Trình tự so sánh từ vựng bằng cách sử dụng so sánh các yếu tố tương ứng. Các thùng chứa tích hợp thường giả sử các đối tượng giống hệt nhau bằng với chính chúng. Điều đó cho phép họ bỏ qua các bài kiểm tra bình đẳng cho các đối tượng giống hệt nhau để cải thiện hiệu suất và duy trì các bất biến nội bộ của chúng.

    So sánh từ vựng giữa các bộ sưu tập tích hợp hoạt động như sau:

    • Đối với hai bộ sưu tập để so sánh bằng nhau, chúng phải cùng loại, có cùng độ dài và mỗi cặp phần tử tương ứng phải so sánh bằng nhau (ví dụ,

      parenth_form ::=  "(" [starred_expression] ")"
      
      48 là sai vì loại không giống nhau).

    • Các bộ sưu tập hỗ trợ so sánh thứ tự được đặt hàng giống như các yếu tố không đồng đều đầu tiên của chúng (ví dụ,

      parenth_form ::=  "(" [starred_expression] ")"
      
      49 có cùng giá trị với
      parenth_form ::=  "(" [starred_expression] ")"
      
      50). Nếu một phần tử tương ứng không tồn tại, bộ sưu tập ngắn hơn được đặt hàng đầu tiên (ví dụ:
      parenth_form ::=  "(" [starred_expression] ")"
      
      51 là đúng).

  • Ánh xạ (các trường hợp của

    atom      ::=  identifier | literal | enclosure
    enclosure ::=  parenth_form | list_display | dict_display | set_display
                   | generator_expression | yield_atom
    
    87) so sánh bằng nhau khi và chỉ khi chúng có các cặp bằng nhau (khóa, giá trị). So sánh bình đẳng của các khóa và giá trị thực thi tính phản xạ.

    So sánh đơn hàng (

    parenth_form ::=  "(" [starred_expression] ")"
    
    09,
    parenth_form ::=  "(" [starred_expression] ")"
    
    10,
    parenth_form ::=  "(" [starred_expression] ")"
    
    13 và
    parenth_form ::=  "(" [starred_expression] ")"
    
    12) tăng
    yield_atom       ::=  "(" yield_expression ")"
    yield_expression ::=  "yield" [expression_list | "from" expression]
    
    4.

  • Các bộ (các trường hợp của

    parenth_form ::=  "(" [starred_expression] ")"
    
    58 hoặc
    parenth_form ::=  "(" [starred_expression] ")"
    
    59) có thể được so sánh trong và trên các loại của chúng.

    Họ xác định các toán tử so sánh đơn hàng có nghĩa là các bài kiểm tra tập hợp con và superset. Những mối quan hệ này không xác định tổng số thứ tự (ví dụ: hai bộ

    parenth_form ::=  "(" [starred_expression] ")"
    
    60 và
    parenth_form ::=  "(" [starred_expression] ")"
    
    61 không bằng nhau, cũng không phải là tập hợp của nhau, cũng không phải là siêu của nhau). Theo đó, các tập hợp không phải là đối số phù hợp cho các chức năng phụ thuộc vào tổng số đặt hàng (ví dụ:
    parenth_form ::=  "(" [starred_expression] ")"
    
    62,
    parenth_form ::=  "(" [starred_expression] ")"
    
    63 và
    parenth_form ::=  "(" [starred_expression] ")"
    
    64 tạo ra kết quả không xác định được đưa ra danh sách các bộ làm đầu vào).

    So sánh các bộ thực thi tính phản xạ của các yếu tố của nó.

  • Hầu hết các loại tích hợp khác không có phương pháp so sánh được thực hiện, vì vậy chúng thừa hưởng hành vi so sánh mặc định.

Các lớp do người dùng xác định tùy chỉnh hành vi so sánh của họ nên tuân theo một số quy tắc nhất quán, nếu có thể:

  • So sánh bình đẳng nên là phản xạ. Nói cách khác, các đối tượng giống hệt nhau nên so sánh bằng nhau:

    parenth_form ::=  "(" [starred_expression] ")"
    
    20 ngụ ý
    parenth_form ::=  "(" [starred_expression] ")"
    
    21

  • So sánh nên đối xứng. Nói cách khác, các biểu thức sau đây phải có cùng kết quả:

    parenth_form ::=  "(" [starred_expression] ")"
    
    21 và
    parenth_form ::=  "(" [starred_expression] ")"
    
    68

    parenth_form ::=  "(" [starred_expression] ")"
    
    69 và
    parenth_form ::=  "(" [starred_expression] ")"
    
    70

    parenth_form ::=  "(" [starred_expression] ")"
    
    04 và
    parenth_form ::=  "(" [starred_expression] ")"
    
    72

    parenth_form ::=  "(" [starred_expression] ")"
    
    50 và
    parenth_form ::=  "(" [starred_expression] ")"
    
    74

  • So sánh nên được chuyển tiếp. Các ví dụ sau (không khởi công) minh họa rằng:

    parenth_form ::=  "(" [starred_expression] ")"
    
    75 ngụ ý
    parenth_form ::=  "(" [starred_expression] ")"
    
    76

    parenth_form ::=  "(" [starred_expression] ")"
    
    01 ngụ ý
    parenth_form ::=  "(" [starred_expression] ")"
    
    78

  • So sánh nghịch đảo nên dẫn đến phủ định boolean. Nói cách khác, các biểu thức sau đây phải có cùng kết quả:

    parenth_form ::=  "(" [starred_expression] ")"
    
    21 và
    parenth_form ::=  "(" [starred_expression] ")"
    
    80

    parenth_form ::=  "(" [starred_expression] ")"
    
    04 và
    parenth_form ::=  "(" [starred_expression] ")"
    
    82 (để đặt hàng tổng số)

    parenth_form ::=  "(" [starred_expression] ")"
    
    83 và
    parenth_form ::=  "(" [starred_expression] ")"
    
    84 (để đặt hàng tổng số)

    Hai biểu thức cuối cùng áp dụng cho các bộ sưu tập hoàn toàn được đặt hàng (ví dụ: các chuỗi, nhưng không đặt ra các bộ hoặc ánh xạ). Xem thêm Công cụ trang trí

    parenth_form ::=  "(" [starred_expression] ")"
    
    85.

  • Kết quả

    parenth_form ::=  "(" [starred_expression] ")"
    
    86 phải phù hợp với sự bình đẳng. Các đối tượng bằng nhau nên có cùng giá trị băm, hoặc được đánh dấu là không thể.

Python không thực thi các quy tắc nhất quán này. Trên thực tế, các giá trị không có số là một ví dụ cho việc không tuân theo các quy tắc này.

6.10.2. Hoạt động kiểm tra thành viênMembership test operations¶

Các nhà khai thác

parenth_form ::=  "(" [starred_expression] ")"
87 và
parenth_form ::=  "(" [starred_expression] ")"
88 Kiểm tra thành viên.
parenth_form ::=  "(" [starred_expression] ")"
89 đánh giá thành
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
97 nếu X là thành viên của S và
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
98 nếu không.
parenth_form ::=  "(" [starred_expression] ")"
92 Trả về sự phủ định của
parenth_form ::=  "(" [starred_expression] ")"
93. Tất cả các chuỗi tích hợp và các loại đặt hỗ trợ điều này cũng như từ điển, trong đó
parenth_form ::=  "(" [starred_expression] ")"
87 kiểm tra xem từ điển có khóa nhất định hay không. Đối với các loại container như Danh sách, Tuple, Set, Frozenset, Dict hoặc Collections.Deque, biểu thức
parenth_form ::=  "(" [starred_expression] ")"
95 tương đương với
parenth_form ::=  "(" [starred_expression] ")"
96.

Đối với các loại chuỗi và byte,

parenth_form ::=  "(" [starred_expression] ")"
95 là
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
97 khi và chỉ khi x là một chuỗi con của y. Một thử nghiệm tương đương là
parenth_form ::=  "(" [starred_expression] ")"
99. Các chuỗi trống luôn được coi là một chuỗi con của bất kỳ chuỗi nào khác, vì vậy
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
00 sẽ trả về
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
97.

Đối với các lớp do người dùng xác định xác định phương thức

comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
02,
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
03 trả về
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
97 nếu
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
05 trả về giá trị thực và
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
98 khác.

Đối với các lớp do người dùng xác định không xác định

comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
02 nhưng xác định
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
08,
parenth_form ::=  "(" [starred_expression] ")"
95 là
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
97 nếu một số giá trị
parenth_form ::=  "(" [starred_expression] ")"
03, trong đó biểu thức
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
12 là đúng, được tạo ra trong khi lặp lại trên
parenth_form ::=  "(" [starred_expression] ")"
02. Nếu một ngoại lệ được nâng lên trong quá trình lặp, như thể
parenth_form ::=  "(" [starred_expression] ")"
87 đã nêu ra ngoại lệ đó.

Cuối cùng, giao thức lặp kiểu cũ được thử: nếu một lớp xác định

atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
81,
parenth_form ::=  "(" [starred_expression] ")"
95 là
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
97 khi và chỉ khi có chỉ số số nguyên không âm I sao cho
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
18 và không có chỉ số số nguyên thấp hơn làm tăng ngoại lệ
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
19. (Nếu bất kỳ ngoại lệ nào khác được nâng lên, như thể
parenth_form ::=  "(" [starred_expression] ")"
87 đã nêu ra ngoại lệ đó).

Nhà điều hành

parenth_form ::=  "(" [starred_expression] ")"
88 được xác định là có giá trị sự thật nghịch đảo là
parenth_form ::=  "(" [starred_expression] ")"
87.

6.10.3. So sánh danh tínhIdentity comparisons¶

Các toán tử

parenth_form ::=  "(" [starred_expression] ")"
38 và
parenth_form ::=  "(" [starred_expression] ")"
39 cho một đối tượng Nhận dạng:
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
25 là đúng khi và chỉ khi X và Y là cùng một đối tượng. Danh tính của đối tượng được xác định bằng cách sử dụng hàm
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
26.
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
27 mang lại giá trị sự thật nghịch đảo. 4

6.11. Hoạt động BooleanBoolean operations¶

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
5

Trong bối cảnh của các hoạt động Boolean, và cả khi các biểu thức được sử dụng bởi các câu lệnh luồng điều khiển, các giá trị sau được hiểu là sai:

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
98,
generator_expression ::=  "(" expression comp_for ")"
4, số 0 của tất cả , bộ và đông lạnh). Tất cả các giá trị khác được hiểu là đúng. Các đối tượng do người dùng xác định có thể tùy chỉnh giá trị sự thật của chúng bằng cách cung cấp phương thức
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
30.

Nhà điều hành

comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
31 mang lại
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
97 nếu đối số của nó là sai,
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
98 khác.

Biểu thức

comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
34 đầu tiên đánh giá x; Nếu x là sai, giá trị của nó được trả về; Mặt khác, y được đánh giá và giá trị kết quả được trả về.

Biểu thức

comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
35 đầu tiên đánh giá x; Nếu x là đúng, giá trị của nó được trả về; Mặt khác, y được đánh giá và giá trị kết quả được trả về.

Lưu ý rằng cả

comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
36 và
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
37 đều không hạn chế giá trị và loại họ trở lại
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
98 và
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
97, mà thay vào đó trả về đối số được đánh giá cuối cùng. Điều này đôi khi hữu ích, ví dụ: nếu
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
40 là một chuỗi cần được thay thế bằng giá trị mặc định nếu trống, biểu thức
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
41 mang lại giá trị mong muốn. Vì
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
31 phải tạo ra một giá trị mới, nó trả về giá trị boolean bất kể loại đối số của nó (ví dụ:
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
43 tạo ra
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
98 thay vì
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
45.)

6.12. Biểu thức phân côngAssignment expressions¶

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
6

Một biểu thức gán (đôi khi còn được gọi là một biểu thức có tên là hay hay Walrus Walrus) gán một

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
14 cho
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
47, đồng thời trả về giá trị của
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
14.

Một trường hợp sử dụng phổ biến là khi xử lý các biểu thức thông thường phù hợp:

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
7

Hoặc, khi xử lý luồng tệp trong các đoạn:

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
8

Các biểu thức gán phải được bao quanh bởi dấu ngoặc đơn khi được sử dụng làm biểu hiện phụ trong việc cắt lát, có điều kiện, lambda, từ khóa và biểu thức hiểu và hiểu và trong các câu lệnh

comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
49 và
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
50. Ở tất cả các nơi khác mà chúng có thể được sử dụng, dấu ngoặc đơn không bắt buộc, bao gồm cả trong các câu lệnh
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
2 và
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
52.

Mới trong phiên bản 3.8: Xem PEP 572 để biết thêm chi tiết về các biểu thức gán.See PEP 572 for more details about assignment expressions.

6.13. Biểu thức có điều kiệnConditional expressions¶

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
9

Các biểu thức có điều kiện (đôi khi được gọi là toán tử ternary của người Hồi giáo) có mức độ ưu tiên thấp nhất trong tất cả các hoạt động của Python.

Biểu thức

comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
53 trước tiên đánh giá điều kiện, c chứ không phải x. Nếu C là đúng, x được đánh giá và giá trị của nó được trả về; Nếu không, y được đánh giá và giá trị của nó được trả về.

Xem PEP 308 để biết thêm chi tiết về biểu thức có điều kiện.PEP 308 for more details about conditional expressions.

6.14. Lambdas¶Lambdas¶

parenth_form ::=  "(" [starred_expression] ")"
0

Các biểu thức Lambda (đôi khi được gọi là dạng lambda) được sử dụng để tạo các hàm ẩn danh. Biểu thức

comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
54 mang lại một đối tượng hàm. Đối tượng không tên hoạt động giống như một đối tượng hàm được xác định với:

parenth_form ::=  "(" [starred_expression] ")"
1

Xem phần Định nghĩa chức năng cho cú pháp của danh sách tham số. Lưu ý rằng các chức năng được tạo bằng các biểu thức Lambda không thể chứa các câu lệnh hoặc chú thích.Function definitions for the syntax of parameter lists. Note that functions created with lambda expressions cannot contain statements or annotations.

6.15. Danh sách biểu hiệnExpression lists¶

parenth_form ::=  "(" [starred_expression] ")"
2

Ngoại trừ khi một phần của danh sách hoặc màn hình đặt, một danh sách biểu thức chứa ít nhất một dấu phẩy mang lại một tuple. Độ dài của tuple là số lượng biểu thức trong danh sách. Các biểu thức được đánh giá từ trái sang phải.

Một dấu hoa thị

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
28 biểu thị khả năng giải nén. Toán tử của nó phải là một điều không thể. Các ITEBLE được mở rộng thành một chuỗi các mục, được bao gồm trong bộ tuple, danh sách hoặc bộ mới, tại trang web của việc giải nén.iterable. The iterable is expanded into a sequence of items, which are included in the new tuple, list, or set, at the site of the unpacking.

Mới trong phiên bản 3.5: Khả năng giải nén trong danh sách biểu thức, ban đầu được đề xuất bởi PEP 448.Iterable unpacking in expression lists, originally proposed by PEP 448.

Dấu phẩy kéo dài chỉ được yêu cầu để tạo ra một tuple duy nhất (a.k.a. một singleton); Đó là tùy chọn trong tất cả các trường hợp khác. Một biểu thức duy nhất không có dấu phẩy kéo dài không tạo ra một tuple, mà là mang lại giá trị của biểu thức đó. (Để tạo một tuple trống, hãy sử dụng một cặp dấu ngoặc đơn trống:

comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
56.)

6.16. Đơn đặt hàng đánh giáEvaluation order¶

Python đánh giá các biểu thức từ trái sang phải. Lưu ý rằng trong khi đánh giá một nhiệm vụ, phía bên phải được đánh giá trước phía bên trái.

Trong các dòng sau, các biểu thức sẽ được đánh giá theo thứ tự số học của hậu tố của chúng:

parenth_form ::=  "(" [starred_expression] ")"
3

6.17. Ưu tiên điều hành¶Operator precedence¶

Bảng sau đây tóm tắt sự ưu tiên của toán tử trong Python, từ ưu tiên cao nhất (nhất là ràng buộc) đến ưu tiên thấp nhất (ít ràng buộc nhất). Người vận hành trong cùng một hộp có cùng mức độ ưu tiên. Trừ khi cú pháp được đưa ra một cách rõ ràng, các toán tử là nhị phân. Các nhà khai thác trong cùng một nhóm hộp từ trái sang phải (ngoại trừ số mũ, nhóm từ phải sang trái).

Lưu ý rằng so sánh, kiểm tra thành viên và kiểm tra danh tính, tất cả đều có cùng mức độ ưu tiên và có tính năng chuỗi từ trái sang phải như được mô tả trong phần so sánh.Comparisons section.

Nhà điều hành

Sự mô tả

comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
57,

comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
58,
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
59,
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
60

Biểu thức ràng buộc hoặc dấu ngoặc đơn, hiển thị danh sách, hiển thị từ điển, đặt màn hình

comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
61,
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
62,
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
63,
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
64

Đăng ký, cắt, cuộc gọi, tham chiếu thuộc tính

comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
65

Đang chờ biểu hiện

set_display ::=  "{" (starred_list | comprehension) "}"
5

Số mũ 5

comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
67,
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
68,
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
69

Tích cực, tiêu cực, bitwise không

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
28,
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
59,
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
60,
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
61,
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
65

Phép nhân, phép nhân ma trận, phân chia, phân chia sàn, phần còn lại 6

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
49,
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
47

Cộng và trừ

comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
77,
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
78

Sự thay đổi

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
87

Bitwise và

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
90

BitWise XOR

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
93

Bitwise hoặc

parenth_form ::=  "(" [starred_expression] ")"
87,
parenth_form ::=  "(" [starred_expression] ")"
88,
parenth_form ::=  "(" [starred_expression] ")"
38,
parenth_form ::=  "(" [starred_expression] ")"
39,
parenth_form ::=  "(" [starred_expression] ")"
09,
parenth_form ::=  "(" [starred_expression] ")"
13,
parenth_form ::=  "(" [starred_expression] ")"
10,
parenth_form ::=  "(" [starred_expression] ")"
12,
parenth_form ::=  "(" [starred_expression] ")"
14,
parenth_form ::=  "(" [starred_expression] ")"
11

So sánh, bao gồm các bài kiểm tra thành viên và bài kiểm tra danh tính

comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
92

Boolean không

comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
36

Boolean và

comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
37

Boolean hoặc

comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
2 -
comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
96

Biểu thức điều kiện

comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
97

Biểu hiện Lambda

comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
98

Biểu thức gán

Chú thích

1

Mặc dù

comprehension ::=  assignment_expression comp_for
comp_for      ::=  ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter     ::=  comp_for | comp_if
comp_if       ::=  "if" or_test [comp_iter]
99 là toán học thực sự, nhưng đối với phao có thể không đúng về số lượng do Roundoff. Ví dụ, và giả sử một nền tảng mà một chiếc phao python là số chính xác kép của IEEE 754, để
list_display ::=  "[" [starred_list | comprehension] "]"
00 có cùng dấu với
list_display ::=  "[" [starred_list | comprehension] "]"
01, kết quả được tính toán là
list_display ::=  "[" [starred_list | comprehension] "]"
02, có số chính xác bằng
list_display ::=  "[" [starred_list | comprehension] "]"
01. Hàm
list_display ::=  "[" [starred_list | comprehension] "]"
04 trả về một kết quả có dấu hiệu khớp với dấu hiệu của đối số đầu tiên và do đó trả về
list_display ::=  "[" [starred_list | comprehension] "]"
05 trong trường hợp này. Cách tiếp cận nào phù hợp hơn phụ thuộc vào ứng dụng.

2

Nếu X rất gần với bội số chính xác của y, thì

list_display ::=  "[" [starred_list | comprehension] "]"
06 có thể lớn hơn
list_display ::=  "[" [starred_list | comprehension] "]"
07 do làm tròn. Trong những trường hợp như vậy, Python trả về kết quả sau, để bảo tồn rằng
list_display ::=  "[" [starred_list | comprehension] "]"
08 rất gần với
atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display | dict_display | set_display
               | generator_expression | yield_atom
95.

3

Tiêu chuẩn Unicode phân biệt giữa các điểm mã (ví dụ: U+0041) và các ký tự trừu tượng (ví dụ: chữ hoa Latin Latin A). Mặc dù hầu hết các ký tự trừu tượng trong Unicode chỉ được biểu diễn bằng một điểm mã, có một số ký tự trừu tượng có thể được biểu diễn bằng cách sử dụng một chuỗi nhiều hơn một điểm mã. Ví dụ, ký tự trừu tượng chữ Latin Latin Capital C với Cedilla có thể được biểu diễn dưới dạng một ký tự được định trước duy nhất tại vị trí mã U+00C7, hoặc là một chuỗi của một ký tự cơ sở tại vị trí mã U+0043 (chữ cái Latin Capital C), tiếp theo là một ký tự kết hợp tại vị trí mã U+0327 (kết hợp Cedilla).

Các toán tử so sánh trên các chuỗi so sánh ở cấp độ của các điểm mã Unicode. Điều này có thể phản trực giác với con người. Ví dụ,

list_display ::=  "[" [starred_list | comprehension] "]"
10 là
literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
98, mặc dù cả hai chuỗi đều đại diện cho cùng một ký tự trừu tượng chữ Latin Latin Capital C với Cedilla.

Để so sánh các chuỗi ở cấp độ của các ký tự trừu tượng (nghĩa là, theo cách trực quan với con người), hãy sử dụng

list_display ::=  "[" [starred_list | comprehension] "]"
12.

4

Do thu thập rác tự động, danh sách miễn phí và tính chất động của các mô tả, bạn có thể nhận thấy hành vi dường như bất thường trong một số cách sử dụng của toán tử

parenth_form ::=  "(" [starred_expression] ")"
38, giống như những người liên quan đến so sánh giữa các phương thức thể hiện hoặc hằng số. Kiểm tra tài liệu của họ để biết thêm thông tin.

5

Toán tử năng lượng

set_display ::=  "{" (starred_list | comprehension) "}"
5 liên kết ít chặt chẽ hơn một toán tử số học hoặc bitwise unary ở bên phải của nó, nghĩa là
list_display ::=  "[" [starred_list | comprehension] "]"
15 là
list_display ::=  "[" [starred_list | comprehension] "]"
16.

6

Toán tử

literal ::=  stringliteral | bytesliteral
             | integer | floatnumber | imagnumber
65 cũng được sử dụng để định dạng chuỗi; Ưu tiên tương tự được áp dụng.