import math # IterSomador soma os termos de uma serie # Voce passa pra ele a funcao caracteristica da serie # e quantos termos voce quer somar # ele te da a serie com 1 termo, com 2, com 3 class IterSomador: def __init__(self, serie, fim): self.serie = serie self.fim = fim self.pos = 1 self.total = 0 def __iter__(self): return IterSomador(self.serie, self.fim) def next(self): if self.pos > self.fim: raise StopIteration else: self.total = self.total + (self.serie)(self.pos) self.pos = self.pos + 1 return self.total def impares(n): return 2 * (n - 1) + 1 for i in IterSomador(impares, 5): print i def pi(n): return 1.0 / (n * n) for i in IterSomador(pi, 1000): print math.sqrt(i * 6)
# Agenda Telefonica # Nome -> Telefones # Telefone: tipo do telefone e no. # Iterador na agenda para retornar todos # os numeros gravados como uma tripla # (nome, local, numero) class IterAgenda: def __init__(self, agenda): self.triplas = [] for nome in agenda.dic.keys(): for local in agenda.dic[nome].keys(): for numero in agenda.dic[nome][local]: self.triplas.append( (nome, local, numero) ) self.pos = 0 def next(self): if self.pos >= len(self.triplas): raise StopIteration else: tripla = self.triplas[self.pos] self.pos = self.pos + 1 return tripla def le_agenda(nomearq): arq = open(nomearq, "r") agenda = arq.read() arq.close() return eval(agenda) class Agenda: def __init__(self, nomearq, dic = {}): self.dic = dic self.faz_indice() self.nomearq = nomearq self.salva() def __iter__(self): return IterAgenda(self) def adiciona(self, pessoa, local, numero): self.nums[numero] = (pessoa, local) if pessoa in self.dic: # pessoa ja existe if local in self.dic[pessoa]: (self.dic[pessoa])[local].append(numero) else: (self.dic[pessoa])[local] = [numero] else: self.dic[pessoa] = {} (self.dic[pessoa])[local] = [numero] self.salva() def __getitem__(self, pessoa): try: return self.dic[pessoa] except KeyError: raise KeyError(pessoa + ' nao existe') def __setitem__(self, pessoa, entrada): self.adiciona(pessoa, entrada[0], entrada[1]) def __repr__(self): return "Agenda(%s,%s)" % (repr(self.nomearq),repr(self.dic)) def __delitem__(self, pessoa): self.faz_indice() del self.dic[pessoa] def apaga_local(self, pessoa, local): self.faz_indice() del self.dic[pessoa][local] def faz_indice(self): self.nums = {} for nome in self.dic.keys(): for local in self.dic[nome].keys(): for numero in self.dic[nome][local]: self.nums[numero] = (nome, local) def busca_numero(self, numero): if numero in self.nums: return self.nums[numero] else: return None def salva(self): arq = open(self.nomearq, "w+") arq.write(repr(self)) arq.close()