Встречается на собеседованиях • сегодня

Что такое генератор

Что такое генератор

Генератор – это итератор, элементы которого можно итерировать только 1 раз

  • Элементы генератора итерируются только 1 раз, потому что они не хранятся в памяти все вместе, а создаются на лету
  • Генераторы это способ реализации итераторов
  • Генератор можно реализовать как функцию или как выражение

Выражение генаратор (Generator Expressions)

Выглядят также как генераторы списка, только не в [] а в ()

python
my_generator = (i for i in range(10))

Функция генератор

  • Для возврата значения функция использует не return a yield
python
def generator():
    for i in range(2):
        yield i

# Пример работы 1 
a = generator()
print(next(a)) # 0
print(next(a)) # 1
print(next(a)) # StopIteration

# Пример работы 2
a = generator()

for i in a:
    print(i)
# 1
# 2
python
def fibon(n):
    a = b = 1
    for i in range(n):
        yield a
        a, b = b, a + b

for x in fibon(10):
    print(x)

В объекте генераторе определены методы iter и next, то есть реализован протокол итератора, то есть по сути любой генератор является итератором. Концептуально, итератор — это механизм поэлементного обхода данных, а генератор позволяет отложено создавать результат при итерации.

Генератор может создавать результат на основе какого-то алгоритма или брать элементы из источника данных (коллекция, файлы, сетевое подключения и пр.) и изменять их.

Ярким пример являются функции range и enumerate:

range генерирует ограниченную арифметическую прогрессию целых чисел, не используя никакой источник данных.

enumerate генерирует двухэлементные кортежи с индексом и одним элементом из итерируемого объекта.

Для начало напишем простой генератор не используя объект-генератор. Это генератор чисел Фибоначчи:
 

python
class FibonacciGenerator:
    def __init__(self):
        self.prev = 0
        self.cur = 1

    def __next__(self):
        result = self.prev
        self.prev, self.cur = self.cur, self.prev + self.cur
        return result

    def __iter__(self):
        return self

for i in FibonacciGenerator():
    print(i)
    
    if i > 100:
        break

Но используя ключевое слово yield  можно сильно упростить реализацию:

python
def fibonacci():
    prev, cur = 0, 1
    while True:
        yield prev
        prev, cur = cur, prev + cur

for i in fibonacci():
    print(i)
    if i > 100:
        break

Oct. 8, 2023, Источник

Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

Следующий вопрос

Это единственный вопрос по вашему фильтру

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы