В чем разница между генератором и итератором · Python Backend — JobPilot

В чем разница между генератором и итератором

Python Backend · 20%
Вопрос 2474 / #
Пример ответа

Коротко: Генератор — это частный случай итератора, который создаётся с помощью функции с yield и генерирует значения лениво, по одному, сохраняя состояние между вызовами. Итератор — более общая концепция, реализующая методы __iter__ и __next__ для последовательного доступа к элементам.

Ключевые идеи:
  • Генератор — это функция с yield, которая автоматически создаёт итератор и сохраняет состояние между вызовами, не храня все элементы в памяти.
  • Итератор — любой объект с методами __iter__ и __next__, который может перебирать элементы коллекции или последовательности, но требует явной реализации.
  • Генераторы более лаконичны и эффективны для потоковой обработки данных, тогда как итераторы подходят для кастомных структур данных.
Пример: Генератор: def count_up_to(n): i = 0; while i < n: yield i; i += 1 — значения генерируются по требованию. Итератор: class Counter: def __init__(self, n): self.n = n; self.i = 0; def __iter__(self): return self; def __next__(self): if self.i < self.n: result = self.i; self.i += 1; return result; else: raise StopIteration — требует явного управления состоянием.
Пример генератора и кастомного итератора для сравнения
python
# Генератор с yield

def fibonacci_generator(limit):
    a, b = 0, 1
    while a < limit:
        yield a
        a, b = b, a + b

# Использование генератора
for num in fibonacci_generator(10):
    print(num)  # Выводит: 0, 1, 1, 2, 3, 5, 8

# Кастомный итератор
class FibonacciIterator:
    def __init__(self, limit):
        self.limit = limit
        self.a = 0
        self.b = 1
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.a >= self.limit:
            raise StopIteration
        result = self.a
        self.a, self.b = self.b, self.a + self.b
        return result

# Использование итератора
fib_iter = FibonacciIterator(10)
for num in fib_iter:
    print(num)  # Выводит: 0, 1, 1, 2, 3, 5, 8
Вопросы для интервьюера:
  • Когда вы предпочтёте использовать генератор вместо итератора в реальном проекте?Я выбираю генераторы для обработки больших потоков данных, таких как чтение файлов построчно или потоковые API, чтобы экономить память и упростить код.
  • Можно ли преобразовать генератор в итератор и наоборот?Да, генератор уже является итератором, но кастомный итератор можно эмулировать через генератор, используя yield в функции для более лаконичной реализации.
Практический совет (на неделю):
  1. Используйте генераторы для ленивых вычислений и больших наборов данных, чтобы избежать загрузки всего в память.
  2. Реализуйте кастомные итераторы только когда нужен сложный контроль состояния, в остальных случаях предпочитайте генераторы для простоты.
Python Backend
Общий
20%
Навигация
Что такое контекстный менеджер в Python
Следующий: Что такое SOLID
Предыдущий: Что такое контекстный менеджер в Python

Мы используем cookie для улучшения сайта. Продолжая пользоваться сайтом, вы соглашаетесь с политикой cookie и политикой конфиденциальности.