można tylko jeździć pociągiem generator raz, po tym jak osiągnie swój cel, nie więcej przejażdżki. W twoim przypadku generator cd
jest wyczerpany, a następnie nie można go ponownie powtórzyć.
list
obiekty, z drugiej strony, należy utworzyć oddzielny obiekt iteracyjnej każdym razem zadzwonić iter
na nich (której pętla for
niejawnie robi dla Ciebie):
print(iter([1, 2, 3]))
# <list_iterator at 0x7f18495d4c88>
i produkować nową iterację ty mogą korzystać. Zdarza się to w dowolnym czasie, gdy wywoływana jest na nimiter
; ponieważ za każdym razem tworzony jest nowy obiekt, możesz wielokrotnie przeglądać listy. Wiele przejażdżek!
W skrócie, jeśli tylko zmiana cd
być listę (w ogóle, obiekt, który będzie powtórzyć przez wiele razy):
ab = (a + b for a in A for b in B)
cd = [c + d for c in C for d in D] # list-comp instead
to przyniesie upragnionego rezultatu tworząc świeżą iterator obiekty z cd
dla każdego elementu w ab
:
abcd = (e_ab + e_cd for e_ab in ab for e_cd in cd)
print(len(list(abcd)))
# 16
oczywiście można to osiągnąć za pomocą product
od itertools
też, ale to nie ma sensu, dlaczego tak się dzieje.
Można to również zapisać jako 'map (suma, itertools.product (A, B, C, D))'. – deltab