@@ -183,8 +183,21 @@ by considering each of the :keyword:`for` or :keyword:`if` clauses a block,
183
183
nesting from left to right, and evaluating the expression to produce an element
184
184
each time the innermost block is reached.
185
185
186
-
Note that the comprehension is executed in a separate scope, so names assigned
187
-
to in the target list don't "leak" into the enclosing scope.
186
+
However, aside from the iterable expression in the leftmost :keyword:`for` clause,
187
+
the comprehension is executed in a separate implicitly nested scope. This ensures
188
+
that names assigned to in the target list don't "leak" into the enclosing scope.
189
+
190
+
The iterable expression in the leftmost :keyword:`for` clause is evaluated
191
+
directly in the enclosing scope and then passed as an argument to the implictly
192
+
nested scope. Subsequent :keyword:`for` clauses and any filter condition in the
193
+
leftmost :keyword:`for` clause cannot be evaluated in the enclosing scope as
194
+
they may depend on the values obtained from the leftmost iterable. For example:
195
+
``[x*y for x in range(10) for y in range(x, x+10)]``.
196
+
197
+
To ensure the comprehension always results in a container of the appropriate
198
+
type, ``yield`` and ``yield from`` expressions are prohibited in the implicitly
199
+
nested scope (in Python 3.7, such expressions emit :exc:`DeprecationWarning`
200
+
when compiled, in Python 3.8+ they will emit :exc:`SyntaxError`).
188
201
189
202
Since Python 3.6, in an :keyword:`async def` function, an :keyword:`async for`
190
203
clause may be used to iterate over a :term:`asynchronous iterator`.
@@ -198,6 +211,13 @@ or :keyword:`await` expressions it is called an
198
211
suspend the execution of the coroutine function in which it appears.
199
212
See also :pep:`530`.
200
213
214
+
.. versionadded:: 3.6
215
+
Asynchronous comprehensions were introduced.
216
+
217
+
.. deprecated:: 3.7
218
+
``yield`` and ``yield from`` deprecated in the implicitly nested scope.
219
+
220
+
201
221
.. _lists:
202
222
203
223
List displays
@@ -316,27 +336,42 @@ brackets or curly braces.
316
336
317
337
Variables used in the generator expression are evaluated lazily when the
318
338
:meth:`~generator.__next__` method is called for the generator object (in the same
319
-
fashion as normal generators). However, the leftmost :keyword:`for` clause is
320
-
immediately evaluated, so that an error produced by it can be seen before any
321
-
other possible error in the code that handles the generator expression.
322
-
Subsequent :keyword:`for` clauses cannot be evaluated immediately since they
323
-
may depend on the previous :keyword:`for` loop. For example: ``(x*y for x in
324
-
range(10) for y in bar(x))``.
339
+
fashion as normal generators). However, the iterable expression in the
340
+
leftmost :keyword:`for` clause is immediately evaluated, so that an error
341
+
produced by it will be emitted at the point where the generator expression
342
+
is defined, rather than at the point where the first value is retrieved.
343
+
Subsequent :keyword:`for` clauses and any filter condition in the leftmost
344
+
:keyword:`for` clause cannot be evaluated in the enclosing scope as they may
345
+
depend on the values obtained from the leftmost iterable. For example:
346
+
``(x*y for x in range(10) for y in range(x, x+10))``.
325
347
326
348
The parentheses can be omitted on calls with only one argument. See section
327
349
:ref:`calls` for details.
328
350
351
+
To avoid interfering with the expected operation of the generator expression
352
+
itself, ``yield`` and ``yield from`` expressions are prohibited in the
353
+
implicitly defined generator (in Python 3.7, such expressions emit
354
+
:exc:`DeprecationWarning` when compiled, in Python 3.8+ they will emit
355
+
:exc:`SyntaxError`).
356
+
329
357
If a generator expression contains either :keyword:`async for`
330
358
clauses or :keyword:`await` expressions it is called an
331
359
:dfn:`asynchronous generator expression`. An asynchronous generator
332
360
expression returns a new asynchronous generator object,
333
361
which is an asynchronous iterator (see :ref:`async-iterators`).
334
362
363
+
.. versionadded:: 3.6
364
+
Asynchronous generator expressions were introduced.
365
+
335
366
.. versionchanged:: 3.7
336
367
Prior to Python 3.7, asynchronous generator expressions could
337
368
only appear in :keyword:`async def` coroutines. Starting
338
369
with 3.7, any function can use asynchronous generator expressions.
339
370
371
+
.. deprecated:: 3.7
372
+
``yield`` and ``yield from`` deprecated in the implicitly nested scope.
373
+
374
+
340
375
.. _yieldexpr:
341
376
342
377
Yield expressions
@@ -364,6 +399,16 @@ coroutine function to be an asynchronous generator. For example::
364
399
async def agen(): # defines an asynchronous generator function (PEP 525)
365
400
yield 123
366
401
402
+
Due to their side effects on the containing scope, ``yield`` expressions
403
+
are not permitted as part of the implicitly defined scopes used to
404
+
implement comprehensions and generator expressions (in Python 3.7, such
405
+
expressions emit :exc:`DeprecationWarning` when compiled, in Python 3.8+
406
+
they will emit :exc:`SyntaxError`)..
407
+
408
+
.. deprecated:: 3.7
409
+
Yield expressions deprecated in the implicitly nested scopes used to
410
+
implement comprehensions and generator expressions.
411
+
367
412
Generator functions are described below, while asynchronous generator
368
413
functions are described separately in section
369
414
:ref:`asynchronous-generator-functions`.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4