6. Expressions¶
This chapter explains the meaning of the elements of expressions in Python.
Syntax Notes: 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
and no semantics are given, the semantics of this form of name are the same
as for othername.
6.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|enclosureenclosure ::=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 Identifiers and keywords for lexical definition and section Naming and binding 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 NameError
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 __spam occurring in a class named Ham will be transformed
to _Ham__spam. 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. 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 Literals for details.
All literals correspond to immutable data types, and hence the object’s identity is less important than its value. Multiple evaluations of literals with the same value (either the same occurrence in the program text or a different occurrence) may obtain the same object or a different object with the same value.
6.2.3. Parenthesized forms¶
A parenthesized form is an optional expression list enclosed in parentheses:
parenth_form ::= "(" [starred_expression] ")"
A parenthesized expression list yields whatever that expression list yields: if the list contains at least one comma, it yields a tuple; otherwise, it yields the single expression that makes up the expression list.
An empty pair of parentheses yields an empty tuple object. Since tuples are immutable, the rules for literals apply (i.e., two occurrences of the empty tuple may or may not yield the same object).
Note that tuples are not formed by the parentheses, but rather by use of the comma operator. The exception is the empty tuple, for which parentheses are required — allowing unparenthesized 「nothing」 in expressions would cause ambiguities and allow common typos to pass uncaught.
6.2.4. Displays for lists, sets and dictionaries¶
For constructing a list, a set or a dictionary Python provides special syntax called 「displays」, each of them in two flavors:
- either the container contents are listed explicitly, or
- they are computed via a set of looping and filtering instructions, called a comprehension.
Common syntax elements for comprehensions are:
comprehension ::=expressioncomp_forcomp_for ::= ["async"] "for"target_list"in"or_test[comp_iter] comp_iter ::=comp_for|comp_ifcomp_if ::= "if"expression_nocond[comp_iter]
The comprehension consists of a single expression followed by at least one
for clause and zero or more for or if clauses.
In this case, the elements of the new container are those that would be produced
by considering each of the for or if clauses a block,
nesting from left to right, and evaluating the expression to produce an element
each time the innermost block is reached.
However, aside from the iterable expression in the leftmost for 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 scope.
The iterable expression in the leftmost for clause is evaluated
directly in the enclosing scope and then passed as an argument to the implictly
nested scope. Subsequent for clauses and any filter condition in the
leftmost for clause cannot be evaluated in the enclosing scope as
they may depend on the values obtained from the leftmost iterable. For example:
[x*y for x in range(10) for y in range(x, x+10)].
To ensure the comprehension always results in a container of the appropriate
type, yield and yield from expressions are prohibited in the implicitly
nested scope (in Python 3.7, such expressions emit DeprecationWarning
when compiled, in Python 3.8+ they will emit SyntaxError).
Since Python 3.6, in an async def function, an async for
clause may be used to iterate over a asynchronous iterator.
A comprehension in an async def function may consist of either a
for or async for clause following the leading
expression, may contain additional for or async for
clauses, and may also use await expressions.
If a comprehension contains either async for clauses
or await 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.
3.6 版新加入: Asynchronous comprehensions were introduced.
3.7 版後已棄用: yield and yield from deprecated in the implicitly nested scope.
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 {}; this literal constructs an empty
dictionary.
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 ** denotes dictionary unpacking.
Its operand must be a 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.
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 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.
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
__next__() method is called for the generator object (in the same
fashion as normal generators). However, the iterable expression in the
leftmost for 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.
Subsequent for clauses and any filter condition in the leftmost
for clause cannot be evaluated in the enclosing scope as they may
depend on the values obtained from the leftmost iterable. For example:
(x*y for x in range(10) for y in range(x, x+10)).
The parentheses can be omitted on calls with only one argument. See section Calls for details.
To avoid interfering with the expected operation of the generator expression
itself, yield and yield from expressions are prohibited in the
implicitly defined generator (in Python 3.7, such expressions emit
DeprecationWarning when compiled, in Python 3.8+ they will emit
SyntaxError).
If a generator expression contains either async for
clauses or await expressions it is called an
asynchronous generator expression. An asynchronous generator
expression returns a new asynchronous generator object,
which is an asynchronous iterator (see Asynchronous Iterators).
3.6 版新加入: Asynchronous generator expressions were introduced.
3.7 版更變: Prior to Python 3.7, asynchronous generator expressions could
only appear in async def coroutines. Starting
with 3.7, any function can use asynchronous generator expressions.
3.7 版後已棄用: yield and yield from deprecated in the implicitly nested scope.
6.2.9. Yield expressions¶
yield_atom ::= "(" yield_expression ")"
yield_expression ::= "yield" [expression_list | "from" expression]
The yield expression is used when defining a 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,
and using it in an async def function’s body causes that
coroutine function to be an asynchronous generator. For example:
def gen(): # defines a generator function
yield 123
async def agen(): # defines an asynchronous generator function (PEP 525)
yield 123
Due to their side effects on the containing scope, yield expressions
are not permitted as part of the implicitly defined scopes used to
implement comprehensions and generator expressions (in Python 3.7, such
expressions emit DeprecationWarning when compiled, in Python 3.8+
they will emit SyntaxError)..
3.7 版後已棄用: Yield expressions deprecated in the implicitly nested scopes used to implement comprehensions and generator expressions.
Generator functions are described below, while asynchronous generator functions are described separately in section Asynchronous generator functions.
When a generator function is called, it returns an iterator known as a
generator. That generator then controls the execution of the generator function.
The execution starts when one of the generator’s methods is called. At that
time, the execution proceeds to the first yield expression, where it is
suspended again, returning the value of expression_list to the generator’s
caller. By suspended, we mean 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 calling one of the
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
__next__() is used (typically via either a for or
the next() builtin) then the result is None. Otherwise, if
send() is used, then the result will be the value passed in to
that method.
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 try 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 close() method will be called,
allowing any pending finally clauses to execute.
When yield from <expr> is used, it treats the supplied expression as
a subiterator. All values produced by that subiterator are passed directly
to the caller of the current generator’s methods. Any values passed in with
send() and any exceptions passed in with
throw() are passed to the underlying iterator if it has the
appropriate methods. If this is not the case, then send()
will raise AttributeError or TypeError, while
throw() will just raise the passed in exception immediately.
When the underlying iterator is complete, the value
attribute of the raised StopIteration instance becomes the value of
the yield expression. It can be either set explicitly when raising
StopIteration, or automatically when the sub-iterator is a generator
(by returning a value from the sub-generator).
3.3 版更變: Added
yield from <expr>to delegate control flow to a subiterator.
The parentheses may be omitted when the yield expression is the sole expression on the right hand side of an assignment statement.
也參考
- PEP 255 - Simple Generators
- The proposal for adding generators and the
yieldstatement to Python. - PEP 342 - Coroutines via Enhanced Generators
- The proposal to enhance the API and syntax of generators, making them usable as simple coroutines.
- PEP 380 - Syntax for Delegating to a Subgenerator
- The proposal to introduce the
yield_fromsyntax, making delegation to sub-generators easy.
6.2.9.1. Generator-iterator methods¶
This subsection describes the methods of a generator iterator. They can be used to control the execution of a generator function.
Note that calling any of the generator methods below when the generator
is already executing raises a ValueError exception.
-
generator.__next__()¶ Starts the execution of a generator function or resumes it at the last executed yield expression. When a generator function is resumed with a
__next__()method, the current yield expression always evaluates toNone. The execution then continues to the next yield expression, where the generator is suspended again, and the value of theexpression_listis returned to__next__()』s caller. If the generator exits without yielding another value, aStopIterationexception is raised.This method is normally called implicitly, e.g. by a
forloop, or by the built-innext()function.
-
generator.send(value)¶ Resumes the execution and 「sends」 a value into the generator function. The value argument becomes the result of the current yield expression. The
send()method returns the next value yielded by the generator, or raisesStopIterationif the generator exits without yielding another value. Whensend()is called to start the generator, it must be called withNoneas the argument, because there is no yield expression that could receive the value.
-
generator.throw(type[, value[, traceback]])¶ Raises an exception of type
typeat the point where the generator was paused, and returns the next value yielded by the generator function. If the generator exits without yielding another value, aStopIterationexception is raised. If the generator function does not catch the passed-in exception, or raises a different exception, then that exception propagates to the caller.
-
generator.close()¶ Raises a
GeneratorExitat the point where the generator function was paused. If the generator function then exits gracefully, is already closed, or raisesGeneratorExit(by not catching the exception), close returns to its caller. If the generator yields a value, aRuntimeErroris raised. If the generator raises any other exception, it is propagated to the caller.close()does nothing if the generator has already exited due to an exception or normal exit.
6.2.9.2. Examples¶
Here is a simple example that demonstrates the behavior of generators and generator functions:
>>> def echo(value=None):
... print("Execution starts when 'next()' is called for the first time.")
... try:
... while True:
... try:
... value = (yield value)
... except Exception as e:
... value = e
... finally:
... print("Don't forget to clean up when 'close()' is called.")
...
>>> generator = echo(1)
>>> print(next(generator))
Execution starts when 'next()' is called for the first time.
1
>>> print(next(generator))
None
>>> print(generator.send(2))
2
>>> generator.throw(TypeError, "spam")
TypeError('spam',)
>>> generator.close()
Don't forget to clean up when 'close()' is called.
For examples using yield from, see PEP 380: Syntax for Delegating to a Subgenerator in 「What’s New in
Python.」
6.2.9.3. Asynchronous generator functions¶
The presence of a yield expression in a function or method defined using
async def further defines the function as a
asynchronous generator function.
When an asynchronous generator function is called, it returns an asynchronous iterator known as an asynchronous generator object. That object then controls the execution of the generator function. An asynchronous generator object is typically used in an
