Генератори в Python

 11336

Генератор в Python — це функція, що повертає ітератор, який під час ітерації генерує послідовність значень. Генератори корисні, коли нам потрібно отримати велику послідовність значень, але ми не хочемо зберігати їх всі в пам’яті відразу.

Створення генератора в Python

Як і зі звичайними функціями, функцію-генератор в Python можна визначити за допомогою ключового слова def, але замість оператора return використовується оператор yield.

Тут ключове слово yield використовується для повернення значення з генератора. Коли викликається генератор, його тіло (код) не виконується відразу. Натомість повертається об’єкт генератора, який можна ітерувати для отримання значень.

Ось приклад функції-генератора, що генерує послідовність чисел:

Результат:

0
1
2

Тут функція-генератор my_generator() приймає як аргумент ціле число n і видає послідовність чисел від 0 до n-1. Ключове слово yield використовується для отримання значення з генератора та зупинки виконання функції-генератора до запиту наступного значення.

Цикл for ітерує об’єкт генератора, створений функцією my_generator(), а оператор print виводить на екран кожне значення, видане генератором. Ми також можемо створити об’єкт генератора з функції-генератора, викликавши її так само, як будь-яку іншу функцію:

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

В Python генераторний вираз — це лаконічний спосіб створення об’єкта генератора. Він схожий на абстракцію списків, але замість створення списку він створює об’єкт-генератор, який можна ітерувати для отримання значень.

Генераторний вираз в Python має наступний синтаксис:

Тут вираз — це значення, яке буде повернено для кожного елемент в ітератор.

Генераторний вираз створює об’єкт генератора, який при ітерації видає значення виразу для кожного елемента в ітераторі по одному за один раз.

Розглянемо приклад генераторного виразу в Python:

Результат:

0
1
4
9
16

Тут ми створили об’єкт генератора, який при ітерації підноситиме до квадрата кожне число з послідовності від 0 до 4. Потім ми використали цикл for для виконання ітерацій над генератором і виводу значень на екран.

Користь від генераторів в Python

Є декілька причин, чому генератори є корисною конструкцією в Python.

1. Простота реалізації.

Генератори створювати простіше, ніж ітератори.

Ось приклад програми піднесення значень до квадрата на кожній ітерації, використовуючи клас ітератора:

А тепер те саме завдання, але з використанням генератора:

Реалізація за допомогою генератора вийшла лаконічнішою та “чистішою”.

2. Ефективність використання пам’яті.

Звичайна функція, що повертає послідовність, створює всю послідовність у пам’яті, перш ніж повернути результат. Це проблема, коли кількість елементів у послідовності величезна.

Використання генераторів у подібних випадках не вимагає використання великої кількості пам’яті та є кращим варіантом, оскільки віддає лише один елемент за раз.

3. Представлення нескінченного потоку даних.

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

Наступна функція-генератор може генерувати всі парні числа (принаймні теоретично):

4. Обробка кількох операцій.

Декілька генераторів можна використовувати для обробки відразу кількох операцій. Найкраще це проілюструвати на прикладі.

Припустимо, у нас є генератор, який генерує послідовність чисел Фібоначчі. Та є ще один генератор для піднесення чисел до квадрата.

Якщо ми хочемо дізнатися суму квадратів чисел Фібоначчі, ми можемо зробити це, поєднавши разом вихідні дані генераторів:

Результат:

4895

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (18 оцінок, середня: 4,94 з 5)
Завантаження...

Залишити відповідь

Ваш E-mail не буде опублікований. Обов'язкові поля відмічені *