
Combien d'éléments se cachent dans une liste, et comment le savoir sans les pointer un par un du bout de l'index sur l'écran ? La question paraît minuscule. Elle a pourtant occupé un bon moment de ma vie de débutante en Python, le soir où j'ai voulu vérifier qu'aucun article ne manquait à la liste de courses que je prépare pour les Halles Saint-Joseph. Quand on apprend en autodidacte, on passe facilement à côté de l'outil le plus simple, et la fonction len fait partie de ces réflexes de programmation qu'on ne voit pas tant que personne ne nous les montre.
La réponse tient en trois lettres : len(). On lui donne une collection entre parenthèses, et elle renvoie le nombre d'éléments qu'elle contient, sous la forme d'un entier qu'on peut afficher, ranger dans une variable ou comparer à autre chose. Rien à installer ni à importer, puisque c'est une fonction intégrée à Python.
Comment écrire len() sans se tromper ?
Le schéma ne change jamais : len(), et à l'intérieur, ce qu'on veut mesurer. Voici ce que j'ai tapé pour ma liste de courses :
courses = ["pain", "fromage", "poires"]
print(len(courses))
Trois articles, donc 3 à l'écran. Si j'ajoute un produit à la liste, le résultat monte tout seul, sans que je retouche au comptage.
Avant de connaître len, j'avais monté un compteur à la main : un panier vide, une boucle for qui parcourt la liste, et un de plus à chaque objet croisé. Ça fonctionne, à condition de ne pas se tromper d'indentation, ce qui m'arrivait souvent. Compter avec une boucle, c'est égrener les mailles d'un tricot une à une alors qu'une règle graduée donne la longueur d'un coup.
La boucle garde tout son intérêt quand il faut agir sur chaque élément (elle a sa propre entrée dans ce carnet), mais pour connaître seulement la quantité, len() est plus court et bien plus sûr.
Pour garder la trace de ces essais de compteur, je note maintenant un commentaire au-dessus de chaque test ; j'ai détaillé pourquoi commenter son code python est utile pour ne pas tout oublier dans une autre entrée.

Listes, mots, espaces : ce que len() compte vraiment
Sur une liste, len() renvoie le nombre d'éléments, et sur une liste vide elle répond 0, sans erreur ni protestation. Sur une chaîne de caractères, elle renvoie le nombre de caractères : len('Python') donne 6.
Les espaces comptent aussi, ce qui m'a surprise. len('Pain chocolat') donne 13, parce que l'espace du milieu est un caractère comme les autres. Cette précision m'a servi quand j'ai voulu créer un menu interactif en python avec une boucle while sans bloquer : une saisie composée d'un seul espace a une longueur de 1, donc len() ne la juge pas vide alors qu'elle en a l'air à l'écran.
Le même outil s'applique à d'autres collections. Sur un dictionnaire, len() compte les paires clé-valeur ; sur un tuple, les éléments, comme pour une liste. Je n'ai pas assez pratiqué les dictionnaires pour en dire davantage, et je préfère l'écrire franchement que faire semblant.
Le point où j'ai bloqué : len n'est pas une méthode
Un ami développeur m'avait pourtant donné la solution, mais il allait trop vite : quelques secondes de frappe, des mots que je ne connaissais pas, et je suis repartie avec une syntaxe que je n'aurais pas su réécrire seule. J'ai laissé tomber cette aide-là et repris l'exercice à mon rythme.
Résultat de cette reprise en solo : j'ai écrit ma_liste.len(), en me disant que je demandais simplement à la liste sa longueur. Python a répondu par une AttributeError, qui dit en substance que l'objet liste n'a pas d'attribut len. (Ces messages ont leur propre tableau de traduction dans une autre entrée de ce blog, je n'y reviens pas ici.)
Il faut penser à len() comme à un mètre-ruban : un outil extérieur qu'on applique sur l'objet, pas une propriété qui sort de l'objet. On pose la liste dans les parenthèses, comme sur une balance de cuisine, et la fonction lit le résultat.
Deuxième piège : len(42). Un nombre seul n'est pas une collection d'éléments, donc Python répond par une TypeError, avec la mention que l'objet de type int n'a pas de len. Si ce message apparaît, la première chose que je vérifie est ce que contient réellement ma variable : c'est souvent un nombre là où j'attendais une liste ou un texte.

Vérifier qu'une liste est vide sans la compter
Écrire len(ma_liste) == 0 était mon réflexe. Ça fonctionne et ça se lit bien. Les habitués préfèrent pourtant utiliser la liste directement dans la condition : Python considère une liste vide comme « fausse » (False), donc une seule formule suffit.
if not courses:
print("Rien à acheter")
Pour bien saisir cette nuance, il vaut mieux d'abord comprendre les opérateurs logiques and or en python pour ses conditions, parce que tout repose sur cette idée de vrai et de faux. C'est encore un peu abstrait pour moi, et je ne prétends pas l'avoir totalement digéré.
Un collègue m'a tendu un jour sa formule Excel qui ne faisait pas ce qu'il voulait ; en lui expliquant la logique à voix haute (« si c'est vide, on saute, sinon on compte »), je me suis surprise à parler exactement comme on lit une condition Python.
Choisir entre len() et un simple if
Ma règle du moment tient en deux cas. Si j'ai besoin du nombre lui-même (l'afficher, le comparer à un seuil, savoir jusqu'où aller), j'utilise len(). Si je veux seulement savoir s'il y a quelque chose ou rien, j'écris if not ma_liste:.
Attention : if not traite aussi une chaîne vide comme « fausse », et le nombre 0 aussi. Il ne me dit donc pas ce qu'est ma variable, seulement qu'elle a l'air vide. Avec len(), j'obtiens un chiffre franc, à condition que l'objet soit bien une collection.
Cassandre, mon amie d'enfance, a reçu mon SMS de victoire et répondu par une rangée d'emojis enthousiastes, sans la moindre idée de ce qu'est une liste Python. Moi, il me reste une question sans réponse : pourquoi certaines fonctions se placent-elles avant l'objet, comme len(), alors que d'autres se collent derrière, avec un point ?