Pregunta

¿Tiene un mapa () iterar a través de la lista como "para" haría? ¿Hay un valor en el mapa para vs?

Si es así, ahora mismo mi código es el siguiente:

for item in items:
    item.my_func()

Si tiene sentido, me gustaría hacerlo mapa (). ¿Es eso posible? ¿Cuál es un ejemplo como?

¿Fue útil?

Solución

Se puede usar map en lugar del bucle que for' he mostrado, pero ya no se presenta a utilizar el resultado de item.my_func(), esto es no se recomienda . map debe utilizarse si se desea aplicar una función sin efectos secundarios a todos los elementos de una lista. En todas las demás situaciones, utilice un bucle for explícita.

Además, a partir de Python 3.0 map devuelve un generador, así que en ese caso map no se comportan 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 de una aclaración sobre por qué el primer argumento del map debe no ser una función con efectos secundarios. Voy a dar respuesta a esta cuestión un tiro:

map está destinado a ser superado una función f en el sentido matemático . Bajo tales circunstancias, no importa en qué orden f se aplica a los elementos del segundo argumento (como siempre que sean regresó en su orden original, por supuesto). Más importante aún, en esas circunstancias map(g, map(f, l)) es semánticamente equivalente a map(lambda x: g(f(x)), l), sin importar el orden en que f y g se aplican a sus respectivas entradas .

por ejemplo., No importa si los rendimientos map y iterador o una lista completa de una sola vez. Sin embargo, si los efectos secundarios f y / o causar g, a continuación, esta equivalencia está garantizada solo si la semántica de map(g, map(f, l)) son tales que en cualquier g etapa se aplica a la primera n elementos devueltos por map(f, l) antes aplica map(f, l) f al elemento (n + 1) 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 aplicación Python 3 de map, la equivalencia semántica puede romper fácilmente hacia abajo si la salida del map(f, l) es, por ejemplo pasado a través de itertools.tee antes de ser suministrado a la llamada map exterior.

La discusión anterior puede parecer de carácter teórico, pero a medida que los programas se hacen más complejos, se vuelven más difíciles de razonar acerca y por lo tanto más difícil de depurar. Asegurar que algunas cosas son invariantes alivia este problema un poco, y puede de hecho impedir toda una clase de errores.

Por último, recuerda map muchas personas de su homólogo verdaderamente funcional en varios idiomas (puramente) funcionales. Pasándolo a una "función" con efectos secundarios va a confundir a las personas. Por lo tanto, ya que la alternativa (es decir, usando un bucle explícito) es no más difícil de implementar que una llamada a map, es muy recomendable que se restringe el uso de map a aquellos casos en los que la función que se aplica no causa efectos secundarios .

Otros consejos

Puede escribir esto en el mapa como esto:

map(cls.my_func, items)

sustitución de CLS con la clase de los elementos que está interactuando sobre.

Según lo mencionado por Stephan202, esto es no se recomienda en este caso.

Como regla general, si desea crear una nueva lista mediante la aplicación de una función a cada elemento de la lista, utilice el mapa. Esto ha implicado el sentido de que la función no tiene ningún efecto secundario, y por lo tanto se podría (potencialmente) ejecutar el mapa en paralelo.

Si no desea crear una nueva lista, o si la función tiene efectos secundarios, utilizar un bucle. Este es el caso en su ejemplo.

Hay una ligera diferencia semántica, lo que probablemente se cierra dentro de las especificaciones lenguaje Python. El Mapa es explícitamente paralelizable, mientras que de sólo en situaciones especiales. El código puede romper desde de , pero sólo escapar con excepción de Mapa .

En mi opinión Mapa no se debe también garantizar el orden de aplicación de función, mientras que de necesidad. Que yo sepa ninguna aplicación Python es actualmente capaz de hacer esto de auto-paralelización.

Puede cambiar su map a algún marco roscada o multiprocesamiento o distribuido fresco de computación si es necesario. Disco es un ejemplo de resistente a los fallos marco basado distribuido, erlang-y-pitón. De haberla configurado en 2 cajas de 8 núcleos y ahora mi programa se ejecuta 16 veces más rápido, gracias a la agrupación Disco, sin embargo, tenía que volver a escribir mi programa de listas por comprensión y para los bucles de map / reduce.

Es la misma cosa para escribir un programa para el uso de bucles y las listas por comprensión y map / reduce, pero cuando lo necesite para funcionar en un clúster, se puede hacer casi de forma gratuita si se ha utilizado un mapa / reducir. Si no lo hizo, así, tendrá que volver a escribir.

Cuidado: por lo que yo sé, Python 2.x devuelve una lista en lugar de un iterador de mapa. He oído esto puede ser evitado mediante el uso de iter.imap() (nunca usado, aunque).

Utilice un explícito para bucle cuando no se necesita una lista de resultados de vuelta (por ejemplo. Funciones con efectos secundarios).

Utilice una lista por comprensión cuando usted no necesita una lista de resultados de vuelta (por ejemplo. Funciones que devuelven un valor basado directamente en la entrada).

Usar mapa () cuando se está tratando de convencer a los usuarios de Lisp que Python es digno de usar. ;)

La principal ventaja de map es cuando se desea obtener el resultado de algún cálculo sobre todos los elementos de una lista. Por ejemplo, este fragmento se duplica cada valor en una lista:

map(lambda x: x * 2, [1,2,3,4])  #=> [2, 4, 6, 8]

Es importante señalar que map devuelve una nueva lista con los resultados. No modifica la lista original en su lugar.

Para hacer lo mismo con for, se tendría que crear una lista vacía y añadir una línea adicional al cuerpo for añadir el resultado de cada cálculo a la nueva lista. La versión map es más concisa y funcional.

Mapa veces puede ser más rápido para las funciones incorporadas de codificar manualmente un bucle. Trate de temporización mapa (str, gama (1.000.000)) vs. una similar para bucle.

map(lambda item: item.my_func(), items)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top