Usted podría utilizar map
en lugar del bucle for
que has demostrado, pero ya no se presenta a utilizar el resultado de item.my_func()
, esto se recomienda no . map
se debe utilizar si desea aplicar una función sin efectos secundarios a todos los elementos de una lista. En todas las demás situaciones, use un for-loop explícito.
Además, a partir de Python 3.0 map
devuelve un generador, así que en ese caso map
no se comportará de la misma (a menos que se evalúa de forma explícita todos los elementos devueltos por el generador, por ejemplo llamando list
en él).
Editar: kibibu pregunta en los comentarios para una aclaración sobre por qué map
's primer argumento no debe ser una función con efectos secundarios. Voy a dar respuesta a esa pregunta un disparo:
map
se supone que se aprobó una función f
in the mathematical sense. En tales circunstancias, no importa en qué orden se aplica f
a los elementos del segundo argumento (siempre que sean devueltos en su orden original, por supuesto). Más importante aún, bajo esas circunstancias, map(g, map(f, l))
es semánticamente equivalente a map(lambda x: g(f(x)), l)
, , independientemente del orden en que f
y g
se aplican a sus entradas respectivas.
P. ej., No importa si map
regresa y el iterador o una lista completa a la vez. Sin embargo, si f
y/o g
causan efectos secundarios, a continuación, esta equivalencia está garantizada solo si la semántica de map(g, map(f, l))
son tales que en cualquier etapa g
se aplica a los primeros n elementos devueltos por map(f, l)
antes map(f, l)
aplica f
a la (n + 1) elemento st de l
. (Lo que significa que map
debe realizar la iteración más perezoso posible --- la que lo hace en Python 3, pero no en Python 2!)
Yendo un paso más allá: incluso si asumimos la implementación de Python 3 de map
, la equivalencia semántica puede romperse fácilmente si la salida de map(f, l)
es, por ejemplo, pasó a través de itertools.tee
antes de ser suministrado a la llamada externa map
.
La discusión anterior puede parecer de naturaleza teórica, pero a medida que los programas se vuelven más complejos, se vuelven más difíciles de razonar y, por lo tanto, más difíciles de depurar. Asegurarse de que algunas cosas son invariables alivia un poco ese problema, y de hecho puede prevenir toda una clase de errores.
Por último, map
recuerda a muchas personas su contraparte verdaderamente funcional en varios idiomas (puramente) funcionales. Pasarle una "función" con efectos secundarios confundirá a esas personas. Por lo tanto, teniendo en cuenta que la alternativa (es decir, utilizar un bucle explícito) no es más difícil de implementar que una llamada al map
, se recomienda encarecidamente que se restrinja el uso de map
a aquellos casos en los que la función que se va a aplicar no cause efectos secundarios .
¡Gracias a todos! – roder
¿Por qué no se recomienda? ¿Es una cuestión de semántica o algún tipo de proceso distribuido (donde los efectos secundarios rompen el paralelismo)? – kibibu
@kibibu: Empecé a responder a su pregunta, pero terminé con demasiado texto para contener este campo de comentarios. Así que actualicé la respuesta :) ¡Cómo ayuda esto! (En cuanto a su comentario sobre el procesamiento distribuido del iterable: aunque * podría * ser citado como un argumento adicional cuando se habla de 'map' en otros idiomas, no creo que Python (actualmente) realice optimizaciones de ese tipo). – Stephan202