Вопрос16
Осталось:

Что такое генераторы и чем они отличаются от списков?

Образцовый ответ

Показывать ответ по умолчанию

Генератор — это функция, которая возвращает элементы по одному с помощью yield, а не создаёт весь список в памяти сразу.

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

def count_up_to(n):
    i = 1
    while i <= n:
        yield i
        i += 1

for num in count_up_to(5):
    print(num)  # 1, 2, 3, 4, 5

Генераторное выражение:

Аналог list comprehension, но с круглыми скобками:

# List comprehension — создаёт весь список в памяти
squares_list = [x ** 2 for x in range(1000000)]

# Генераторное выражение — вычисляет по одному
squares_gen = (x ** 2 for x in range(1000000))

Ключевые отличия от списка:

  • Память: генератор хранит только текущий элемент, а не всю коллекцию.
  • Одноразовость: генератор можно пройти только один раз.
  • Ленивость: элементы вычисляются по запросу, а не заранее.
gen = (x for x in range(3))
print(list(gen))  # [0, 1, 2]
print(list(gen))  # [] — уже исчерпан

Когда использовать:

  • Генератор — при работе с большими данными, потоками, когда не нужно хранить все элементы.
  • Список — когда нужен многократный доступ, индексация или известно, что данных немного.