Personalmente, considero que esta es una solución más elegante. Lambda devuelve una función, por lo que si queremos usar la función, entonces deberíamos usarla. Es confuso usar el mismo símbolo para la variable 'anónimo' en la lambda y para el generador, por lo que en mi ejemplo uso un símbolo diferente para hacerlo más claro.
>>> [ (lambda a:a)(i) for i in range(3)]
[0, 1, 2]
>>>
es más rápido también.
>>> timeit.timeit('[(lambda a:a)(i) for i in range(10000)]',number=10000)
9.231263160705566
>>> timeit.timeit('[lambda a=i:a for i in range(10000)]',number=10000)
11.117988109588623
>>>
pero no tan rápido como mapa:
>>> timeit.timeit('map(lambda a:a, range(10000))',number=10000)
5.746963977813721
(me encontré con estas pruebas más de una vez, resultado fue el mismo, esto se hizo en Python 2.7, los resultados son diferentes en Python 3: la dos listas de comprensión son mucho más cercanas en rendimiento y ambas mucho más lentas, el mapa permanece mucho más rápido.)
... pero esto funciona con iteradores. >>> l = (lambda: m para m en [1,2,3 ]) >>> [x() para x en l] – GeneralBecos
Esto se debe a que un generador no crea todos sus valores a la vez, los crea cuando se solicitan. Una lista de comprensión y una expresión de generador no son lo mismo, aunque a menudo se pueden usar indistintamente. Hay situaciones (como esta) donde el comportamiento es _significativamente_ diferente. –
por qué 'x()' no solo 'x' ?? ¿¿como es diferente?? – amyassin