перечисление встроенная функция возвращает iterator
, когда элементы исчерпаны, она останавливается
в вашей первой версии, вы создаете новый enumerate(s)
для каждой итерации первый l oop, а во втором l oop вы его потребляете,
во второй версии it2
завершил свои элементы с первой итерации первой l oop
s = 'abc'
def my_enumerate(s, name):
print('a new enumerate: ', name)
for i in enumerate(s):
yield i
print(f'the enumerate {name} is exhausted ')
[(c1, c2) for j, c2 in my_enumerate(s, 'it1') for i, c1 in my_enumerate(s, 'it2')]
вывод:
a new enumerate: it1
a new enumerate: it2
the enumerate it2 is exhausted
a new enumerate: it2
the enumerate it2 is exhausted
a new enumerate: it2
the enumerate it2 is exhausted
the enumerate it1 is exhausted
[('a', 'a'),
('b', 'a'),
('c', 'a'),
('a', 'b'),
('b', 'b'),
('c', 'b'),
('a', 'c'),
('b', 'c'),
('c', 'c')]
и для:
it1, it2 = my_enumerate(s, 'it1'), my_enumerate(s, 'it2')
[(c1, c2) for j, c2 in it1 for i, c1 in it2]
вывод:
a new enumerate: it1
a new enumerate: it2
the enumerate it2 is exhausted
the enumerate it1 is exhausted
[('a', 'a'), ('b', 'a'), ('c', 'a')]