Kap. 11, otázky k zamyšlení: chybí mi tam samozřejmě nultá otázka (Proč tu není itertools.product? Co za magii se tu děje, že zipování cyklů vypadá líp?), ale určitě nebudou chodit soudělné délky...
>>> from funcy import take, cycle
>>> letters = "abcdef" # 2*3
>>> numbers = range(10) # 2*5
>>> n = len(letters) * len(numbers)
>>> uniq = set(take(n, zip(cycle(letters), cycle(numbers))))
>>> assert len(uniq) == n, f"Expected {n} items, got {len(uniq)} items."
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError: Expected 60 items, got 30 items.
... což je dost silné tvrzení, takže "nesoudělné délky všech iterátorů pod cykly" by mohla být dostačující podmínka. Ale prvočísla z příkladu od karet budou chodit určitě. Samy otázky čtenáře navádí, že dělat kartézský součin z cyklů není úplně šťastné :)
přesně tak, ono to chodí díky tomu, že každá barva má 13 karet, což zrovna tady je pěkné číslo.
A ne, to řešení není pěkné, právě proto je dobré se zamyslet, jestli se používá správná věc na správném místě.
O itertools bude samostatný článek (asi měl vyjít před funcy, to by bylo didakticky správnější).