single
Генераторні Функції
Свайпніть щоб показати меню
Генераторна функція — це особливий тип функції, яка використовує ключове слово yield замість return для створення послідовності значень. При виклику генераторної функції повертається об'єкт-ітератор, який можна перебирати для отримання значень по одному.
Об'єкт-ітератор — це об'єкт, який реалізує протокол ітератора, визначаючи методи __iter__() та __next__(). Це дозволяє отримувати елементи по одному за допомогою next(), що робить можливим перебір елементів у послідовностях або генераторних функціях.
Основна перевага генераторних функцій — ефективне використання пам'яті. Замість створення всієї послідовності наперед і зберігання її в пам'яті, генератори створюють значення на льоту у міру необхідності.
Як працює yield
На відміну від return, який повністю завершує виконання функції, yield призупиняє функцію та зберігає її стан. Під час наступного виклику next() генератор відновлює виконання саме з того місця, де був зупинений:
12345678910def count_up(start, stop): while start <= stop: yield start # Pause and return the current value start += 1 # Resume from here on the next call counter = count_up(1, 3) print(next(counter)) # 1 print(next(counter)) # 2 print(next(counter)) # 3
Можна також ітеруватися по генератору за допомогою циклу for – він автоматично викликає next() до завершення генератора:
1234567def count_up(start, stop): while start <= stop: yield start start += 1 for value in count_up(1, 5): print(value) # 1, 2, 3, 4, 5
Коли генератор вичерпано (немає більше значень для повернення через yield), виклик next() для нього призведе до виникнення виключення StopIteration. Цей процес автоматично обробляється циклом for.
Проведіть, щоб почати кодувати
Реалізуйте генераторну функцію even_numbers, яка генерує парні числа у заданому діапазоні.
- Визначте генераторну функцію
even_numbers, яка приймає два параметри:startтаstop. - Використайте цикл
whileдля ітерації, покиstartменше або дорівнюєstop. - Використайте
yieldдля повернення значенняstartлише якщо воно парне (ділиться на 2). - Збільшуйте
startна 1 після кожної ітерації. - Використайте цикл
forдля виведення всіх згенерованих значень.
Рішення
Дякуємо за ваш відгук!
single
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат