Primeira vez aqui? Seja bem vindo e cheque o FAQ!
x

Você pode dar um exemplo do uso de iteradores em Python?

0 votos
156 visitas
perguntada Mar 24, 2016 em Programação Computacional por danielcajueiro (5,251 pontos)  
Compartilhe

2 Respostas

0 votos
respondida Mar 24, 2016 por danielcajueiro (5,251 pontos)  

Primeiro você deve notar que vários objetos em Python são iteráveis. Veja por exemplo o caso de uma string abaixo:

for letter in 'python':
    print letter

Um outro exemplo interessante é criar um contador que é iterável. Em Python 2, usamos um método mágico chamado __iter__ que requer a definição de método next():

class Counter:
    def __init__(self, high):
        self.current=0
        self.high = high

    def __iter__(self): # It makes Counter self iterable (it needs next below)
        return self

    def next(self):
        if self.current > self.high:
            raise StopIteration
        else:
            self.current += 1
            return self.current - 1

if __name__ == '__main__':

    x=Counter(5)
    print "First print"
    print x.next()

    # This second print does not work if I remove __iter__
    print "Second print"
    for i in x:
        print i

Um outro exemplo legal é criar uma sequência de Fibonacci que é iterável:

class FibonacciIterator:
    def __init__(self,n):
        self.current=1
        self.high=n
        self.f1=0
        self.f2=1

    def __iter__(self): # It makes Counter self iterable (it needs next below)
        return self

    def next(self):
        if self.current > self.high:
            raise StopIteration
        else:
            if(self.current==1):
                self.current+=1
                return self.f1
            elif(self.current==2):
                self.current+=1
                return self.f2
            else:
                self.current+=1
                self.f1,self.f2=self.f2,self.f1+self.f2
                return self.f2


if __name__ == '__main__':

    f=FibonacciIterator(15)
    for i in f:
        print i
0 votos
respondida Mar 18 por danielcajueiro (5,251 pontos)  

Em Python 3, os códigos da resposta ficam assim:

Class Counter:

class Counter:
    def __init__(self, high):
        self.current=0
        self.high = high

    def __iter__(self): # It makes Counter self iterable (it needs next below)
        return self

    def __next__(self):
        if self.current > self.high:
            raise StopIteration
        else:
            self.current += 1
            return self.current - 1

    def next(self):
        return self.__next__()            


if __name__ == '__main__':

    x=Counter(5)
    print ("First print")
    print (x.next())

    # This second print does not work if I remove __iter__
    print ("Second print")
    for i in x:
        print (i)

    #print (x.next())

Class Fibonacci:

class FibonacciIterator:
    def __init__(self,n):
        self.current=1
        self.high=n
        self.f1=0
        self.f2=1

    def __iter__(self): # It makes Counter self iterable (it needs next below)
        return self

    def __next__(self):
        if self.current > self.high:
            raise StopIteration
        else:
            if(self.current==1):
                self.current+=1
                return self.f1
            elif(self.current==2):
                self.current+=1
                return self.f2
            else:
                self.current+=1
                self.f1,self.f2=self.f2,self.f1+self.f2
                return self.f2


if __name__ == '__main__':

    f=FibonacciIterator(15)
    for i in f:
        print( i)

A diferença no Python 3 é a existência do Método Mágico

next()

...