Esta es una expresión de generador. Para conseguir que funcione en el caso autónomo, utilice llaves:
y = (x for x in range(10))
e y se convierte en un generador. Puede iterar sobre generadores, por lo que funciona donde se espera una iterable, como la función sum
.
Ejemplos de uso y las trampas:
>>> y = (x for x in range(10))
>>> y
<generator object <genexpr> at 0x0000000001E15A20>
>>> sum(y)
45
que tenga cuidado al mantenimiento de generadores alrededor, sólo se puede pasar por ellos una vez. Así que después de la anterior, si intenta utilizar sum
de nuevo, esto sucederá:
>>> sum(y)
0
Así que si se pasa un generador, donde en realidad se espera una lista o un conjunto o algo similar, usted tiene que tener cuidado. Si la función o clase almacena el argumento e intenta iterar sobre él varias veces, se encontrará con problemas. Por ejemplo considere esto:
def foo(numbers):
s = sum(numbers)
p = reduce(lambda x,y: x*y, numbers, 1)
print "The sum is:", s, "and the product:", p
se producirá un error si la mano es un generador:
>>> foo(x for x in range(1, 10))
The sum is: 45 and the product: 1
Usted puede obtener una lista de los valores de un generador produce:
>>> y = (x for x in range(10))
>>> list(y)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Usted Puede usar esto para reparar el ejemplo anterior:
>>> foo(list(x for x in range(1, 10)))
The sum is: 45 and the product: 362880
Sin embargo, tenga en cuenta que si crea una lista a partir de un generador, deberá almacenar todos los valores. Esto podría usar mucha más memoria en situaciones donde tienes muchos artículos.
¿Por qué usar un generador en su situación?
El consumo de memoria mucho más baja es la razón por la cual es mejor que sum(generator expression)
sum(list)
: La versión generador solamente tiene que almacenar un único valor, mientras que la lista variante tiene que almacenar N valores. Por lo tanto, siempre debe usar un generador donde no se arriesgue a los efectos secundarios.
[Este enlace] (http://wiki.python.org/moin/Generators) podría ser útil también. – jadkik94
También hay comprensión de diccionarios y conjuntos, en caso de que no haya oído hablar de ellos. – Amr