Iterables en Python: Mesa del Buffet

En Python, cuando escribes for x in algo: hay mucho ocurriendo detrás de escena. Ese algo puede ser una lista, una cadena, un diccionario o incluso un flujo de archivo. Lo que permite que un objeto sea iterable es que implemente la interfaz de iteración: los iterables.
Metáfora de la mesa del buffet: imagina entrar en un restaurante tipo buffet. Buffet = iterable, el contenedor donde están los platos. Plato = iterador, tu ayudante personal que recuerda qué has cogido. Idea clave: la mesa del buffet nunca se agota, puedes coger otro plato y empezar de nuevo. Cada plato tiene su propia posición, así dos personas pueden servirse independientemente del mismo buffet.
Qué es un iterable en Python: formalmente un objeto es iterable si implementa __iter__ que devuelve un iterador, o si no, implementa __getitem__ con indexación basada en cero para que Python pueda simular la iteración llamando a obj[0], obj[1], ... hasta IndexError. La llamada iter(obj) actúa como el timbre universal: si obj.__iter__ existe, Python lo usa; si no, intenta el fallback de __getitem__.
Ejemplos en código conceptual: lst = [1,2,3] s = hola st = {x,y,z} d = {a:1,b:2} Bajo el capó: it = iter(lst) next(it) devuelve 1, luego 2, luego 3. Nota: los sets son iterables pero no indexables, así que st[0] causaría TypeError.
Memoria y objetos: una lista es un array contiguo de punteros a objetos. Un iterador como list_iterator es muy ligero: almacena una referencia a la lista original y un cursor entero pequeño con la posición siguiente. Los iteradores no copian los datos, solo mantienen una referencia y una posición, lo que implica una sobrecarga de memoria O(1). Por ejemplo range(10000000) es perezoso y no asigna diez millones de números. Iteradores y generadores permiten procesar datos uno por uno con coste de memoria casi nulo.
Iterables mediante __getitem__ como fallback: por ejemplo una clase SquareSeq con __getitem__ que devuelve index*index y lanza IndexError cuando index es negativo. Python seguirá llamando a sq[0], sq[1], ... hasta encontrarse con IndexError. Precaución: si nunca se lanza IndexError la iteración puede ser infinita.
Casos de uso reales: procesar archivos de logs o CSV gigantes iterando línea a línea sin cargar todo en memoria; llamadas a APIs paginadas donde cada next obtiene una página nueva; pipelines que combinan map, filter e itertools para flujos de datos eficientes; cálculos perezosos que sólo se realizan cuando se necesitan; rangos numéricos grandes con range y slicing para iteración eficiente.
Trampas y advertencias: los iteradores se agotan, una vez consumidos no se rellenan. Sets y diccionarios no garantizan orden estable salvo la garantía de orden por inserción en CPython que no debe usarse como dependencia fuerte. Iterables infinitos como itertools.count requieren condiciones de parada o slice para no bloquear el programa.
Cómo diseñar un iterable personalizado correctamente: evitar el patrón donde el propio contenedor actúa como iterador si quieres permitir múltiples pasadas. En lugar de eso, separar el contenedor y el iterador creando una clase Cities que en __iter__ devuelve una instancia de CityIterator que mantiene su propio cursor. Así puedes iterar sobre Cities() varias veces sin quedarte sin elementos en la segunda pasada.
Modelo mental ASCII simplificado: [Iterable mesa del buffet] __iter__ o __getitem__ -> [Iterator plato] referencia + cursor __next__ devuelve items uno a uno StopIteration detiene la iteración.
Checklist rápido: si necesitas múltiples pasadas usa iterable, no iterator; si buscas eficiencia de memoria usa generadores o APIs basadas en iteradores; para comprobar si algo es iterable prueba iter(obj) y captura TypeError; si necesitas una condición especial de parada considera iter(callable,sentinel).
Sobre Q2BSTUDIO: somos una empresa de desarrollo de software y aplicaciones a medida especializada en soluciones de software a medida, inteligencia artificial, ciberseguridad y servicios cloud. Diseñamos arquitecturas seguras y escalables para clientes que necesitan desde aplicaciones corporativas hasta agentes IA y soluciones de inteligencia de negocio. Si buscas partners para crear productos digitales robustos podemos ayudarte con el desarrollo de aplicaciones a medida y con estrategias de inteligencia artificial para empresas que incluyen agentes IA, modelos personalizados y consultoría de IA.
Palabras clave integradas para mejorar posicionamiento: aplicaciones a medida, software a medida, inteligencia artificial, ciberseguridad, servicios cloud aws y azure, servicios inteligencia de negocio, ia para empresas, agentes IA, power bi. Además ofrecemos servicios de ciberseguridad y pentesting, migraciones y gestión en servicios cloud aws y azure, y soluciones de Business Intelligence y Power BI para explotar tus datos.
Resumen: en la Parte 1 aprendimos qué es un iterable y por qué la metáfora del buffet ayuda a entender la diferencia entre iterable y iterador, cómo funciona iter con __iter__ y el fallback __getitem__, por qué los iteradores son ligeros y casos prácticos donde usarlos. En la siguiente entrega profundizaremos en los iteradores, el método __next__, StopIteration y cómo encajan los generadores en este ecosistema.
Comentarios