MAB225 – Computação II – Aula 05/05/2011

MAB 225 - Computação II - Fabio Mascarenhas

Laço x Iterador e Implementação de for (05/05/2011)

import math

def impares(n):
    return 2 * (n - 1) + 1

def pi(n):
    return 1.0 / (n * n)

def somaserie(serie, n):
    soma = 0
    pos = 1
    while not pos > n:
        soma = soma + serie(pos)
        pos = pos + 1
        print soma
    return soma

class IterSerie:
    def __init__(self, serie, n):
        self.serie = serie
        self.n = n
        self.pos = 1
        self.soma =0
    def __iter__(self):
        return IterSerie(self.serie, self.n)
    def next(self):
        if self.pos > self.n:
            raise StopIteration
        else:
            self.soma = self.soma + (self.serie)(self.pos)
            self.pos = self.pos + 1
            return self.soma

print "Laco:"
            
somaserie(impares, 5)
print math.sqrt(somaserie(pi, 1000) * 6)

print "For usando iterador:"

for i in IterSerie(impares, 5):
    print i

def meufor(var, obj, corpo):
    # Dicionario de variaveis
    locais = locals()
    # Prepara corpo do for para execucao
    corpo = compile(corpo, "corpo.py", "exec")
    # Pede iterador
    iter = obj.__iter__()
    try:
        while True:
            # Pega o proximo valor do iterador e guarda em var
            locais[var] = iter.next()
            # Executa o corpo
            eval(corpo, globals(), locais)
    except StopIteration:
        # Segue adiante
        pass

print "Meu for:"

meufor("i", IterSerie(impares, 5), "print i")