Generadores
- Jaime Franco Jimenez

- 15 abr 2024
- 4 Min. de lectura
Un generador tiene un funcionamiento distinto a una funcion tradicional, un generador devuelve un iterable, y, ¿qué es un iterable?, un iterable es un objeto donde se puede recorrer cada elemento.
Un generador en vez de usar una sentencia return, usan una sentencia yield, e, implementan una funcion Next.
La sintaxis es muy parecida a una función tradicional, la diferencia es que en vez de usar return, usamos yield.
Por ejemplo, si creamos una secuencia de números del 1 al 10, en memoria se generan dichos números, lo que ocupa una memoria, memoria que ocupa usemos todos los números o no, pero, cuando usamos un generador, solo ocupa memoria, el valor que usemos, por lo que si tenemos muchos datos, se cargaran todos en memoria, y, puede ser que no tengamos memoria suficiente, con la palabra yield, recuperamos el valor que necesitamos, y, se interrumpe la ejecución de la funcion hasta que volvamos a llamarla.
Lo mismo pasaría con números infinitos.
Veamos un ejemplo, creamos una funcion, sin parámetros.
Creamos una variable, y, le damos el valor 0.
Usamos el bucle while y preguntamos si la variable n es menor a 6, ponemos dos puntos.
Ponemos:
Es decir, nos devuelve el valor de la variable “n”, siempre que dicha variable sea inferior a 6.
Sumamos 1 a la variable “n”.
Mientras la variable “n” sea inferior a 6, ejecutara de nuevo todas las líneas de código.
Usamos FOR ponemos una variable, ponemos in, y, el nombre de la funcion, y, dos puntos, para recorrer cada valor.
En la siguiente línea, ponemos que imprima la variable cifra.
Ejecutamos pulsando F5, y, nos devuelve los números desde el numero 0 al número 5, porque ya el numero 6 no cumple la condición.
Vamos a modificar el código, añadimos un parámetro a la funcion.
En el bucle while, quitamos el número 6, y, ponemos la variable “a”.
En el bucle for, dentro de los paréntesis de la funcion, ponemos 10.
Es decir, la variable cifra va desde el numero 1 al número 10, e, imprimirá los números, siempre que dichos números sea menor a la variable “n”, que entra valiendo 0, y, va subiendo su valor en 1, entonces, llegara un momento en que la variable “n” va a valer 10, quiere decir, que no cumple la condición, por lo que se interrumpe la ejecución del programa, y, dicho valor, el número 10, no es devuelto.
Pulsamos F5, y, nos devuelve desde el numero 0 al número 9.
Ahora, debajo de n +=1, creo una variable y almaceno el nombre de la funcion junto con el valor del parámetro.
Vamos a hacer uso de Next, ponemos print, abrimos paréntesis, ponemos Next, abrimos paréntesis, ponemos la variable creada, cerramos paréntesis.
Con la funcion Next, vamos a acceder al primer elemento, y, en este momento, se para la ejecución del programa hasta que se vuelva a llamar.
Pulsamos F5, y, nos devuelve el primer valor que es 1.
Repetimos la línea.
Al ejecutar, nos devuelve el primer valor que es la primera llamada, y, queda interrumpido la ejecución, en la siguiente línea, se continua la ejecución del programa, rescatando el segundo valor, y, se vuelve a interrumpir la ejecución del programa.
Por supuesto, lo podemos realizar con una funcion tradicional, pero, primero generara los primeros diez números, es decir, la lista completa, una vez creada la lista, podemos operar con dichos números, por ejemplo, obtener los cuatro primeros números, pero, primero ha tenido que generar todos los números, mientras que con un generador, cuando obtengamos los cuatro primeros números, no se generaran el resto de números, porque no los hemos llamado todavía.
Si quiero que yield, devuelva más de un valor, por ejemplo, hemos puesto yield n, pues, pongo una coma, y, pongo n*2.
Obtenemos una tupla con el primer valor, y, el primer valor multiplicado por 2, y, otra tupla, con el segundo valor, y, segundo valor multiplicado por 2.
Yield from
Permite encadenar generadores, es como un array de dos dimensiones, donde la segunda dimensión está dentro de la primera dimensión, y, para acceder a la segunda dimensión, debemos de hacerlo con un bucle anidado, es decir, vamos a acceder a un elemento que está dentro de otro elemento.
Veamos un ejemplo, creamos una funcion como sigue:
¿Qué quiere decir el asterisco antes de futbol?
Pues, que el parámetro futbol puede estar formada por los elementos que deseemos.
En la siguiente línea, usamos for, declaramos una variable, ponemos in, ponemos el parámetro futbol, y, dos puntos.
En la siguiente línea, ponemos:
Creamos una variable, ponemos el signo igual, ponemos la funcion equipos, entre paréntesis, ponemos varios equipos de futbol.
En la siguiente línea, ponemos print, abrimos paréntesis, ponemos next, abrimos paréntesis, ponemos la variable creada, cerramos paréntesis, vamos a acceder al primer elemento de la funcion equipos.
Pulsamos F5, y, obtenemos el primer equipo.
¿Qué quiere decir acceder a un subelemento del elemento?
Pues, cada palabra está formada por subelementos, que son letras, sustituimos yield por yield from.
Al pulsar F5, nos devuelve la letra “B” que es la primera letra del equipo Betis.
Voy a repetir el print.
Al pulsar F5, devuelve las letras “B” y “e”, que son las dos primeras letras del equipo Betis.
Miguel Angel Franco



























Comentarios