[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