La compréhension de liste est apparue dans les premières versions de Python. Ce sucre syntaxique a été emprunté à des langages fonctionnels. Il rend le code plus compact et parfois même un peu plus rapide qu'une boucle for classique.
De nombreux développeurs inexpérimentés utilisent des compréhensions de liste sans comprendre leurs particularités, ce qui entraîne une détérioration de la lisibilité ou l'apparition d'effets inattendus dans le code. De plus, il est difficile pour les nouveaux développeurs de distinguer l'utilisation des compréhensions de liste et des fonctions map/filter/lambda.
La compréhension de liste est un moyen de créer rapidement une nouvelle liste en appliquant une expression à chaque élément de la séquence d'origine :
nums = [1, 2, 3, 4] squares = [x*x for x in nums if x % 2 == 0] # [4, 16]
Caractéristiques clés :
La compréhension de liste renvoie-t-elle un générateur ?
Non, elle renvoie bien une liste. Un générateur est créé à l'aide de parenthèses :
# Ceci est un générateur : (x*x for x in range(10)) # Ceci est une liste : [x*x for x in range(10)]
Peut-on assigner des valeurs à des variables à l'intérieur d'une compréhension de liste ?
Dans la syntaxe standard, non. Ce n'est possible qu'avec l'expression "walrus" (:=) à partir de Python 3.8+ :
[x for x in (y := range(5))] # Erreur ! [x for x in [(y := i*i) for i in range(5)]] # y n'est visible que dans cette liste
Peut-on modifier des variables externes à l'intérieur d'une compréhension de liste ?
Une variable déclarée à l'intérieur d'une compréhension de liste est locale et ne sera pas visible de l'extérieur. Cela confond souvent les débutants lors de constructions imbriquées.
** Cas négatif Un développeur utilise des compréhensions de liste imbriquées pour une transformation complexe des données en une seule ligne. Avantages : Code compact, effet "je sais Python !" Inconvénients : Difficile à lire, les nouveaux collègues souffrent, le débogage devient douloureux. ** Cas positif Un développeur utilise des compréhensions de liste simples pour filtrer et transformer de courtes listes, et pour des opérations complexes, il écrit des fonctions et des boucles explicites. Avantages : Le code est facile à lire, à maintenir et à étendre. Inconvénients : Dans certains cas, le code est légèrement plus long et utilise des variables supplémentaires.