<div dir="ltr">Ciao a tutti.<div><br></div><div>So che i generatori non hanno una lunghezza, infatti si possono usare per modellare sequenze infinite. Volevo scrivere una funzione generica che calcoli la media di una serie di valori, a prescindere dal fatto che questi vengano da un generatore o siano iterabili.</div>
<div><br></div><div>Mi e' venuta cosi', spulciando qua e la'.</div><div><br></div><div><div>>>> def avg(gen):</div><div>... x = itertools.izip(*((i, 1) for i in gen))</div><div>... return float(sum(x.next())) / sum(x.next())</div>
<div>... </div><div>>>> avg(range(10))</div><div>4.5</div><div>>>> avg(range(15))</div><div>7.0</div><div>>>> avg([1, 4, 7,8])</div><div>5.0</div><div><div>>>> avg((1, 3, 4))</div><div>
2.6666666666666665</div></div><div><br></div><div>Si puo' fare di meglio?</div><div><br></div><div>All'inizio pensavo di fare un'unica generator expression che si porti dietro il conto dell'iterazione => qualcosa che consenta di esprimere il fatto che la media di una serie di valori Xn puo' essere definita ricorsivamente come segue (a meno di considerazioni sulla propagazione degli errori che per il momento non mi interessano):</div>
<div>-) Avg(1) = X1</div><div>-) Avg(n) = (1 - 1/n) * Avg(n-1) + Xn/n</div><div><br></div><div>Ma alla fin fine mi sembra che il metodo di cui sopra sia sufficiente e piu' semplice. Magari invece ci sono mille altri modi piu' pythonici e migliori...</div>
<div><br></div><div>Feedback?</div><div><br></div><div><div>Ciao,</div><div>Giuliano</div><div><br></div></div><div><br></div>-- <br>Piergiuliano Bossi<br>Blog: <a href="http://thinkingbox.wordpress.com/" target="_blank">http://thinkingbox.wordpress.com/</a><br>
Twitter: <a href="http://twitter.com/thinkingbox" target="_blank">http://twitter.com/thinkingbox</a> (English)<br>Twitter: <a href="http://twitter.com/scatolapensante" target="_blank">http://twitter.com/scatolapensante</a> (Italiano)<br>
<div>Google+: <a href="https://plus.google.com/u/0/108187981162465525118" target="_blank">https://plus.google.com/u/0/108187981162465525118</a></div>
</div></div>