ProgrammationDéveloppeur Backend Python

Expliquez les caractéristiques clés de l'utilisation de la fonction map() en Python. Comment est-elle utilisée, quelles sont les limites de cette approche, et en quoi map diffère-t-il des générateurs et des expressions de liste ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

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 :

  • Retourne un itérateur paresseux, ne construit pas immédiatement une liste ;
  • Accepte plusieurs objets itérables pour une fonction avec plusieurs arguments ;
  • Généralement préférable aux expressions de liste, lorsque le traitement est en flux ou pour la compatibilité avec de grandes données.

Questions pièges.

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.

Erreurs typiques et anti-modèles

  • Utiliser map là où un effet de bord est requis (par exemple, juste afficher sans retourner de valeurs).
  • Oublier que map en Python 3 est un itérateur paresseux : si vous ne convertissez pas en liste, il n'y aura pas d'itération.
  • Passer des séquences de longueurs incompatibles : le résultat sera basé sur la plus courte.

Exemple de la vie

Cas négatif

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 :

  • Concision du code.

Inconvénients :

  • Pas de résultat si la fonction ne retourne pas de valeurs.
  • Les effets de bord ne garantissent pas l'ordre d'exécution.

Cas positif

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 :

  • Efficacité en mémoire.
  • Simplicité du traitement en flux.

Inconvénients :

  • Il faut se rappeler que le résultat est un itérateur, qui ne peut être utilisé qu'une seule fois.