Хотите получить все пары значений из 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)?
Тренировать Python в Telegram

Ещё вопросы по теме «Итераторы и генераторы»