Хотите получить все пары значений из xs = [1, 2, 3]. Написали g = (x for x in xs) и затем pairs = []; for a in g: for b in g: pairs.append((a, b)). Почему pairs получится короче ожидаемого?
AПотому что
pairs.append((a, b)) нельзя использовать в цикле.BПотому что
for не умеет работать с generator expression.CПотому что нужно заменить
for b in g на for b in range(...).DПотому что
g — один iterator: внутренний цикл потребляет тот же g, и он не стартует заново для каждого a; нужно использовать исходный xs или создавать новый генератор.Правильный ответ. Один и тот же итератор нельзя использовать как независимый источник в двух вложенных циклах.
Разбор
Generator expression создаёт один итератор с внутренним состоянием. Когда внешний for a in g берёт первый элемент, внутренний for b in g продолжает чтение этого же итератора со следующей позиции и быстро исчерпывает его. Поэтому последующие значения a могут вообще не появиться. Для всех пар нужно использовать независимые источники, например for a in xs: for b in xs: ... или создавать новый генератор внутри внешнего цикла.
Проверь себя · 1/3разбор после ответа
Создали
g = (x for x in [1, 2, 3]), затем s1 = sum(g) и s2 = sum(g). Чему равно s2?Ещё вопросы по теме «Итераторы и генераторы»
- Есть `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)` оказался пустым. Почему?
- Все вопросы по «Итераторы и генераторы» →