¿Cómo funciona la comprensión de un generador?
¿Qué hace la comprensión del generador? ¿Como funciona? No pude encontrar un tutorial al respecto.
¿Entiendes las listas por comprensión? Si es así, una expresión generadora es como una lista de comprensión, pero en lugar de encontrar todos los elementos que le interesan y empaquetarlos en la lista, espera y genera cada elemento de la expresión, uno por uno.
>>> my_list = [1, 3, 5, 9, 2, 6]
>>> filtered_list = [item for item in my_list if item > 3]
>>> print(filtered_list)
[5, 9, 6]
>>> len(filtered_list)
3
>>> # compare to generator expression
...
>>> filtered_gen = (item for item in my_list if item > 3)
>>> print(filtered_gen) # notice it's a generator object
<generator object <genexpr> at 0x7f2ad75f89e0>
>>> len(filtered_gen) # So technically, it has no length
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'generator' has no len()
>>> # We extract each item out individually. We'll do it manually first.
...
>>> next(filtered_gen)
5
>>> next(filtered_gen)
9
>>> next(filtered_gen)
6
>>> next(filtered_gen) # Should be all out of items and give an error
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> # Yup, the generator is spent. No values for you!
...
>>> # Let's prove it gives the same results as our list comprehension
...
>>> filtered_gen = (item for item in my_list if item > 3)
>>> gen_to_list = list(filtered_gen)
>>> print(gen_to_list)
[5, 9, 6]
>>> filtered_list == gen_to_list
True
>>>
Debido a que una expresión generadora solo tiene que generar un elemento a la vez, puede generar grandes ahorros en el uso de memoria. Las expresiones generadoras tienen más sentido en escenarios en los que es necesario tomar un elemento a la vez, hacer muchos cálculos basados en ese elemento y luego pasar al siguiente. Si necesita más de un valor, también puede usar una expresión generadora y tomar algunos a la vez. Si necesita todos los valores antes de que su programa continúe, utilice una lista de comprensión.
Una comprensión generadora es la versión perezosa de una lista de comprensión.
Es como una lista por comprensión excepto que devuelve un iterador en lugar de la lista, es decir, un objeto con un método next() que producirá el siguiente elemento.
Si no está familiarizado con las listas por comprensión, consulte aquí y para los generadores, consulte aquí .