Генератор виразів

Оновлено: 28.04.2023

Генеруючий вираз — це компактний генераторний запис у круглих дужках:

generator_expression ::=  "(" expression comp_for ")"

Генеруючий вираз дає новий генераторний об’єкт. Його синтаксис такий самий, як і для розуміння, за винятком того, що він узятий у дужки замість дужок або фігурних дужок.

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

У викликах лише з одним аргументом дужки можна опускати. Подробиці див. у розділі Дзвінки.

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

Якщо вираз генератора містить пропозиції async for або вирази await, це називається asynchronous generator expression. Вираз асинхронного генератора повертає новий об’єкт асинхронного генератора, який є асинхронним ітератором (див. Асинхронні ітератори).