Historique de la question
La fonction map() existe en Python depuis les premières versions comme un reflet de la programmation fonctionnelle. Elle est utilisée pour appliquer une fonction à chaque élément d'un objet itérable.
Problème
Tous les développeurs débutants ne comprennent pas la différence entre map, les générateurs et les expressions de liste. Des questions sur les performances, la lisibilité, et la compatibilité avec le traitement paresseux des données se posent.
Solution
La fonction map() prend une fonction et un ou plusieurs objets itérables, renvoyant un itérateur paresseux dans lequel la fonction est appliquée successivement à chaque élément. Cela est efficace en mémoire et permet de traiter de grands volumes de données sans créer de listes intermédiaires.
Exemple de code :
# Retourne les carrés des nombres via map numbers = [1, 2, 3, 4] squares = map(lambda x: x**2, numbers) print(list(squares)) # [1, 4, 9, 16]
Caractéristiques clés :
La fonction map() peut-elle travailler avec deux séquences ou plus en même temps ? Comment le faire ?
Oui, vous pouvez passer plusieurs séquences si la fonction prend autant d'arguments. L'itération se termine dès que l'objet itérable le plus court est épuisé.
Exemple de code :
a = [1, 2, 3] b = [4, 5, 6] res = list(map(lambda x, y: x + y, a, b)) print(res) # [5, 7, 9]
Que renvoie map(), si vous passez une fonction qui retourne None ?
Chaque élément de map sera None. Si la fonction ne retourne pas de valeur explicitement, le résultat sera toujours une liste de None :
def print_val(x): print(x) # pas de return list(map(print_val, [1,2,3])) # [None, None, None] et trois sorties dans la console
Quelle est la différence entre map() et une expression de liste en termes de mémoire utilisée ?
map ne crée pas tout le résultat en mémoire immédiatement, mais calcule à la demande ; une expression de liste [...] crée une liste complète. Pour de grands volumes de données, l'utilisation de map est préférable si vous n'avez pas besoin de tout le résultat immédiatement.
Dans un projet, nous avons utilisé map pour parcourir une liste avec une fonction écrivant dans un fichier, en oubliant de faire un retour de valeur. Nous attendions des données, mais map a retourné un itérateur avec None.
Avantages :
Inconvénients :
Nous avons utilisé map pour traiter et filtrer une grande liste de journaux, en écrivant une fonction pure retournant un résultat. L'itérateur map a progressivement donné des valeurs à écrire dans un fichier sans saturer la mémoire.
Avantages :
Inconvénients :