Implementar iteradores puede resultar un poco complejo, por lo que en python existen un azucar sintactica para los iteradores que son los generadores
Los generadores son funciones:
def my_gen():
*** Un ejemplo de generadores ***
print("hello world")
n=0
yield n
print("hello heaven")
n=1
yield n
print("hello hell")
n=2
yield n
a=my_gen()
print(next(a)) #>> hello world
print(next(a)) #>> hello heaven
print(next(a)) #>> hello hell
print(next(a)) StopIteration
yield: es un keyword, es igual a return pero envez de finalizar a la funcion sino que va a pausar la funcion en el estado en el que se encuentra hasta que vuelva a ser llamada la funcion
Generator expressions
si se necesita tener una gran cantidad de datos, se necesita usar generator expresion, para ir sacando uno por uno los elementos envez de extraer todo el elemento como con las list comprehensions
my_list=[1,2,3,4,5,6]
my_second_list=[x**2 for x in my_list] #list comprehensions
my_second_gen=(x**2 for x in my_list) #generator expresion