[Python] media di un generatore
Marco Buttu
mbuttu a oa-cagliari.inaf.it
Ven 13 Dic 2013 10:57:32 CET
On 12/11/2013 02:26 PM, Giovanni Porcari wrote:
> def gen(n):
> i = 1
> while i < n:
> yield i
> i += 1
>
> class Enumerated(object):
>
> def __init__(self, gen):
> self.gen = gen
> self._counter=0
>
> def count(self):
> return self._counter
>
> def __iter__(self):
> for k in self.gen:
> self._counter += 1
> yield(k)
>
> def __getattr__(self,name):
> return self.gen.__getattribute__(name)
>
>
>
> if __name__=='__main__':
> x=Enumerated(gen(100000))
> print sum(x)/x.count()
Aggiungo che con questa implementazione, due iteratori che iterano sul
un Enumerated non sono indipendenti:
>>> e = Enumerated(gen(10))
>>> i1 = iter(e)
>>> i2 = iter(e)
>>> next(i1)
1
>>> next(i1)
2
>>> next(i2)
3
>>> next(i2)
4
Ne consegue che:
>>> e = Enumerated(gen(10))
>>> list(e)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(e)
[]
E questo, nel nostro caso, porta a brutte sorprese:
>>> e = Enumerated(gen(10))
>>> sum(e) / e.count()
5.0
>>> sum(e) / e.count()
0.0
Gli iteratori dovrebbero essere indipendenti. Ecco come si comportano
due iteratori diversi che iterano sul medesimo range:
>>> r = range(10)
>>> list(r)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(r)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> i1 = iter(r)
>>> i2 = iter(r)
>>> next(i1)
0
>>> next(i1)
1
>>> next(i1)
2
>>> next(i2)
0
Ciao, Marco
--
Marco Buttu
INAF-Osservatorio Astronomico di Cagliari
Via della Scienza n. 5, 09047 Selargius (CA)
Phone: 070 711 80 217
Email: mbuttu a oa-cagliari.inaf.it
Maggiori informazioni sulla lista
Python