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 com Iterador (02/05/2011)
# 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()