Itertools.product avalia seus argumentos preguiçosamente?
O seguinte nunca imprime nada no Python 3.6
from itertools import product, count
for f in product(count(), [1,2]):
print(f)
Em vez disso, apenas fica lá e queima a CPU. A questão parece ser queproduct
nunca retorna um iterador se estiver em um espaço infinito, porque avalia a totalidadeproduct
primeiro. Isso é surpreendente, dado que oproduct
deveria ser um gerador.
Eu esperava que isso começasse a contar (até o infinito), algo como o comportamento desse geradordiretamente dos documentos):
for tup in ((x,y) for x in count() for y in [1,2]):
print(tup)
Mas enquanto meu gerador começa a contar imediatamente, aquele usandoproduct
nunca conta.
Outras ferramentas emitertools
faça o que eu esperaria. Por exemplo, o seguinte:
for f in takewhile(lambda x: True, count()):
print(f)
imprimirá um fluxo de números porquetakewhile
é preguiçoso.