iteradores-e-iterables-en-python

Iteradores e Iterables en Python

Un Iterable en Python es cualquier objeto que dispone de un Iterador, y por tanto puede ser recorrido secuencialmente.

Entre los iterables predefinidos se incluyen listas, tuplas, cadenas de texto, conjuntos.

# Ejemplos de iterables
lista = [1, 2, 3, 4, 5]
cadena = "Python"
tupla = (1, 2, 3)
conjunto = {1, 2, 3}

Aunque nosotros podemos crear nuestros propios iterables (como veremos más abajo).

Uso de iterables

Un iterable es cualquier objeto que puede ser recorrido en un bucle for. Por ejemplo, se muestra cómo utilizar un iterable directamente en un bucle for.

# Ejemplo de uso de un iterable en un bucle for
lista = [1, 2, 3, 4, 5]

for elemento in lista:
    print(elemento)

# Salida: 1, 2, 3, 4, 5

Internamente, cuando usamos for para recorrer un objeto Iterable, estamos usando su iterador para obtener los distintos elementos.

¿Qué es un Iterador?

Un Iterador es un elemento que apunta a un elemento, generalmente perteneciente a una colección

Técnicamente un iterador es simplemente un objeto que implementa los métodos __iter__() y __next__().

  • El método __iter__() devuelve el propio objeto iterador
  • El método __next__() devuelve el siguiente elemento en la secuencia

Cuando no hay más elementos que devolver, __next__() lanza una excepción StopIteration.

Creación de un Iterador

Vamos a ver cómo podemos crear un iterador personalizado en Python.

# Ejemplo de creación de un iterador personalizado
class Contador:
    def __init__(self, inicio, fin):
        self.inicio = inicio
        self.fin = fin

    def __iter__(self):
        self.numero = self.inicio
        return self

    def __next__(self):
        if self.numero <= self.fin:
            resultado = self.numero
            self.numero += 1
            return resultado
        else:
            raise StopIteration

# Uso del iterador personalizado
contador = Contador(1, 5)
iterador = iter(contador)

for numero in iterador:
    print(numero)

# Salida: 1, 2, 3, 4, 5

Ejemplos prácticos

Creando un Iterador desde un Iterable

Aquí se muestra cómo crear un iterador a partir de un iterable utilizando la función iter(). Luego, se utilizan llamadas a next() para obtener los elementos del iterador uno a uno.

lista = [1, 2, 3, 4, 5]

# Crear un iterador a partir de un iterable
iterador = iter(lista)

print(next(iterador))  # Salida: 1
print(next(iterador))  # Salida: 2
print(next(iterador))  # Salida: 3
print(next(iterador))  # Salida: 4
print(next(iterador))  # Salida: 5
print(next(iterador))  # Stop iteration

En forma simplificada, esto es lo que hace internamente el un bucle for.

Usando Iteradores en Funciones y Métodos

Este ejemplo muestra cómo utilizar iteradores dentro de una función. En este caso, imprime cada elemento de un iterable.

# Usar iteradores en funciones y métodos
def recorrer(iterable):
    iterator = iter(iterable)
    while True:
        try:
            elemento = next(iterator)
            print(elemento)
        except StopIteration:
            break

# Ejemplo de uso
cadena = "Python"
recorrer(cadena)

# Salida: P, y, t, h, o, n
  • La función recorrer toma un iterable
  • Usa un bucle while junto con next() para imprimir cada elemento
  • Para cuando encuentre una excepción StopIteration