Что обычно верно про (row for row in rows) по сравнению с [row for row in rows], если rows — большой поток данных?
AОба создают список в памяти одинакового размера.
BГенераторное выражение всегда быстрее списка.
CСписок нельзя итерировать, а генератор можно.
DГенераторное выражение вычисляет элементы лениво и обычно экономит память, но его результат одноразовый.
Правильный ответ. Генератор — ленивый и потоковый, список — материализованный и подходит для повторных проходов.
Разбор
List comprehension [row for row in rows] создаёт весь список сразу и хранит его в памяти. Generator expression (row for row in rows) возвращает итератор, который выдаёт элементы по мере запроса, поэтому чаще экономит память на больших данных. Но генератор нельзя «перемотать»: после одного прохода он исчерпывается.
Проверь себя · 1/3разбор после ответа
Какой объект является iterator и может быть напрямую использован в
next(obj)?Ещё вопросы по теме «Итераторы и генераторы»
- Есть `xs = [1, 2, 3]` и `it = iter(xs)`. Сначала выполняется `a = list(it)`, а затем `b = list(it)`. Чему равно `b`?
- Есть `it = iter(['a', 'b'])`. Что вернёт вызов `next(it)`?
- Дан генератор: `def gen(): print('A'); yield 1; print('B'); yield 2`. Сразу после `g = gen()` что будет выведено в консоль?
- Что создаёт выражение `squares = (x * x for x in xs)`?
- В отладке вы сделали `pairs = zip(users, spends)`, затем `debug = list(pairs)`. После этого `d = dict(pairs)` оказался пустым. Почему?
- Все вопросы по «Итераторы и генераторы» →