155 lines
3.9 KiB
Python
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)
|
||
|
|