Хотите получить все пары значений из 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)) запрещён в теле вложенного for без явного предварительного создания списка нужного размераBВнешний и внутренний цикл потребляют один итератор
g: внутренний for дочитывает его до конца, и внешний остаётся без следующих элементовCИмя
g во внутреннем for b in g нужно заменить на range(len(xs)): иначе цикл не понимает по какому объекту проходитьDДля вложенных
for обязателен list, а генераторное выражение возвращает объект без поддержки повторного обхода через iterПравильный ответ. Один и тот же итератор-генератор нельзя использовать как независимый источник в двух вложенных циклах.
Разбор
Генераторное выражение создаёт один итератор с внутренним состоянием. Когда внешний for a in g берёт первый элемент, внутренний for b in g дочитывает тот же итератор до конца и исчерпывает его. Поэтому последующих значений a уже не будет — итератор не перезапускается. Чтобы получить все пары, используйте независимые источники: for a in xs: for b in xs: ... или создавайте новый генератор внутри внешнего цикла.
Проверь себя · 1/3разбор после ответа
Есть
it = iter([5]). Выполнили next(it), а затем next(it, -1). Что вернёт второй вызов next(it, -1)?Ещё вопросы по теме «Итераторы и генераторы»
- Есть `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)` оказался пустым словарём. Почему?
- Все вопросы по «Итераторы и генераторы» →