Ghi chú cú pháp. Trong chương này và các chương tiếp theo, 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. When [one alternative of] a syntax rule has the form
name ::= othername
and no semantics are given, the semantics of this form of
parenth_form ::= "[" [starred_expression
] "]"
4 are the same as for parenth_form ::= "[" [starred_expression
] "]"
56. 1. Arithmetic conversions
When a description of an arithmetic operator below uses the phrase “the numeric arguments are converted to a common type”, this means that the operator implementation for built-in types works as follows
If either argument is a complex number, the other is converted to complex;
otherwise, if either argument is a floating point number, the other is converted to floating point;
otherwise, both must be integers and no conversion is necessary
Some additional rules apply for certain operators [e. g. , a string as a left argument to the ‘%’ operator]. Extensions must define their own conversion behavior
6. 2. Atoms
Atoms are the most basic elements of expressions. The simplest atoms are identifiers or literals. Forms enclosed in parentheses, brackets or braces are also categorized syntactically as atoms. The syntax for atoms is
atom ::=identifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
6. 2. 1. Identifiers [Names]
An identifier occurring as an atom is a name. See section for lexical definition and section for documentation of naming and binding
When the name is bound to an object, evaluation of the atom yields that object. When a name is not bound, an attempt to evaluate it raises a exception
Private name mangling. 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 done6. 2. 2. Literals
Python supports string and bytes literals and various numeric literals
literal ::=stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Evaluation of a literal yields an object of the given type [string, bytes, integer, floating point number, complex number] with the given value. The value may be approximated in the case of floating point and imaginary [complex] literals. See section 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 đó, danh tính của đối tượng ít quan trọng hơn giá trị của nó. Nhiều đánh giá của các chữ có cùng giá trị [cùng một lần xuất hiện trong văn bản chương trình hoặc một lần xuất hiện khác] có thể thu được cùng một đối tượng hoặc một đối tượng khác có cùng giá trị
6. 2. 3. Biểu mẫu được đặt trong ngoặc đơn
Biểu mẫu có dấu ngoặc đơn là danh sách biểu thức tùy chọn được đặt trong dấu ngoặc đơn
parenth_form ::= "[" [starred_expression
] "]"
A parenthesized expression list yields whatever that expression list yields. nếu danh sách chứa ít nhất một dấu phẩy, thì nó tạo ra một bộ;
Một cặp dấu ngoặc rỗng tạo ra 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 nghĩa đen được áp dụng [i. e. , hai lần xuất hiện của bộ dữ liệu 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 dấu ngoặc đơn, mà bằng cách sử dụng dấu phẩy. Ngoại lệ là bộ dữ liệu trống, trong đó bắt buộc phải có dấu ngoặc đơn — việc cho phép “không có gì” không được đặt trong ngoặc đơn trong các biểu thức sẽ gây ra sự mơ hồ và cho phép các lỗi đánh máy phổ biến không được phát hiện
6. 2. 4. Hiển thị cho danh sách, bộ và từ điển
Để xây dựng một danh sách, một tập hợp hoặc một từ điển, Python cung cấp cú pháp đặc biệt gọi là "hiển thị", mỗi cú pháp có hai loại
either the container contents are listed explicitly, or
they are computed via a set of looping and filtering instructions, called a comprehension
Các yếu tố cú pháp phổ biến để hiểu 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
]
The comprehension consists of a single expression followed by at least one
comprehension ::=0 clause and zero or moreassignment_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
]
comprehension ::=0 orassignment_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
]
comprehension ::=2 clauses. In this case, the elements of the new container are those that would be produced by considering each of theassignment_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
]
comprehension ::=0 orassignment_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
]
comprehension ::=2 clauses a block, nesting from left to right, and evaluating the expression to produce an element each time the innermost block is reachedassignment_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
]
However, aside from the iterable expression in the leftmost
comprehension ::=0 clause, the comprehension is executed in a separate implicitly nested scope. This ensures that names assigned to in the target list don’t “leak” into the enclosing scopeassignment_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
]
The iterable expression in the leftmost
comprehension ::=0 clause is evaluated directly in the enclosing scope and then passed as an argument to the implicitly nested scope. Subsequentassignment_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
]
comprehension ::=0 clauses and any filter condition in the leftmostassignment_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
]
comprehension ::=0 clause cannot be evaluated in the enclosing scope as they may depend on the values obtained from the leftmost iterable. For example.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
]
comprehension ::=9assignment_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
]
To ensure the comprehension always results in a container of the appropriate type,
list_display ::= "[" [0 andstarred_list
|comprehension
] "]"
list_display ::= "[" [1 expressions are prohibited in the implicitly nested scopestarred_list
|comprehension
] "]"
Since Python 3. 6, in an function, an
list_display ::= "[" [3 clause may be used to iterate over a . A comprehension in anstarred_list
|comprehension
] "]"
list_display ::= "[" [2 function may consist of either astarred_list
|comprehension
] "]"
comprehension ::=0 orassignment_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
]
list_display ::= "[" [3 clause following the leading expression, may contain additionalstarred_list
|comprehension
] "]"
comprehension ::=0 orassignment_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
]
list_display ::= "[" [3 clauses, and may also use expressions. If a comprehension contains eitherstarred_list
|comprehension
] "]"
list_display ::= "[" [3 clauses orstarred_list
|comprehension
] "]"
list_display ::= "[" [9 expressions or other asynchronous comprehensions it is called an asynchronous comprehension. An asynchronous comprehension may suspend the execution of the coroutine function in which it appears. See also PEP 530starred_list
|comprehension
] "]"
New in version 3. 6. Asynchronous comprehensions were introduced.
Changed in version 3. 8.
list_display ::= "[" [0 andstarred_list
|comprehension
] "]"
list_display ::= "[" [1 prohibited in the implicitly nested scope.starred_list
|comprehension
] "]"
Changed in version 3. 11. Asynchronous comprehensions are now allowed inside comprehensions in asynchronous functions. Outer comprehensions implicitly become asynchronous.
6. 2. 5. List displays
A list display is a possibly empty series of expressions enclosed in square brackets
list_display ::= "[" [starred_list
|comprehension
] "]"
A list display yields a new list object, the contents being specified by either a list of expressions or a comprehension. When a comma-separated list of expressions is supplied, its elements are evaluated from left to right and placed into the list object in that order. When a comprehension is supplied, the list is constructed from the elements resulting from the comprehension
6. 2. 6. Set displays
A set display is denoted by curly braces and distinguishable from dictionary displays by the lack of colons separating keys and values
set_display ::= "{" [starred_list
|comprehension
] "}"
A set display yields a new mutable set object, the contents being specified by either a sequence of expressions or a comprehension. When a comma-separated list of expressions is supplied, its elements are evaluated from left to right and added to the set object. When a comprehension is supplied, the set is constructed from the elements resulting from the comprehension
An empty set cannot be constructed with
set_display ::= "{" [4; this literal constructs an empty dictionarystarred_list
|comprehension
] "}"
6. 2. 7. Dictionary displays
A dictionary display is a possibly empty series of key/datum pairs enclosed in curly braces
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
A dictionary display yields a new dictionary object
If a comma-separated sequence of key/datum pairs is given, they are evaluated from left to right to define the entries of the dictionary. each key object is used as a key into the dictionary to store the corresponding datum. This means that you can specify the same key multiple times in the key/datum list, and the final dictionary’s value for that key will be the last one given
A double asterisk
set_display ::= "{" [5 denotes dictionary unpacking. Toán hạng của nó phải là một. Each mapping item is added to the new dictionary. Later values replace values already set by earlier key/datum pairs and earlier dictionary unpackingsstarred_list
|comprehension
] "}"
New in version 3. 5. Unpacking into dictionary displays, originally proposed by PEP 448.
A dict comprehension, in contrast to list and set comprehensions, needs two expressions separated with a colon followed by the usual “for” and “if” clauses. When the comprehension is run, the resulting key and value elements are inserted in the new dictionary in the order they are produced
Restrictions on the types of the key values are listed earlier in section . [To summarize, the key type should be , 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
Changed in version 3. 8. 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. Generator expressions
A generator expression is a compact generator notation in parentheses
generator_expression ::= "["expression
comp_for
"]"
A generator expression yields a new generator object. Its syntax is the same as for comprehensions, except that it is enclosed in parentheses instead of brackets or curly braces
Variables used in the generator expression are evaluated lazily when the method is called for the generator object [in the same fashion as normal generators]. However, the iterable expression in the leftmost
comprehension ::=0 clause is immediately evaluated, so that an error produced by it will be emitted at the point where the generator expression is defined, rather than at the point where the first value is retrieved. Subsequentassignment_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
]
comprehension ::=0 clauses and any filter condition in the leftmostassignment_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
]
comprehension ::=0 clause cannot be evaluated in the enclosing scope as they may depend on the values obtained from the leftmost iterable. For example.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
]
dict_display ::= "{" [0key_datum_list
|dict_comprehension
] "}" key_datum_list ::=key_datum
[","key_datum
]* [","] key_datum ::=expression
":"expression
| "**"or_expr
dict_comprehension ::=expression
":"expression
comp_for
The parentheses can be omitted on calls with only one argument. See section for details
To avoid interfering with the expected operation of the generator expression itself,
list_display ::= "[" [0 andstarred_list
|comprehension
] "]"
list_display ::= "[" [1 expressions are prohibited in the implicitly defined generatorstarred_list
|comprehension
] "]"
If a generator expression contains either
list_display ::= "[" [3 clauses or expressions it is called an asynchronous generator expression. An asynchronous generator expression returns a new asynchronous generator object, which is an asynchronous iterator [see ]starred_list
|comprehension
] "]"
New in version 3. 6. Asynchronous generator expressions were introduced.
Changed in version 3. 7. Prior to Python 3. 7, asynchronous generator expressions could only appear in coroutines. Starting with 3. 7, any function can use asynchronous generator expressions.
Changed in version 3. 8.
list_display ::= "[" [0 andstarred_list
|comprehension
] "]"
list_display ::= "[" [1 prohibited in the implicitly nested scope.starred_list
|comprehension
] "]"
6. 2. 9. Yield expressions
yield_atom ::= "["yield_expression
"]" yield_expression ::= "yield" [expression_list
| "from"expression
]
The yield expression is used when defining a function or an 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 function’s body causes that coroutine function to be an asynchronous generator function. Ví dụ
atom ::=0identifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
Do các 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 ::= "[" [0 không được phép như một phần của phạm vi được xác định ngầm định được sử dụng để thực hiện các biểu thức hiểu và trình tạostarred_list
|comprehension
] "]"
Đã thay đổi trong phiên bản 3. 8. Các biểu thức lợi nhuận bị cấm trong các phạm vi lồng nhau ngầm được sử dụng để triển khai các biểu thức trình tạo và hiểu.
Các chức năng của trình tạo được mô tả bên dưới, trong khi các chức năng của trình tạo không đồng bộ được mô tả riêng trong phần
Khi một hàm tạo được gọi, nó sẽ trả về một trình vòng lặp được gọi là trình tạo. Trình tạo đó sau đó điều khiển việc thực thi chức năng của trình tạo. Quá trình thực thi bắt đầu khi một trong các phương thức của trình tạo được gọi. Tại thời điểm đó, quá trình thực thi tiếp tục với biểu thức lợi nhuận đầu tiên, nơi nó bị treo lại, trả về giá trị của cho trình gọi của trình tạo hoặc
generator_expression ::= "["1 nếu bị bỏ qua. Bằng cách treo, chúng tôi muốn nói rằng tất 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 biến cục bộ, con trỏ lệnh, 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 tiếp tục 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 lệnh 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 được sử dụng [thường thông qua a hoặc nội trang] thì kết quả là. Otherwise, if is used, then the result will be the value passed in to that methodexpression
comp_for
"]"
All of this makes generator functions quite similar to coroutines; they yield multiple times, they have more than one entry point and their execution can be suspended. The only difference is that a generator function cannot control where the execution should continue after it yields; the control is always transferred to the generator’s caller
Yield expressions are allowed anywhere in a construct. If the generator is not resumed before it is finalized [by reaching a zero reference count or by being garbage collected], the generator-iterator’s method will be called, allowing any pending clauses to execute
When
yield_atom ::= "["1 is used, the supplied expression must be an iterable. The values produced by iterating that iterable are passed directly to the caller of the current generator’s methods. Any values passed in with and any exceptions passed in with are passed to the underlying iterator if it has the appropriate methods. If this is not the case, then will raise or , while will just raise the passed in exception immediatelyyield_expression
"]" yield_expression ::= "yield" [expression_list
| "from"expression
]
When the underlying iterator is complete, the
yield_atom ::= "["8 attribute of the raised instance becomes the value of the yield expression. It can be either set explicitly when raising , or automatically when the subiterator is a generator [by returning a value from the subgenerator]yield_expression
"]" yield_expression ::= "yield" [expression_list
| "from"expression
]
Changed in version 3. 3. Added
yield_atom ::= "["1 to delegate control flow to a subiterator.yield_expression
"]" yield_expression ::= "yield" [expression_list
| "from"expression
]
The parentheses may be omitted when the yield expression is the sole expression on the right hand side of an assignment statement
See also
PEP 255 - Máy phát điện đơn giảnĐề xuất thêm trình tạo và câu lệnh vào Python
PEP 342 - Coroutines thông qua Trình tạo nâng caoĐề xuất nâng cao API và cú pháp của trình tạo, giúp chúng có thể sử dụng được như các coroutine đơn giản
PEP 380 - Cú pháp ủy quyền cho Trình tạo conĐề xuất giới thiệu cú pháp
atom ::=03, giúp việc ủy quyền cho các máy phát điện phụ trở nên dễ dàngPEP 525 - Máy phát điện không đồng bộidentifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
Đề xuất mở rộng trên PEP 492 bằng cách thêm các khả năng của trình tạo vào các chức năng coroutine
6. 2. 9. 1. Phương pháp trình tạo lặp
Tiểu mục này mô tả các phương thức của trình lặp trình tạo. Chúng có thể được sử dụng để kiểm soát việc thực hiện chức năng tạo
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 đang thực thi sẽ tạo ra một ngoại lệ
máy phát điện. __next__[]Bắt đầu thực hiện chức năng tạo hoặc tiếp tục nó ở biểu thức năng suất được thực hiện lần cuối. Khi một hàm tạo được tiếp tục với một phương thức, biểu thức năng suất hiện tại luôn ước tính thành. Sau đó, quá trình thực thi tiếp tục đến biểu thức lợi nhuận tiếp theo, trong đó trình tạo lại bị treo và giá trị của hàm được trả về cho người gọi. Nếu trình tạo thoát mà không mang lại giá trị khác, một ngoại lệ sẽ được đưa ra
Phương pháp này thường được gọi ngầm, e. g. bởi một vòng lặp, hoặc bởi chức năng tích hợp
máy phát điện. gửi[giá trị]Tiếp tục thực thi và “gửi” một giá trị vào hàm 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 trả về giá trị tiếp theo do trình tạo tạo ra hoặc tăng nếu trình tạo thoát mà không mang lại giá trị khác. Khi được gọi để khởi động trình tạo, nó phải được gọi với tư cách là đối số, vì không có biểu thức năng suất nào có thể nhận giá trị
máy phát điện. ném[giá trị]trình tạo. ném[loại[ , value[, traceback]]]Tăng một ngoại lệ tại điểm mà trình tạo bị tạm dừng và trả về giá trị tiếp theo do hàm tạo tạo ra. Nếu trình tạo thoát mà không mang lại giá trị khác, một ngoại lệ sẽ được đưa ra. Nếu hàm tạo không bắt được ngoại lệ được truyền vào hoặc đưa ra một ngoại lệ khác, thì ngoại lệ đó sẽ lan truyền đến người gọi
Trong sử dụng thông thường, đ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
Tuy nhiên, để tương thích ngược, chữ ký thứ hai được hỗ trợ, tuân theo quy ước từ các phiên bản Python cũ hơn. Đối số kiểu 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 kiểu được gọi để lấy một thể hiện. Nếu truy nguyên được cung cấp, thì nó được đặt theo ngoại lệ, nếu không, bất kỳ thuộc tính
atom ::=18 hiện có nào được lưu trữ trong giá trị có thể bị xóamáy phát điện. đóng[]identifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
Tăng a tại điểm chức năng tạo bị tạm dừng. Nếu chức năng tạo sau đó thoát ra một cách duyên dáng, đã bị đóng hoặc tăng [do không bắt ngoại lệ], đóng sẽ trả về trình gọi của nó. Nếu trình tạo mang lại một giá trị, thì a được nâng lên. Nếu trình tạo phát sinh bất kỳ ngoại lệ nào khác, nó sẽ được truyền tới người gọi. không làm gì nếu trình tạo đã thoát do ngoại lệ hoặc thoát bình thường
6. 2. 9. 2. Ví dụ
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à các hàm tạo
atom ::=1identifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
Để biết các ví dụ sử dụng
list_display ::= "[" [1, hãy xem trong “Có gì mới trong Python. ”starred_list
|comprehension
] "]"
6. 2. 9. 3. Hàm tạo không đồng bộ
Sự hiện diện của biểu thức năng suất trong một hàm hoặc phương thức được xác định bằng cách sử dụng định nghĩa thêm hàm dưới dạng một hàm
Khi một hàm tạo 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à đối tượng trình tạo không đồng bộ. Đối tượng đó sau đó kiểm soát việc thực hiện chức năng tạo. Một đối tượng trình tạo không đồng bộ thường được sử dụng trong một câu lệnh trong hàm coroutine tương tự như cách một đối tượng trình tạo sẽ được sử dụng trong một câu lệnh
Gọi một trong các phương thức của trình tạo không đồng bộ trả về một đối tượng và quá trình thực thi bắt đầu khi đối tượng này được chờ trên. Tại thời điểm đó, quá trình thực thi sẽ chuyển sang biểu thức năng suất đầu tiên, tại đây nó lại bị tạm dừng, trả về giá trị của quy trình đăng ký đang chờ. Như với một trình tạo, tạm ngưng có nghĩa là tất cả trạng thái cục bộ được giữ lại, bao gồm các liên kết hiện tại của biến cục bộ, con trỏ lệnh, 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 quá trình thực thi được tiếp tục bằng cách đợi đối tượng tiếp theo được trả về bởi các phương thức của trình tạo không đồng bộ, 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 lệnh 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 được sử dụng thì kết quả là. Mặt khác, nếu được sử dụng, thì kết quả sẽ là giá trị được truyền vào phương thức đó
Nếu một trình tạo không đồng bộ xảy ra thoát sớm trước , tác vụ của trình gọi bị hủy hoặc các ngoại lệ khác, thì mã dọn dẹp không đồng bộ của trình tạo sẽ chạy và có thể đưa ra các ngoại lệ hoặc truy cập các biến ngữ cảnh trong một ngữ cảnh không mong muốn–có thể sau thời gian tồn tại của các tác vụ tùy thuộc vào, hoặc . Để ngăn chặn điều này, người gọi phải đóng trình tạo async một cách rõ ràng bằng cách gọi phương thức để hoàn thiện trình tạo và cuối cùng tách nó khỏi vòng lặp sự kiện
Trong hàm tạo không đồng bộ, biểu thức năng suất được phép ở bất kỳ đâu trong cấu trúc. Tuy nhiên, nếu trình tạo không đồng bộ không được tiếp tục lại trước khi nó được hoàn thiện [bằng cách đạt đến số tham chiếu bằng 0 hoặc bằng cách thu gom rác], thì biểu thức năng suất trong cấu trúc
generator_expression ::= "["8 có thể dẫn đến lỗi thực thi các mệnh đề đ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ộ là gọi phương thức của trình tạo-iterator không đồng bộ và chạy đối tượng coroutine kết quả, do đó cho phép mọi mệnh đềexpression
comp_for
"]"
yield_atom ::= "["0 đang chờ xử lý thực thiyield_expression
"]" yield_expression ::= "yield" [expression_list
| "from"expression
]
Để xử lý việc hoàn thiện khi kết thúc vòng lặp sự kiện, một vòng lặp sự kiện phải xác định một hàm hoàn thiện nhận một trình lặp-trình tạo không đồng bộ và có thể gọi và thực thi coroutine. Finalizer này có thể được đăng ký bằng cách gọi. Khi được lặp lại lần đầu tiên, một trình lặp-trình tạo không đồng bộ sẽ lưu trữ trình hoàn thiện đã đăng ký để được gọi khi hoàn thiện. Để biết ví dụ tham khảo về phương pháp hoàn thiện, hãy xem triển khai của
atom ::=40 trong Lib/asyncio/base_events. pyidentifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
Biểu thức
yield_atom ::= "["1 là lỗi cú pháp khi được sử dụng trong hàm tạo không đồng bộyield_expression
"]" yield_expression ::= "yield" [expression_list
| "from"expression
]
6. 2. 9. 4. Các phương thức tạo-lặp không đồng bộ
Tiểu mục này mô tả các phương thức của trình lặp trình tạo không đồng bộ, được sử dụng để kiểm soát việc thực thi hàm trình tạo
quy trình đại lý. __anext__[]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 lần cuối. Khi một hàm tạo không đồng bộ được tiếp tục với một phương thức, biểu thức năng suất hiện tại luôn ước tính thành giá trị có thể chờ được trả về, mà khi chạy sẽ tiếp tục đến biểu thức năng suất tiếp theo. Giá trị của biểu thức năng suất là giá trị của ngoại lệ được đưa ra bởi quy trình hoàn thành. Nếu trình tạo không đồng bộ thoát mà không mang lại giá trị khác, thay vào đó, có thể chờ đợi sẽ đưa ra một ngoại lệ, báo hiệu rằng quá trình lặp không đồng bộ đã hoàn thành
Phương thức này thường được gọi ngầm bởi một vòng lặp
quy trình đại lý. asend[giá trị]Trả về một sự chờ đợi mà khi chạy sẽ tiếp tục thực hiện trình tạo không đồng bộ. Đối với phương thức dành cho bộ tạo, phương thức này “gửi” một giá trị vào hàm bộ 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. Phương thức có thể chờ đợi được trả về sẽ trả về giá trị tiếp theo do trình tạo tạo ra dưới dạng giá trị của raise hoặc tăng nếu trình tạo không đồng bộ thoát mà không mang lại giá trị khác. Khi được gọi để khởi động trình tạo không đồng bộ, nó phải được gọi với tư cách là đối số, vì không có biểu thức năng suất nào có thể nhận giá trị
quy trình đại lý. throw[loại[ , value[, traceback]]]Trả về một sự chờ đợi làm tăng ngoại lệ loại
atom ::=54 tại điểm mà trình tạo không đồng bộ bị tạm dừng và trả về giá trị tiếp theo do hàm trình tạo tạo ra làm giá trị của ngoại lệ đã nêu. Nếu trình tạo không đồng bộ thoát mà không mang lại giá trị khác, một ngoại lệ sẽ được đưa ra bởi lệnh chờ. Nếu hàm tạo không bắt được ngoại lệ được truyền vào hoặc đưa ra một ngoại lệ khác, thì khi lệnh có thể chờ được chạy, ngoại lệ đó sẽ lan truyền tới người gọi của lệnh có thể chờquy trình đại lý. đóng[]identifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
Trả về một sự chờ đợi mà khi chạy sẽ ném một hàm vào trình tạo không đồng bộ tại điểm mà nó bị tạm dừng. Nếu chức năng tạo không đồng bộ sau đó thoát ra một cách duyên dáng, đã bị đóng hoặc tăng [do không bắt ngoại lệ], thì hàm chờ được trả về sẽ đưa ra một ngoại lệ. Bất kỳ sự chờ đợi nào khác được trả về bởi các cuộc gọi tiếp theo tới trình tạo không đồng bộ sẽ đưa ra một ngoại lệ. Nếu trình tạo không đồng bộ mang lại một giá trị, thì a được tăng lên bởi giá trị có thể chờ đợi. Nếu trình tạo không đồng bộ đưa ra bất kỳ ngoại lệ nào khác, thì nó sẽ được truyền tới người gọi của lệnh chờ. Nếu trình tạo không đồng bộ đã thoát do một ngoại lệ hoặc thoát bình thường, thì các lệnh gọi tiếp theo sẽ trả về một giá trị có thể chờ đợi mà không làm gì cả
6. 3. Primaries
Primaries represent the most tightly bound operations of the language. Their syntax is
atom ::=2identifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
6. 3. 1. Attribute references
Tham chiếu thuộc tính là thuộc tính chính theo sau là dấu chấm và tên
atom ::=3identifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
Chính phải đánh giá một đối tượng thuộc loại hỗ trợ tham chiếu thuộc tính, điều mà hầu hết các đối tượng 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. Quá trình sản xuất này có thể được tùy chỉnh bằng cách ghi đè phương thức
atom ::=63. Nếu thuộc tính này không có sẵn, ngoại lệ sẽ được đưa ra. 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 nhauidentifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
6. 3. 2. Đăng ký
Việc đăng ký một phiên bản của một sẽ thường chọn một phần tử từ vùng chứa. Việc đăng ký một sẽ thường trả về một đối tượng
atom ::=4identifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
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á 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ả hai và. 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 đến một trong các phương thức này. Để biết thêm chi tiết về thời điểm gọi
atom ::=67 thay vìidentifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
atom ::=68, hãy xemidentifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
Nếu danh sách biểu thức chứa ít nhất một dấu phẩy, nó sẽ đánh giá là chứa các mục của danh sách biểu thức. Nếu không, danh sách biểu thức sẽ đánh giá giá trị của thành viên duy nhất của danh sách
Đối với các đối tượng tích hợp, có hai loại đối tượng hỗ trợ đăng ký qua
ánh xạ. Nếu giá trị chính là a , thì danh sách biểu thức phải đánh giá 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ạ dựng sẵn là lớp
trình tự. Nếu giá trị chính là a , thì danh sách biểu thức phải đánh giá thành an hoặc a [như được thảo luận trong phần sau]. Ví dụ về các lớp trình tự dựng sẵn bao gồm các lớp , và
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. Tuy nhiên, tất cả các trình tự dựng sẵn đều cung cấp một phương thức diễn giải các chỉ số âm bằng cách thêm độ dài của trình tự vào chỉ mục sao cho, ví dụ:
atom ::=78 chọn mục cuối cùng củaidentifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
atom ::=79. Giá trị kết quả phải là một số nguyên không âm nhỏ hơn số mục trong chuỗi và đăng ký chọn mục có chỉ mục là giá trị đó [đếm từ 0]. Vì hỗ trợ cho các chỉ số âm và cắt xảy ra trong phương thứcidentifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
atom ::=65 của đối tượng, nên các lớp con ghi đè phương thức này sẽ cần thêm hỗ trợ đó một cách rõ ràngidentifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
A là một loại dãy đặc biệt có các phần tử là các ký tự. Một ký tự không phải là một kiểu dữ liệu riêng biệt mà là một chuỗi có đúng một ký tự
6. 3. 3. Cắt lát
Một lần cắt chọn một loạt các mục trong một đối tượng chuỗi [e. g. , một chuỗi, bộ hoặc danh sách]. Các lát cắt có thể được sử dụng làm biểu thức hoặc làm mục tiêu trong bài tập hoặc câu lệnh. Cú pháp cho một slice
atom ::=5identifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
Có sự mơ hồ trong cú pháp chính thức ở đây. bất cứ thứ gì trông giống như một danh sách biểu thức cũng giống như một danh sách lát, vì vậy bất kỳ đăng ký nào cũng có thể được hiểu là một lát. Thay vì làm phức tạp thêm cú pháp, điều này được làm rõ bằng cách xác định rằng trong trường hợp này, diễn giải dưới dạng đăng ký được ưu tiên hơn diễn giải dưới dạng 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]
Ngữ nghĩa của một slice như sau. Chính được lập chỉ mục [sử dụng cùng một phương thức
atom ::=65 như đăng ký bình thường] với một khóa được tạo từ danh sách lát, như sau. Nếu danh sách lát chứa ít nhất một dấu phẩy, khóa là một bộ chứa chuyển đổi của các mục lát; . Việc chuyển đổi một mục lát là một biểu thức là biểu thức đó. Việc chuyển đổi một lát cắt phù hợp là một đối tượng lát cắt [xem phần ] có các thuộc tínhidentifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
atom ::=84,identifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
atom ::=85 vàidentifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
atom ::=86 là các giá trị của các biểu thức đã cho lần lượt là giới hạn dưới, giới hạn trên và sải chân, thay thế cho các biểu thức bị thiếuidentifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
generator_expression ::= "["1expression
comp_for
"]"
6. 3. 4. Cuộc gọi
Một cuộc gọi gọi một đối tượng có thể gọi được [e. g. , a ] với một loạt có thể trống
atom ::=6identifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
Dấu phẩy tùy chọn có thể xuất hiện 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á một đối tượng có thể gọi được [hàm do người dùng định nghĩa, hàm tích hợp, phương thức của đối tượng tích hợp, đối tượng lớp, phương thức của thể hiện lớp và tất cả các đối tượng có phương thức
atom ::=88 đều có thể gọi được]. Tất cả các biểu thức đối số được đánh giá trước khi thực hiện cuộc gọi. Vui lòng tham khảo phần cú pháp của danh sách chính thứcidentifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
Nếu có đối số từ khóa, trước tiên chúng được chuyển đổi thành đối số vị trí, như sau. Đầu tiên, một danh sách các vị trí chưa đượ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 vị trí đầ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 mã định danh giống với tên tham số chính thức đầu tiên, thì vị trí đầu tiên được sử dụng, v.v.]. Nếu vị trí đã được lấp đầy, một ngoại lệ sẽ được đưa ra. Mặt khác, đối số được đặt vào chỗ trống, lấp đầy nó [ngay cả khi biểu thức là
generator_expression ::= "["1, nó sẽ lấp đầy chỗ trống]. Khi tất cả các đối số đã được xử lý, các vị trí vẫn chưa được lấp đầy sẽ được lấp đầy bằng 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 sẽ được chia sẻ bởi tất cả các lệnh gọi không chỉ định giá trị đối số cho vị trí tương ứng; điều này nên . ] Nếu có bất kỳ vị trí nào chưa được lấp đầy mà không có giá trị mặc định nào được chỉ định, một ngoại lệ sẽ được đưa ra. Otherwise, the list of filled slots is used as the argument list for the callexpression
comp_for
"]"
Chi tiết triển khai CPython. Việc triển khai có thể cung cấp các hàm tích hợp có tham số vị trí không có tên, ngay cả khi chúng được 'đặt tên' cho mục đích tài liệu và do đó không thể được cung cấp theo từ khóa. Trong CPython, đây là trường hợp các hàm được triển khai trong C sử dụng để phân tích các đối số của chúng
Nếu có nhiều đối số vị trí hơn số vị trí tham số chính thức, thì một ngoại lệ sẽ được đưa ra, trừ khi có tham số chính thức sử dụng cú pháp
atom ::=94;identifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
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, một ngoại lệ sẽ được đưa ra, trừ khi có tham số chính thức sử dụng cú pháp
atom ::=96;identifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
Nếu cú pháp
atom ::=97 xuất hiện trong lời gọi hàm, thìidentifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
atom ::=98 phải đánh giá thành một. Các phần tử từ các lần lặp này được xử lý như thể chúng là các đối số vị trí bổ sung. Đối với lời gọiidentifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
atom ::=99, nếu y đánh giá một dãy y1, …, yM, điều này tương đương với một lời gọi với M+4 đối số vị trí x1, x2, y1, …, yM, x3, x4identifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
Hậu quả của việc này là mặc dù cú pháp
atom ::=97 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ốidentifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
literal ::=01 nào – xem bên dưới]. Vì thếstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
atom ::=7identifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
Việc cả đối số từ khóa và cú pháp
atom ::=97 được sử dụng trong cùng một lệnh gọi là điều bất thường, vì vậy trong thực tế, sự nhầm lẫn này không thường xảy raidentifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
Nếu cú pháp
literal ::=01 xuất hiện trong lệnh gọi hàm, thì ______3_______98 phải ước tính thành a , nội dung của nó được coi là đối số từ khóa bổ sung. Nếu một tham số khớp với một khóa đã được cung cấp một giá trị [bởi một đối số từ khóa rõ ràng hoặc từ một giải nén khác], một ngoại lệ sẽ được đưa rastringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Khi sử dụng
literal ::=01, 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 để gán từ khóa có tên bằng với khóa. Khóa không nhất thiết phải là mã định danh Python [e. g.stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=07 được chấp nhận, 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 khớp với tham số chính thức, cặp khóa-giá trị được thu thập bởi tham sốstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
set_display ::= "{" [5, nếu có hoặc nếu không có, một ngoại lệ sẽ được đưa rastarred_list
|comprehension
] "}"
Các tham số hình thức sử dụng cú pháp
atom ::=94 hoặcidentifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
atom ::=96 không thể được sử dụng làm vùng đối số vị trí hoặc làm tên đối số từ khóaidentifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
Đã thay đổi trong phiên bản 3. 5. Các lệnh gọi hàm chấp nhận bất kỳ số lần giải nén
literal ::=12 vàstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
set_display ::= "{" [5 nào, các đối số vị trí có thể tuân theo các lần giải nén lặp lại [starred_list
|comprehension
] "}"
literal ::=12] và các đối số từ khóa có thể tuân theo các lần giải nén từ điển [stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
set_display ::= "{" [5]. Ban đầu được đề xuất bởi PEP 448.starred_list
|comprehension
] "}"
Một cuộc gọi luôn trả về một số giá trị, có thể là
generator_expression ::= "["1, trừ khi nó đưa ra một ngoại lệ. Cách tính giá trị này tùy thuộc vào loại đối tượng có thể gọi đượcexpression
comp_for
"]"
Nếu nó là-
chức năng do người dùng định nghĩaKhối mã cho hàm được thực thi, truyền cho nó danh sách đối số. Điều đầu tiên mà khối mã sẽ thực hiện là liên kết các tham số hình thức với các đối số; . Khi khối mã thực thi một câu lệnh, câu lệnh này chỉ định giá trị trả về của lệnh gọi hàm
một chức năng hoặc phương pháp tích hợpKết quả là tùy thuộc vào thông dịch viên;
một đối tượng lớpMột phiên bản mới của lớp đó được trả về
một phương thức thể hiện của lớpHàm do người dùng xác định tương ứng được gọi, với danh sách đối số dài hơn danh sách đối số của lệnh gọi. ví dụ trở thành đối số đầu tiên
một thể hiện của lớpLớp phải định nghĩa một phương thức
atom ::=88;identifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
6. 4. Đang chờ biểu thức
Tạm dừng thực hiện trên một đối tượng. Chỉ có thể được sử dụng bên trong một
atom ::=8identifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
Mới trong phiên bản 3. 5
6. 5. Người điều hành quyền lực
Toán tử lũy thừa liên kết chặt chẽ hơn các toán tử đơn nguyên ở bên trái của nó; . Cú pháp là
atom ::=9identifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
Do đó, trong một chuỗi các toán tử lũy thừa và đơn nguyên không được mở ngoặc, 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 ::=19 kết quả trongstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=20stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Toán tử lũy thừa có ngữ nghĩa giống như hàm 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 thành sức mạnh của đối số bên phải của nó. Các đối số số trước tiên được chuyển đổi thành một loại phổ biến và kết quả là loại đó
Đối với toán hạng kiểu int, kết quả có cùng kiểu với toán hạng trừ khi đối số thứ hai là số âm; . Ví dụ,
literal ::=22 trả vềstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=23, nhưngstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=24 trả vềstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=25stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Việc nâng
literal ::=26 lên mức âm sẽ dẫn đến. Nâng một số âm lên một lũy thừa phân số dẫn đến một số. [Trong các phiên bản trước, nó đã tăng. ]stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
This operation can be customized using the special
literal ::=30 methodstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
6. 6. Các phép toán số học và bit đơn vị
Tất cả các hoạt động số học đơn phương và bitwise có cùng mức độ ưu tiên
literal ::=0stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Toán tử
literal ::=31 [trừ] đơn nguyên mang lại phủ định cho đối số số của nó;stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Toán tử một ngôi
literal ::=33 [cộng] mang lại đối số số của nó không thay đổi;stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Toán tử một ngôi
literal ::=35 [đảo ngược] mang lại phép nghịch đảo bit của đối số nguyên của nó. Đảo ngược bit củastringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
atom ::=79 được định nghĩa làidentifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
literal ::=37. Nó chỉ áp dụng cho các số nguyên hoặc đối tượng tùy chỉnh ghi đè phương thức đặc biệtstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=38stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Trong cả ba trường hợp, nếu đối số không có loại thích hợp, một ngoại lệ sẽ được đưa ra
6. 7. Các phép toán số học nhị phân
Các phép toán số học nhị phân có các mức ưu tiên thông thường. Lưu ý rằng một số thao tác này cũng áp dụng cho một số loại không phải là số. Ngoài toán tử lũy thừa, chỉ có hai mức, một cho toán tử nhân và một cho toán tử cộng
literal ::=1stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Toán tử
literal ::=12 [phép nhân] cho kết quả của các đối số của nó. Cả hai đối số phải là số hoặc một đối số phải là số nguyên và đối số kia 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 đó được nhân với nhau. Trong trường hợp thứ hai, việc lặp lại trình tự được thực hiện;stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Hoạt động này có thể được tùy chỉnh bằng cách sử dụng các phương pháp đặc biệt
literal ::=41 vàstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=42stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Toán tử
literal ::=43 [at] được dùng để nhân ma trận. Không có loại Python dựng sẵn nào triển khai toán tử nàystringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Mới trong phiên bản 3. 5
Các toán tử
literal ::=44 [phép chia] vàstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=45 [phép chia tầng] mang lại thương số cho các đối số của chúng. Các đối số số trước tiên được chuyển đổi thành một loại phổ biến. Phép chia các số nguyên tạo ra một số float, trong khi phép chia sàn các số nguyên dẫn đến một số nguyên; . Chia cho số 0 làm tăng ngoại lệstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Hoạt động này có thể được tùy chỉnh bằng cách sử dụng các phương pháp đặc biệt
literal ::=47 vàstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=48stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Toán tử
literal ::=49 [mô-đun] mang lại phần còn lại từ phép chia đối số thứ nhất cho đối số thứ hai. Các đối số số trước tiên được chuyển đổi thành một loại phổ biến. Một đối số không bên phải làm tăng ngoại lệ. Các đối số có thể là số dấu phẩy động, e. g. ,stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=51 bằng vớistringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=52 [vìstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=53 bằng vớistringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=54. ] Toán tử modulo luôn mang lại kết quả có cùng dấu với toán hạng thứ hai [hoặc 0];stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Các toán tử phân chia tầng và modulo được kết nối bằng danh tính sau.
literal ::=55. Phân chia tầng và modulo cũng được kết nối với chức năng tích hợp.stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=57.stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Ngoài việc thực hiện thao tác modulo trên các số, toán tử
literal ::=49 còn được nạp chồng 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à phép nội suy]. Cú pháp định dạng chuỗi được mô tả trong phần Tham khảo thư viện Pythonstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Hoạt động modulo có thể được tùy chỉnh bằng phương pháp
literal ::=59 đặc biệtstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Toán tử chia sàn, toán tử modulo và hàm không được xác định cho các số phức. Thay vào đó, hãy chuyển đổi thành số dấu phẩy động bằng hàm nếu thích hợp
Toán tử
literal ::=33 [bổ sung] mang lại tổng các đối số của nó. Các đối số phải 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 cộng lại với nhau. Trong trường hợp sau, các chuỗi được nốistringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Hoạt động này có thể được tùy chỉnh bằng cách sử dụng các phương pháp đặc biệt
literal ::=63 vàstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=64stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Toán tử
literal ::=31 [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ố trước tiên được chuyển đổi thành một loại phổ biếnstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Thao tác này có thể được tùy chỉnh bằng phương pháp
literal ::=66 đặc biệtstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
6. 8. Thao tác dịch chuyển
Các phép toán dịch chuyển có mức độ ưu tiên thấp hơn các phép toán số học
literal ::=2stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Các toán tử này chấp nhận số nguyên làm đối số. Chúng dịch chuyển đối số thứ nhất sang trái hoặc phải theo số bit được cung cấp bởi đối số thứ hai
Hoạt động này có thể được tùy chỉnh bằng cách sử dụng các phương pháp đặc biệt
literal ::=67 vàstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=68stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Dịch chuyển sang phải n bit được định nghĩa là chia sàn cho
literal ::=69. Dịch trái n bit được định nghĩa là phép nhân vớistringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=69stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
6. 9. Các phép toán theo bit nhị phân
Mỗi trong số ba hoạt động bitwise có mức độ ưu tiên khác nhau
literal ::=3stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Toán tử
literal ::=71 tạo ra AND theo bit 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à đối tượng tùy chỉnh ghi đè phương thức đặc biệt củastringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=72 hoặcstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=73stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Toán tử
literal ::=74 tạo ra XOR bitwise [OR độc quyền] 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à đối tượng tùy chỉnh ghi đè phương thức đặc biệt củastringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=75 hoặcstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=76stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Toán tử
literal ::=77 mang lại OR theo bit [bao gồm] 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à đối tượng tùy chỉnh ghi đè phương thức đặc biệt củastringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=78 hoặcstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=79stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
6. 10. So sánh
Không giống như C, tất cả các phép toán so sánh trong Python đều có cùng mức độ ưu tiên, thấp hơn so với bất kỳ phép toán số học, dịch chuyển hoặc bit nào. Cũng không giống như C, các biểu thức như
literal ::=80 có cách giải thích thông thường trong toán họcstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=4stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
So sánh mang lại giá trị boolean.
literal ::=81 hoặcstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=82. Các phương thức so sánh phong phú tùy chỉnh có thể trả về các giá trị không phải là boolean. Trong trường hợp này, Python sẽ gọi giá trị đó trong ngữ cảnh booleanstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
So sánh có thể được xâu chuỗi tùy ý, e. g. ,
literal ::=84 tương đương vớistringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=85, ngoại trừ việcstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=86 chỉ được đánh giá một lần [nhưng trong cả hai trường hợp,stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=87 hoàn toàn không được đánh giá khistringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=88 bị phát hiện là sai]stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Về hình thức, nếu a, b, c, …, y, z là các biểu thức và op1, op2, …, opN là các toán tử so sánh, thì
literal ::=89 tương đương vớistringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=90, ngoại trừ mỗi biểu thức được đánh giá nhiều nhất một lầnstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Lưu ý rằng
literal ::=91 không ngụ ý bất kỳ loại so sánh nào giữa a và c, do đó, e. g. ,stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=92 là hoàn toàn hợp pháp [mặc dù có lẽ không đẹp]stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
6. 10. 1. So sánh giá trị
Các toán tử
literal ::=93,stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=94,stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=95,stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=96,stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=97 vàstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=98 so sánh giá trị của hai đối tượng. Các đối tượng không cần phải có cùng loạistringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Chương nói rằng các đối tượng có một 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 chính tắc cho giá trị của đối tượng. Ngoài ra, không có yêu cầu rằng giá trị của một đối tượng phải được xây dựng theo một cách cụ thể, e. g. 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 như 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
Bởi vì tất cả các loại đều là kiểu con [trực tiếp hoặc gián tiếp] của , nên chúng kế thừa hành vi so sánh mặc định từ. Các loại có thể tùy chỉnh hành vi so sánh của chúng bằng cách triển khai các phương pháp so sánh phong phú như
parenth_form ::= "[" [starred_expression
] "]"
01, được mô tả trongHành vi mặc định để so sánh đẳng thức [
literal ::=95 vàstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=98] 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 danh tính dẫn đến bình đẳng và so sánh bình đẳng của các trường hợp có danh tính khác nhau dẫn đến bất bình đẳng. Độ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 có tính phản xạ [i. e.stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
parenth_form ::= "[" [starred_expression
] "]"
04 ngụ ý parenth_form ::= "[" [starred_expression
] "]"
05]So sánh đơn đặt hàng mặc định [
literal ::=93,stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=94,stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=97, vàstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=96] không được cung cấp; . Độ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 bình đẳngstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Hành vi so sánh đẳng thức mặc định, rằng các trường hợp có danh tính khác nhau luôn không bằng nhau, có thể trái ngược với loại nào 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 tùy chỉnh hành vi so sánh của chúng và trên thực tế, một số loại tích hợp đã làm được đ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ố của các loại số tích hợp sẵn [] và của các loại thư viện tiêu chuẩn và có thể được so sánh trong và giữa các loại của chúng, với hạn chế là các số phức 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 [thuật toán] mà không làm mất độ chính xác
Các giá trị không phải là số
parenth_form ::= "[" [
13 vàstarred_expression
] "]"parenth_form ::= "[" [
14 là đặc biệt. Mọi so sánh theo thứ tự của một số với một giá trị không phải là số đều sai. Một hàm ý phản trực giác là các giá trị không phải là số không bằng chính chúng. Ví dụ: nếustarred_expression
] "]"parenth_form ::= "[" [
15,starred_expression
] "]"parenth_form ::= "[" [
16,starred_expression
] "]"parenth_form ::= "[" [
17 vàstarred_expression
] "]"parenth_form ::= "[" [
18 đều sai, trong khi đóstarred_expression
] "]"parenth_form ::= "[" [
19 là đúng. Hành vi này phù hợp với IEEE 754starred_expression
] "]"generator_expression ::= "["
1 vàexpression
comp_for
"]"parenth_form ::= "[" [
21 là những người độc thân. PEP 8 khuyên rằng việc so sánh các singleton phải luôn được thực hiện vớistarred_expression
] "]"parenth_form ::= "[" [
22 hoặcstarred_expression
] "]"parenth_form ::= "[" [
23, không bao giờ là toán tử đẳng thứcstarred_expression
] "]"Các chuỗi nhị phân [ví dụ hoặc ] có thể được so sánh trong và giữa các loại của chúng. Họ so sánh từ điển bằng cách sử dụng các giá trị số của các phần tử của họ
Các chuỗi [ví dụ về ] so sánh theo từ điển 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] của các ký tự của chúng.
Chuỗi và chuỗi nhị phân không thể được so sánh trực tiếp
Các chuỗi [các trường hợp của , hoặc ] chỉ có thể được so sánh trong mỗi loại của chúng, với hạn chế là các 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à so sánh thứ tự giữa các loại này làm tăng
Các chuỗi so sánh từ điển bằng cách sử dụng so sánh các phần tử tương ứng. Các bộ chứa tích hợp thường giả sử các đối tượng giống hệt nhau bằng 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 bên trong của chúng
So sánh từ điển giữa các bộ sưu tập tích hợp hoạt động như sau
For two collections to compare equal, they must be of the same type, have the same length, and each pair of corresponding elements must compare equal [for example,
parenth_form ::= "[" [
32 is false because the type is not the same]starred_expression
] "]"Các tập hợp hỗ trợ so sánh thứ tự được sắp xếp giống như các phần tử không bằng nhau đầu tiên của chúng [ví dụ:
parenth_form ::= "[" [
33 có cùng giá trị vớistarred_expression
] "]"parenth_form ::= "[" [
34]. Nếu một phần tử tương ứng không tồn tại, tập hợp ngắn hơn sẽ được sắp xếp trước [ví dụ:starred_expression
] "]"parenth_form ::= "[" [
35 là đúng]starred_expression
] "]"
Các ánh xạ [trường hợp của ] so sánh bằng nhau khi và chỉ khi chúng có các cặp
parenth_form ::= "[" [
37 bằng nhau. So sánh bình đẳng của các khóa và giá trị thực thi tính phản xạstarred_expression
] "]"So sánh thứ tự [
literal ::=
93,stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=
94,stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=
97, vàstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=
96] tăngstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Các bộ [trường hợp của hoặc ] có thể được so sánh trong và giữa các loại của chúng
Họ định nghĩa các toán tử so sánh thứ tự để kiểm tra tập hợp con và tập hợp con trung bình. Những mối quan hệ đó không xác định thứ tự tổng [ví dụ: hai tập hợp
parenth_form ::= "[" [
45 vàstarred_expression
] "]"parenth_form ::= "[" [
46 không bằng nhau, cũng không phải là tập hợp con của nhau, cũng không phải tập hợp con của nhau]. Theo đó, các tập hợp không phải là đối số thích hợp cho các hàm phụ thuộc vào tổng số thứ tự [ví dụ: , và tạo ra kết quả không xác định với danh sách các tập hợp làm đầu vào]starred_expression
] "]"So sánh các tập hợp thực thi tính phản xạ của các phần tử của nó
Hầu hết các loại tích hợp khác không có phương thức so sánh nào được triển khai, vì vậy chúng kế thừa hành vi so sánh mặc định
Các lớp do người dùng định nghĩa tùy chỉnh hành vi so sánh của chúng phải 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 được 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 ::= "[" [
04 ngụ ýstarred_expression
] "]"parenth_form ::= "[" [
05starred_expression
] "]"So sánh phải đối xứng. Nói cách khác, các biểu thức sau đây sẽ có cùng một kết quả
parenth_form ::= "[" [
05 vàstarred_expression
] "]"parenth_form ::= "[" [
53starred_expression
] "]"parenth_form ::= "[" [
54 vàstarred_expression
] "]"parenth_form ::= "[" [
55starred_expression
] "]"literal ::=
88 vàstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
parenth_form ::= "[" [
57starred_expression
] "]"parenth_form ::= "[" [
34 vàstarred_expression
] "]"parenth_form ::= "[" [
59starred_expression
] "]"So sánh nên chuyển tiếp. Các ví dụ [không đầy đủ] sau đây minh họa rằng
parenth_form ::= "[" [
60 ngụ ýstarred_expression
] "]"parenth_form ::= "[" [
61starred_expression
] "]"literal ::=
85 ngụ ýstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
parenth_form ::= "[" [
63starred_expression
] "]"So sánh nghịch đảo sẽ dẫn đến phủ định boolean. Nói cách khác, các biểu thức sau đây sẽ có cùng một kết quả
parenth_form ::= "[" [
05 vàstarred_expression
] "]"parenth_form ::= "[" [
65starred_expression
] "]"literal ::=
88 vàstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
parenth_form ::= "[" [
67 [đối với tổng số đơn đặt hàng]starred_expression
] "]"parenth_form ::= "[" [
68 vàstarred_expression
] "]"parenth_form ::= "[" [
69 [đối với tổng số đơn đặt hàng]starred_expression
] "]"Hai biểu thức cuối cùng áp dụng cho các tập hợp được sắp xếp hoàn toàn [e. g. đến các chuỗi, nhưng không phải cho các tập hợp hoặc ánh xạ]. Xem thêm trang trí
Kết quả phải phù hợp với bình đẳng. Các đối tượng bằng nhau phải có cùng giá trị băm hoặc được đánh dấu là không thể băm
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 phải là 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 tư cách thành viên
Các nhà khai thác và kiểm tra tư cách thành viên.
parenth_form ::= "[" [starred_expression
] "]"
74 đánh giá thành literal ::=81 nếu x là thành viên của s vàstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=82 nếu không.stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
parenth_form ::= "[" [starred_expression
] "]"
77 trả về phủ định của parenth_form ::= "[" [starred_expression
] "]"
74. Tất cả các trình tự và loại tập hợp tích hợp đều hỗ trợ điều này cũng như từ điển, trong đó parenth_form ::= "[" [starred_expression
] "]"
72 kiểm tra xem từ điển có khóa đã cho hay không. Đối với các loại vùng chứa như danh sách, bộ dữ liệu, bộ, bộ đóng băng, dict hoặc bộ sưu tập. deque, biểu thức parenth_form ::= "[" [starred_expression
] "]"
80 tương đương với parenth_form ::= "[" [starred_expression
] "]"
81Đối với các loại chuỗi và byte,
parenth_form ::= "[" [starred_expression
] "]"
80 là literal ::=81 khi và chỉ khi x là chuỗi con của y. Một bài kiểm tra tương đương làstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
parenth_form ::= "[" [starred_expression
] "]"
84. Các chuỗi rỗ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, parenth_form ::= "[" [starred_expression
] "]"
85 sẽ trả về literal ::=81stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Đối với các lớp do người dùng định nghĩa xác định phương thức
parenth_form ::= "[" [starred_expression
] "]"
87, parenth_form ::= "[" [starred_expression
] "]"
80 trả về literal ::=81 nếustringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
parenth_form ::= "[" [starred_expression
] "]"
90 trả về giá trị thực và ngược lại là literal ::=82stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Đối với các lớp do người dùng định nghĩa không định nghĩa
parenth_form ::= "[" [starred_expression
] "]"
87 nhưng định nghĩa parenth_form ::= "[" [starred_expression
] "]"
93, thì parenth_form ::= "[" [starred_expression
] "]"
80 là literal ::=81 nếu một số giá trịstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=87, mà biểu thứcstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
parenth_form ::= "[" [starred_expression
] "]"
97 là đúng, được tạo ra trong khi lặp lại trên literal ::=86. Nếu một ngoại lệ được đưa ra trong quá trình lặp lại, thì coi như ngoại lệ đó được đưa rastringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Cuối cùng, giao thức lặp kiểu cũ đã được thử. nếu một lớp định nghĩa
atom ::=65,identifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
parenth_form ::= "[" [starred_expression
] "]"
80 là literal ::=81 khi và chỉ khi có một chỉ số nguyên không âm i sao chostringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
comprehension ::=03 và không có chỉ số nguyên nào thấp hơn làm tăng ngoại lệ. [Nếu có bất kỳ ngoại lệ nào khác được nêu ra, thì coi như ngoại lệ đó được nêu ra]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
]
Toán tử được định nghĩa là có giá trị chân lý nghịch đảo của
6. 10. 3. So sánh danh tính
Các toán tử và kiểm tra danh tính của một đối tượng.
parenth_form ::= "[" [starred_expression
] "]"
04 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 hàm. comprehension ::=12 mang lại giá trị chân lý nghịch đảo.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
]
6. 11. Các phép toán Boolean
literal ::=5stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Trong ngữ cảnh của các phép toán 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 ::=82,stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
generator_expression ::= "["1, số 0 của tất cả các loại, chuỗi và vùng chứa trống [bao gồm chuỗi, bộ dữ liệu, danh sách, từ điển, bộ và bộ đóng băng]. 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ị thực của chúng bằng cách cung cấp phương thứcexpression
comp_for
"]"
comprehension ::=15assignment_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
]
Toán tử mang lại
literal ::=81 nếu đối số của nó là sai,stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=82 nếu khôngstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Biểu thức
comprehension ::=19 đánh giá x đầu tiên;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
]
Biểu thức
comprehension ::=20 lần đầu tiên đánh giá x;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
]
Lưu ý rằng cũng không hạn chế giá trị và loại chúng trả về
literal ::=82 vàstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=81, mà trả về đối số được đánh giá cuối cùng. Điều này đôi khi hữu ích, e. g. , nếustringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
comprehension ::=25 là một chuỗi nên được thay thế bằng một giá trị mặc định nếu nó trống, biểu thứcassignment_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
]
comprehension ::=26 sẽ mang lại giá trị mong muốn. Bởi vì phải tạo một giá trị mới, nó trả về một giá trị boolean bất kể loại đối số của nó [ví dụ: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
]
comprehension ::=28 tạo raassignment_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
]
literal ::=82 thay vìstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
comprehension ::=30. ]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
]
6. 12. Biểu thức gán
literal ::=6stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Một biểu thức gán [đôi khi còn được gọi là "biểu thức được đặt tên" hoặc "hải mã"] gán một cho một , đồng thời trả về giá trị của
Một trường hợp sử dụng phổ biến là khi xử lý các biểu thức chính quy phù hợp
literal ::=7stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Hoặc, khi xử lý luồng tệp theo khối
literal ::=8stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
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 thức con trong biểu thức cắt, điều kiện, lambda, đối số từ khóa và hiểu-nếu và trong câu lệnh
comprehension ::=34 và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
]
comprehension ::=35. Ở tất cả những nơi khác mà chúng có thể được sử dụng, dấu ngoặc đơn không bắt buộc, kể cả trong câu lệnhassignment_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
]
comprehension ::=2 và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
]
comprehension ::=37assignment_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
]
Mới trong phiên bản 3. 8. Xem PEP 572 để biết thêm chi tiết về biểu thức gán.
6. 13. Biểu thức điều kiện
literal ::=9stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Biểu thức điều kiện [đôi khi được gọi là “toán tử bậc ba”] có mức ưu tiên thấp nhất trong tất cả các phép toán Python
Biểu thức
comprehension ::=38 đầu 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ề;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
]
Xem PEP 308 để biết thêm chi tiết về biểu thức điều kiện
6. 14. Lambda
parenth_form ::= "[" [starred_expression
] "]"
0Biểu thức lambda [đôi khi được gọi là biểu mẫu lambda] được sử dụng để tạo hàm ẩn danh. Biểu thức
comprehension ::=39 mang lại một đối tượng chức năng. Đối tượng chưa được đặt tên hoạt động giống như một đối tượng chức năng được xác định bằngassignment_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
]
parenth_form ::= "[" [starred_expression
] "]"
1Xem phần cú pháp của danh sách tham số. Lưu ý rằng các hàm được tạo bằng biểu thức lambda không thể chứa câu lệnh hoặc chú thích
6. 15. Danh sách biểu thức
parenth_form ::= "[" [starred_expression
] "]"
2Ngoại trừ khi là một phần của danh sách hoặc tập hợp hiển thị, danh sách biểu thức chứa ít nhất một dấu phẩy sẽ tạo ra một bộ. Độ dài của bộ dữ liệu là số biểu thức trong danh sách. Các biểu thức được đánh giá từ trái sang phải
Dấu hoa thị
literal ::=12 biểu thị quá trình giải nén có thể lặp lại. Toán hạng của nó phải là một. Iterable được mở rộng thành một chuỗi các mục, được bao gồm trong bộ, danh sách hoặc bộ mới, tại vị trí giải nénstringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Mới trong phiên bản 3. 5. Giải nén lặp lại trong danh sách biểu thức, do PEP 448 đề xuất ban đầu.
Dấu phẩy ở cuối chỉ được yêu cầu để tạo một bộ đơn [a. k. a. một người độc thân]; . Một biểu thức duy nhất không có dấu phẩy ở cuối không tạo ra một bộ dữ liệu, mà mang lại giá trị của biểu thức đó. [Để tạo một bộ trống, hãy sử dụng một cặp dấu ngoặc đơn trống.
comprehension ::=41. ]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
]
6. 16. Trình tự đánh giá
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 bài tập, phía bên tay 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 các hậu tố của chúng
parenth_form ::= "[" [starred_expression
] "]"
36. 17. Thứ tự ưu tiên của toán tử
Bảng sau đây tóm tắt mức độ ưu tiên của toán tử trong Python, từ mức độ ưu tiên cao nhất [liên kết nhiều nhất] đến mức độ ưu tiên thấp nhất [ít ràng buộc nhất]. Các toán tử trong cùng một hộp có cùng quyền ưu tiên. Trừ khi cú pháp được đưa ra rõ ràng, các toán tử là nhị phân. Các toán tử trong cùng một hộp nhóm từ trái sang phải [trừ biểu thức lũy thừa và biểu thức điều kiện nhóm từ phải sang trái]
Lưu ý rằng các phép so sánh, kiểm tra tư cách 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 xâu chuỗi từ trái sang phải như được mô tả trong phần
Nhà điều hành
Sự miêu tả
comprehension ::=42,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
]
comprehension ::=43,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
]
comprehension ::=44,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
]
comprehension ::=45assignment_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
]
Biểu thức ràng buộc hoặc trong ngoặc đơn, hiển thị danh sách, hiển thị từ điển, hiển thị tập hợp
comprehension ::=46,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
]
comprehension ::=47,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
]
comprehension ::=48,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
]
comprehension ::=49assignment_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
]
Đăng ký, cắt, gọi, tham chiếu thuộc tính
chờ đợi biểu hiện
set_display ::= "{" [5starred_list
|comprehension
] "}"
lũy thừa
comprehension ::=52,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
]
comprehension ::=53,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
]
comprehension ::=54assignment_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
]
Tích cực, tiêu cực, bitwise KHÔNG
literal ::=12,stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=43,stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=44,stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=45,stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=49stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Phép nhân, phép nhân ma trận, phép chia, phép chia tầng, phần dư
literal ::=33,stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=31stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Cộng và trừ
comprehension ::=62,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
]
comprehension ::=63assignment_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
]
Ca làm việc
literal ::=71stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Bitwise AND
literal ::=74stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Bitwise XOR
literal ::=77stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Bitwise HOẶC
, , , ,
literal ::=93,stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=97,stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=94,stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=96,stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=98,stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
literal ::=95stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
So sánh, bao gồm kiểm tra tư cách thành viên và kiểm tra danh tính
Boolean KHÔNG
Boolean VÀ
Boolean HOẶC
–
comprehension ::=81assignment_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
]
Biểu thức điều kiện
biểu thức lambda
comprehension ::=83assignment_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
]
biểu thức gán
chú thích
Mặc dù
comprehension ::=84 đúng về mặt toán học, nhưng đối với số float, nó có thể không đúng về mặt số do làm tròn. Ví dụ: và giả sử một nền tảng mà trên đó Python float là số có độ chính xác kép IEEE 754, để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
]
comprehension ::=85 có cùng dấu vớiassignment_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
]
comprehension ::=86, thì kết quả được tính toán là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
]
comprehension ::=87, chính xác bằng số vớiassignment_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
]
comprehension ::=86. Thay vào đó, hàm trả về một kết quả có dấu khớp với dấu của đối số đầu tiên và do đó trả về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
]
comprehension ::=90 trong trường hợp này. Cách tiếp cận nào phù hợp hơn tùy thuộc vào ứng dụngassignment_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
]
Nếu x rất gần với bội số nguyên chính xác của y, thì có thể
comprehension ::=91 lớn hơn một lần so vớiassignment_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
]
comprehension ::=92 do làm tròn. Trong những trường hợp như vậy, Python trả về kết quả cuối cùng, để đảm bảo rằngassignment_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
]
comprehension ::=93 rất gần vớiassignment_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
]
atom ::=79identifier
|literal
|enclosure
enclosure ::=parenth_form
|list_display
|dict_display
|set_display
|generator_expression
|yield_atom
Tiêu chuẩn Unicode phân biệt giữa các điểm mã [e. g. U+0041] và ký tự trừu tượng [e. g. “CHỮ VỐN LATIN A”]. Trong khi 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ã, ngoài ra còn có một số ký tự trừu tượng có thể được biểu diễn bằng một chuỗi gồm nhiều hơn một điểm mã. Ví dụ: ký tự trừu tượng “CHỮ VỐN LATIN C VỚI CEDILLA” có thể được biểu diễn dưới dạng một ký tự được soạn trước duy nhất tại vị trí mã U+00C7 hoặc dưới dạng một chuỗi ký tự cơ sở tại vị trí mã U+0043 [CHỮ IN HOA LATIN C],
Các toán tử so sánh trên các chuỗi so sánh ở mức điểm mã Unicode. Điều này có thể phản trực giác với con người. Ví dụ:
comprehension ::=95 là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
]
literal ::=82, mặc dù cả hai chuỗi đại diện cho cùng một ký tự trừu tượng “CHỮ VỐN LATIN C VỚI CEDILLA”stringliteral
|bytesliteral
|integer
|floatnumber
|imagnumber
Để so sánh các chuỗi ở cấp ký tự trừu tượng [nghĩa là theo cách trực quan đối với con người], hãy sử dụng
Do tính năng thu gom rác tự động, danh sách miễn phí và tính chất động của bộ mô tả, bạn có thể nhận thấy hành vi có vẻ bất thường trong một số cách sử dụng nhất định của toán tử, chẳng hạn như những hành vi liên quan đến so sánh giữa các phương thức mẫu hoặc hằng số. Kiểm tra tài liệu của họ để biết thêm thông tin
Toán tử lũy thừa
set_display ::= "{" [5 liên kết kém chặt chẽ hơn so với toán tử một ngôi số học hoặc bitwise ở bên phải của nó, nghĩa là,starred_list
|comprehension
] "}"
list_display ::= "[" [00 làstarred_list
|comprehension
] "]"
list_display ::= "[" [01starred_list
|comprehension
] "]"