method comprehension python

python - comprehension - Lista de mapas por función parcial vs lambda



python filter (3)

En el ejemplo dado, lambda parece más apropiado. También es más fácil en los ojos.

Nunca he visto el uso de funciones parciales en la naturaleza.

Me preguntaba si para la mayoría de los ejemplos es más "pythonic" usar lambda o la función partial ?

Por ejemplo, podría querer aplicar imap en alguna lista, como agregar 3 a cada elemento usando:

imap(lambda x : x + 3, my_list)

O utilizar partial :

imap(partial(operator.add, 3), my_list)

En este ejemplo, me doy cuenta de que un bucle probablemente podría lograrlo más fácilmente, pero estoy pensando en más ejemplos no triviales.

En Haskell, elegiría fácilmente la aplicación parcial en el ejemplo anterior, pero no estoy seguro de Python. Para mí, la lambda parece la mejor opción, pero no sé cuál es la opción predominante para la mayoría de los programadores de Python.


Lambda es sin duda muchas veces más común. A menos que esté haciendo una programación funcional en un entorno académico, probablemente debería alejarse de las herramientas.

Esto es pitónico. No se necesita una biblioteca, ni siquiera incorporada, solo una simple expresión generadora.

( x + 3 for x in my_list )

Esto crea un generador, similar a imap. Si va a hacer una lista de todos modos, use una lista de comprensión en su lugar:

[ x + 3 for x in my_list ]


Para ser verdaderamente equivalente a imap , usa una expresión generadora:

(x + 3 for x in mylist)

Como imap , esto no construye inmediatamente una lista nueva completa, sino que calcula los elementos de la secuencia resultante a pedido (y por lo tanto es mucho más eficiente que una lista de comprensión si está encadenando el resultado en otra iteración).

Si tienes curiosidad acerca de dónde partial sería una mejor opción que lambda en el mundo real, tiende a ser cuando estás tratando con números variables de argumentos:

>>> from functools import partial >>> def a(*args): ... return sum(args) ... >>> b = partial(a, 2, 3) >>> b(6, 7, 8) 26

La versión equivalente usando lambda sería ...

>>> b = lambda *args: a(2, 3, *args) >>> b(6, 7, 8) 26

que es un poco menos conciso, pero lambda le da la opción de una aplicación fuera de orden, que partial no:

>>> def a(x, y, z): ... return x + y - z ... >>> b = lambda m, n: a(m, 1, n) >>> b(2, 5) -2