Відображення списків, наборів і словників

Оновлено: 24.04.2023

Для побудови списку, набору або словника Python надає спеціальний синтаксис, званий «дисплеями», кожен з яких у двох варіантах:

або вміст контейнера перераховано явно, або вони обчислюються за допомогою набору інструкцій циклу та фільтрації, які називаються comprehension.

Загальні синтаксичні елементи для розуміння:

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]

Розуміння складається з одного виразу, за яким слідує принаймні одна пропозиція for і нуль або більше пропозицій for або if. У цьому випадку елементи нового контейнера — це ті, які були б створені шляхом розгляду кожного з пропозицій for або if блоку, вкладення зліва направо та оцінювання виразу створювати елемент кожного разу, коли досягнуто внутрішнього блоку.

Однак, окрім ітераційного виразу в крайньому лівому реченні for, розуміння виконується в окремій неявно вкладеній області. Це гарантує, що імена, призначені в цільовому списку, не «просочуються» в охоплюючу область.

Ітераційний вираз у крайньому лівому реченні for обчислюється безпосередньо в охоплюючій області, а потім передається як аргумент до неявно вкладеної області. Наступні пропозиції for і будь-яка умова фільтра в крайньому лівому пункті for не можуть бути оцінені в охоплюючій області, оскільки вони можуть залежати від значень, отриманих від крайнього лівого ітератора. Наприклад: [x*y для x в діапазоні (10) для y в діапазоні (x, x+10)].

Щоб гарантувати, що розуміння завжди призводить до контейнера відповідного типу, вирази yield і yield from заборонені в неявно вкладеній області.

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 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 530.