bd = "\033[1m";nb = "\033[0m" print(""" {0} ITERADORES {1} Tipos de datos que pueden ser recorridos secuencialmente mediante el uso del ciclo for Los objetos iterables dében responder los mensajes "__iter__" y "__next__" {0}__iter__ :{1}retorna un objeto iterador {0}__next__ :{1} retorna el próximo elemento de la secuencia ej: {0}lista{1} = [1, 2, 3, 4, 5] for {0}elemento{1} in {0}lista{1}: print({0}elemento{1}) """.format(bd, nb)) lista = [1, 2, 3, 4, 5] for elemento in lista: print('\t ',elemento, end=' ') print(''' For llama a la función iter() de la lista (objeto iterable) y recibe un elemento definido por "__next__" Cuando no hay mas elementos __next__ levanta una excepción del tipo Stoplteration que notifica al ciclo for que debe finalizar Conociendo el uso interno del ciclo for podemos crear iteradores propios __next__ debe contiene la lógica de como acceder al siguiente elemento de la secuencia. {0}__iter__ y __next__{1} y todos aquellos metodos que comienzan y terminan con doble guión bajo, su proposito es ser invocado por Python internamente, en este ejemplo por el ciclo for En este ej. haremos un iterador que recorra elementos de una lista en sentido inverso_ {0} class Reversa: {1}\"\"\"Iterador inverso.\"\"\"{0} def __init__(self, datos): self.datos = datos self. indice = len(datos) def __iter__(self): return self def __next__(self): if self.indice == 0: raise StopIteration() self.indice -= 1 return self.datos[self.indice] for elemento in Reversa([1 , 2, 3, 4]): print(elemento, end=' ') {1} '''.format(bd, nb)) class Reversa: def __init__(self, datos): self.datos = datos self.indice = len(datos) def __iter__(self): return self def __next__(self): if self.indice == 0: raise StopIteration() self.indice -= 1 return self.datos[self.indice] for elemento in Reversa([1 , 2, 3, 4]): print('\t ', elemento, end=' ') print(''' En consola lista = [1, 2, 3] it = iter(lista) it next(it) 1 next(it) 2 next(it) 3 next(it) Traceback (most recent call last): File "/usr/lib/python3.8/code.py", line 90, in runcode exec(code, self.locals) File "", line 1, in StopIteration ''') print(''' {0}class Iterator:{1} """Iterador, retorna elementos de posiciones pares de una lista """ {0} def __init__(self, data): self.data = data self.indice = 0 def __iter__(self): return self def __next__(self): if self.indice >= len(self.data): raise StopIteration() elem = self.data[self.indice] self.indice += 2 return elem {1} it = Iterator([1, 2, 3, 4, 5, 6]) for e in it: print(e) '''.format(bd, nb)) class Iterator: """Iterador, retorna elementos de posiciones pares de una lista """ def __init__(self, data): self.data = data self.indice = 0 def __iter__(self): return self def __next__(self): if self.indice >= len(self.data): raise StopIteration() elem = self.data[self.indice] self.indice += 2 return elem it = Iterator([1, 2, 3, 4, 5, 6]) for e in it: print('\t', e)