web-dev-qa-db-fra.com

Différence entre une boucle 'pour' et une carte

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?

42
Mathieu

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.

53
Farbod Shahinfar

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.

16
Lev Zakharov

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]
9
hellow