bpo-46725: Document starred expressions in for statements (GH-31481)

Automerge-Triggered-By: GH:pablogsal
This commit is contained in:
Pablo Galindo Salgado 2022-02-22 17:26:46 +00:00 committed by GitHub
parent 09487c11a5
commit 7fb94fd7a8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 22 additions and 8 deletions

View file

@ -154,17 +154,20 @@ The :keyword:`for` statement is used to iterate over the elements of a sequence
(such as a string, tuple or list) or other iterable object: (such as a string, tuple or list) or other iterable object:
.. productionlist:: python-grammar .. productionlist:: python-grammar
for_stmt: "for" `target_list` "in" `expression_list` ":" `suite` for_stmt: "for" `target_list` "in" `starred_list` ":" `suite`
: ["else" ":" `suite`] : ["else" ":" `suite`]
The expression list is evaluated once; it should yield an iterable object. An The expression list is evaluated once; it should yield an iterable object. An
iterator is created for the result of the ``expression_list``. The suite is iterator is created for the result of the ``starred_list``. The expression
then executed once for each item provided by the iterator, in the order returned list can contain starred elements (``*x, *y``) that will be unpacked in the
by the iterator. Each item in turn is assigned to the target list using the final iterator (as when constructing a ``tuple`` or ``list`` literal). The
standard rules for assignments (see :ref:`assignment`), and then the suite is suite is then executed once for each item provided by the iterator, in the
executed. When the items are exhausted (which is immediately when the sequence order returned by the iterator. Each item in turn is assigned to the target
is empty or an iterator raises a :exc:`StopIteration` exception), the suite in list using the standard rules for assignments (see :ref:`assignment`), and then
the :keyword:`!else` clause, if present, is executed, and the loop terminates. the suite is executed. When the items are exhausted (which is immediately when
the sequence is empty or an iterator raises a :exc:`StopIteration` exception),
the suite in the :keyword:`!else` clause, if present, is executed, and the loop
terminates.
.. index:: .. index::
statement: break statement: break
@ -196,6 +199,8 @@ the built-in function :func:`range` returns an iterator of integers suitable to
emulate the effect of Pascal's ``for i := a to b do``; e.g., ``list(range(3))`` emulate the effect of Pascal's ``for i := a to b do``; e.g., ``list(range(3))``
returns the list ``[0, 1, 2]``. returns the list ``[0, 1, 2]``.
.. versionchanged:: 3.11
Starred elements are now allowed in the expression list.
.. _try: .. _try:
.. _except: .. _except:

View file

@ -160,6 +160,9 @@ traceback. (Contributed by Irit Katriel in :issue:`45607`.)
Other Language Changes Other Language Changes
====================== ======================
* Starred expressions can be used in :ref:`for statements<for>`. (See
:issue:`46725` for more details.)
* Asynchronous comprehensions are now allowed inside comprehensions in * Asynchronous comprehensions are now allowed inside comprehensions in
asynchronous functions. Outer comprehensions implicitly become asynchronous functions. Outer comprehensions implicitly become
asynchronous. (Contributed by Serhiy Storchaka in :issue:`33346`.) asynchronous. (Contributed by Serhiy Storchaka in :issue:`33346`.)

View file

@ -1403,6 +1403,12 @@ def __getitem__(self, i):
result.append(x) result.append(x)
self.assertEqual(result, [1, 2, 3]) self.assertEqual(result, [1, 2, 3])
result = []
a = b = c = [1, 2, 3]
for x in *a, *b, *c:
result.append(x)
self.assertEqual(result, 3 * a)
def test_try(self): def test_try(self):
### try_stmt: 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite] ### try_stmt: 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
### | 'try' ':' suite 'finally' ':' suite ### | 'try' ':' suite 'finally' ':' suite