Apuntes_Python/01_curso/Modulo_1/1-4e_iteradores.py
2022-12-24 22:41:20 -03:00

155 lines
3.9 KiB
Python

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
<list_iterator object at 0x7fce335ce610>
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 "<input>", line 1, in <module>
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)