2013/12/10 Piergiuliano Bossi <pgbo...@gmail.com>: >>>> def avg(gen): > ... x = itertools.izip(*((i, 1) for i in gen)) > ... return float(sum(x.next())) / sum(x.next()) > ...
Capisco l'attrattiva del problema, ma questo non fa assolutamente quello che vuoi, a causa dell'unpacking degli argomenti di izip per dimostrarlo (python3): >>> print(*((i,1) for i in [1,2,3])) (1, 1) (2, 1) (3, 1) come vedi, non ti stampa dei generator (non avrebbe senso)... ha già tutti i valori belli che allocati in memoria per averne conferma, prova ad eseguire sum(next(zip(*((i,1) for i in range(10000000))))) ma tieni pronto il ^C :P sum(range(10000000)) sum di per se invece è in grado di lavorare tranquillamente sui generatori senza fare allocazioni superflue qualcosa di interessante per te magari può essere calcolare tutte le medie intermedie (media mobile?) from itertools import accumulate, islice >>> def avgs(gen): for count, partial_sum in enumerate(accumulate(gen), 1): yield partial_sum / count >>> next(islice(avgs(range(10000000)), 9999999, None)) 4999999.5 >>> list(avgs([5,2,8])) [5.0, 3.5, 5.0] -- xmpp: berda...@gmail.com bitmessage: BM-2cTYXfGiSTsnx3righ6aHcJSWe4MV17jDP gpg fingerprint: 3F8D53518012716C4EEF7DF67B498306B3BF75A0 (used just for signing commits) _______________________________________________ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python