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