Du titre, oui, il y a une différence. Maintenant appliqué à mon scénario: considérons une classe Dummy
:
class Dummy:
def __init__(self):
self.attached = []
def attach_item(self, item):
self.attached.append(item)
Si j'utilise ceci:
D = Dummy()
items = [1, 2, 3, 4]
for item in items:
D.attach_item(item)
Je reçois bien D.attached = [1, 2, 3, 4]
. Mais si je mappe la fonction attach_item
au items
, D.attached
reste vide.
map(D.attach_item, items)
Qu'est-ce que ça fait?
Une question très intéressante qui a une réponse intéressante.
La fonction map
renvoie un objet Map itérable. map
effectue son calcul en douceur afin que la fonction ne soit pas appelée à moins que vous n'itériez cet objet.
Donc si vous le faites:
x = map(D.attach_item, items)
for i in x:
continue
Le résultat attendu apparaîtra.
map
crée uniquement un itérateur. Vous devriez le parcourir pour ajouter des éléments dans D.attached
. Comme ça:
D = Dummy()
items = [1, 2, 3, 4]
list(map(D.attach_item, items))
Oui, ne le faites pas dans votre code :) Mais l'exemple est simplement utile pour comprendre.
Citant le documentation
Renvoie un itérateur qui applique la fonction à chaque élément de iterable, générant les résultats.
ce qui signifie que vous devez collecter l'itérateur, par exemple.
list(map(D.attach_item, items))
> [None, None, None, None]
Hmmm, étrange. Pourquoi aucun, aucun, ...
Oui, vous pouvez convertir n’importe quelle boucle dans une déclaration de carte, mais ce n’est pas toujours utile. Map prend un paramètre et en fait quelque chose (dans la plupart des cas) et le renvoie, sans effets secondaires! Voici un exemple:
def add(a):
return a + 3
list(map(add, items))
> [4, 5, 6, 7]
Le vrai pouvoir vient lorsque vous le combinez avec d’autres fonctions comme filter
def add(a):
return a + 3
def odd(a):
return a % 2 == 1
list(map(add, filter(odd, items)))
> [4, 6]