Вопрос №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)) # [] — уже исчерпан
Когда использовать:
- Генератор — при работе с большими данными, потоками, когда не нужно хранить все элементы.
- Список — когда нужен многократный доступ, индексация или известно, что данных немного.
