Diferencia entre un bucle ‘for’ y un mapa

Desde el título, sí hay una diferencia. Ahora aplicado a mi escenario: consideremos una clase Dummy :

 class Dummy: def __init__(self): self.attached = [] def attach_item(self, item): self.attached.append(item) 

Si uso esto:

 D = Dummy() items = [1, 2, 3, 4] for item in items: D.attach_item(item) 

De hecho, tengo D.attached = [1, 2, 3, 4] . Pero si attach_item la función attach_item a los items , D.attached permanece vacío.

 map(D.attach_item, items) 

¿Qué está haciendo?

Related of "Diferencia entre un bucle ‘for’ y un mapa"

Una pregunta muy interesante que tiene una respuesta interesante.

La función de map devuelve un objeto de Mapa que es iterable. map está realizando su cálculo de manera perezosa, por lo que la función no se llamaría a menos que itere ese objeto.

Así que si lo haces:

 x = map(D.attach_item, items) for i in x: continue 

El resultado esperado se mostrará.

map solo crea un iterador. Debe iterar a través de él para agregar elementos a D.attached . Me gusta esto:

 D = Dummy() items = [1, 2, 3, 4] list(map(D.attach_item, items)) 

Sí, no lo hagas en tu código 🙂 Pero el ejemplo es útil para entender.

Citando la documentación

Devuelva un iterador que aplique la función a cada elemento de iterable, dando los resultados.

lo que significa que tienes que recoger el iterador, por ejemplo,

 list(map(D.attach_item, items)) > [None, None, None, None] 

Hmmm, extraño. Por qué ninguno, ninguno, …

Sí, puede convertir cualquier bucle en una statement de mapa, pero no siempre es útil. El mapa toma un parámetro y hace algo con él (en la mayoría de los casos) y lo devuelve, ¡sin efectos secundarios! Aquí hay un ejemplo:

 def add(a): return a + 3 list(map(add, items)) > [4, 5, 6, 7] 

El verdadero poder viene cuando lo combinas con otras funciones como filter

 def add(a): return a + 3 def odd(a): return a % 2 == 1 list(map(add, filter(odd, items))) > [4, 6]