Compter les caractères d’un texte, les éléments d’une liste ou les clés d’un dictionnaire fait partie des besoins les plus courants en Python. La fonction len() répond à cette question en une seule ligne, mais son résultat dépend du type d’objet utilisé. Je présente ici son fonctionnement, ses cas pratiques, ses limites et les erreurs à éviter.
L’essentiel à retenir sur len en Python
-
len()renvoie le nombre d’éléments contenus dans un objet. - Elle fonctionne avec les chaînes, listes, tuples, dictionnaires, ensembles et intervalles.
- Pour un dictionnaire, le résultat correspond au nombre de clés, pas au nombre total de valeurs imbriquées.
- Une chaîne compte des points de code Unicode, tandis qu’un objet
bytescompte des octets. - Un générateur ou un entier ne possède généralement pas de longueur mesurable avec cette fonction.
Comprendre len en Python sans se tromper
La syntaxe est volontairement simple : len(objet). Python examine l’objet transmis et renvoie un entier correspondant au nombre d’éléments qu’il contient. Dans la pratique, c’est l’outil que j’utilise dès que je dois vérifier une taille avant une boucle, contrôler une saisie ou afficher un bilan de données.
message = "Bonjour"
print(len(message)) # 7
Le résultat est un entier, ici 7, car la chaîne contient sept caractères. Les espaces et les signes de ponctuation sont également comptés. Une chaîne vide renvoie donc 0, ce qui permet de tester rapidement si une variable contient réellement du texte.
nom = ""
if len(nom) == 0:
print("Aucun nom n'a été saisi")
Pour tester simplement si une collection est vide, je préfère souvent écrire if not collection. C’est plus idiomatique et plus lisible, mais len() reste préférable lorsque le nombre exact d’éléments doit être affiché ou comparé à une limite.
Quels objets peut-on mesurer avec len
La fonction s’applique aux objets qui définissent une longueur. Cela concerne notamment les séquences et les collections intégrées de Python. Le résultat ne représente pas toujours la même chose, d’où l’intérêt de regarder le type de données avant d’interpréter le nombre obtenu.
Chaînes, listes et tuples
texte = "Python"
nombres = [10, 20, 30, 40]
coordonnees = (48.8566, 2.3522)
print(len(texte)) # 6
print(len(nombres)) # 4
print(len(coordonnees)) # 2
Dans une liste imbriquée, len() compte uniquement les éléments du premier niveau. C’est une source classique de confusion chez les débutants.
grille = [[1, 2, 3], [4, 5, 6]]
print(len(grille)) # 2
print(len(grille[0])) # 3
La grille contient deux lignes et chaque ligne contient trois valeurs. Pour connaître le nombre total de valeurs, il faut additionner les longueurs internes ou parcourir la structure, car len(grille) ne descend pas automatiquement dans les sous-listes.
Dictionnaires et ensembles
profil = {
"nom": "Camille",
"ville": "Lyon",
"actif": True
}
couleurs = {"bleu", "vert", "rouge"}
print(len(profil)) # 3
print(len(couleurs)) # 3
Pour un dictionnaire, la longueur correspond au nombre de paires clé-valeur. Les valeurs imbriquées ne sont pas additionnées. Dans un ensemble, chaque élément unique compte une fois, ce qui explique pourquoi les doublons disparaissent avant le calcul.
Lire aussi : Hash Python - Évitez les erreurs courantes et sécurisez vos données
Intervalles numériques
intervalle = range(2, 12, 2)
print(len(intervalle)) # 5
La fonction tient compte du début, de la fin et du pas de l’intervalle. Ici, les valeurs sont 2, 4, 6, 8 et 10. Pour un range très grand, Python calcule la longueur sans créer toutes les valeurs en mémoire, ce qui rend cette structure particulièrement efficace.
La différence entre caractères, octets et éléments
Le mot « longueur » peut désigner plusieurs choses. Avec une chaîne Python, len() compte les points de code Unicode. Avec un objet bytes, la fonction compte les octets. Cette distinction devient importante dès qu’un texte doit être envoyé sur un réseau ou enregistré dans un fichier avec un encodage précis.
texte = "café"
print(len(texte)) # 4
print(len(texte.encode("utf-8"))) # 5
Le caractère é compte comme un seul caractère dans la chaîne, mais il occupe deux octets en UTF-8. Pour une limite exprimée en caractères, utilisez la chaîne directement. Pour une limite exprimée en octets, mesurez plutôt le résultat de encode().
emoji = "👨👩👧👦"
print(len(emoji)) # plusieurs points de code
Un emoji composé peut être affiché comme un seul symbole tout en contenant plusieurs points de code. C’est pourquoi la valeur renvoyée ne correspond pas toujours au nombre de signes visibles à l’écran. Pour compter des graphèmes, c’est-à-dire des unités visuelles perçues par l’utilisateur, une bibliothèque spécialisée peut être nécessaire.
Les erreurs courantes avec len
La plupart des erreurs viennent d’une confusion entre un objet mesurable et une valeur qui ne possède pas de longueur. Un entier, un nombre décimal ou la valeur None ne sont pas des collections.
age = thirty = 30
# len(age) # TypeError
# len(thirty) # TypeError
# len(None) # TypeError
Le code ci-dessus contient volontairement une erreur de syntaxe sur la première ligne. Dans un programme réel, la bonne écriture serait simplement age = 30, mais len(age) resterait incorrect. Si vous voulez compter les chiffres d’un nombre, convertissez-le explicitement en texte.
code = 2026
print(len(str(code))) # 4
Un autre piège concerne les générateurs et les itérateurs. Ils produisent souvent leurs valeurs progressivement et ne connaissent pas nécessairement leur taille à l’avance.
nombres = (n for n in range(5))
# len(nombres) # TypeError
valeurs = list(nombres)
print(len(valeurs)) # 5
Convertir un générateur en liste permet de le mesurer, mais consomme ses valeurs et peut demander beaucoup de mémoire. Pour un flux important, je préfère compter les éléments pendant le traitement plutôt que de tout charger d’un coup.
Utiliser len dans un code vraiment utile
La fonction devient intéressante lorsqu’elle sert une décision concrète. Elle permet par exemple de valider un mot de passe, de limiter une saisie ou de parcourir une liste avec ses positions.
mot_de_passe = "secret123"
if len(mot_de_passe) < 8:
print("Mot de passe trop court")
else:
print("Longueur acceptable")
Cette vérification ne suffit pas à garantir un mot de passe solide, mais elle constitue une première règle simple. Dans une application, il faut aussi traiter les caractères autorisés, les tentatives répétées et le stockage sécurisé.
articles = ["clavier", "souris", "écran"]
for index in range(len(articles)):
print(index, articles[index])
Cette forme fonctionne, mais une boucle directe est souvent plus claire lorsque l’index n’est pas nécessaire. Si vous avez besoin du numéro et de la valeur, enumerate() est généralement le meilleur choix.
for index, article in enumerate(articles):
print(index, article)
Pour les performances, les collections intégrées comme les listes, dictionnaires et ensembles fournissent habituellement leur taille très rapidement. Cela ne signifie pas que toute implémentation personnalisée est forcément constante en temps. Une classe créée par un développeur peut calculer sa longueur au moment de l’appel, avec un coût plus élevé.
Créer un objet compatible avec len
Une classe personnalisée peut définir la méthode spéciale __len__(). Python l’utilisera automatiquement lorsque l’objet sera passé à len(). La méthode doit renvoyer un entier positif ou nul.
class Playlist:
def __init__(self, titres):
self.titres = titres
def __len__(self):
return len(self.titres)
playlist = Playlist(["Intro", "Couplet", "Final"])
print(len(playlist)) # 3
Cette approche rend la classe naturelle à utiliser et permet aussi des tests comme if playlist. Lorsque la longueur vaut zéro, l’objet est considéré comme faux dans un contexte booléen, sauf si la classe définit un comportement particulier avec __bool__().
Je recommande de déléguer le calcul à une collection interne déjà disponible plutôt que de recompter les données à chaque appel. Le code reste plus simple et la longueur conserve un comportement prévisible.
Les bons réflexes à garder en tête
- Utilisez
len(objet)pour mesurer une collection, pas une valeur numérique. - Vérifiez si vous comptez des caractères, des octets, des clés ou des éléments du premier niveau.
- Ne transformez pas automatiquement un gros générateur en liste sans évaluer le coût mémoire.
- Préférez
if not objetpour tester rapidement une collection vide. - Avec une classe personnalisée, faites renvoyer à
__len__()un entier cohérent et non négatif.
La fonction paraît minuscule, mais elle intervient dans la validation des données, les boucles, les interfaces et le traitement de fichiers. Une fois la différence entre taille, caractères et octets bien comprise, len() devient un réflexe fiable plutôt qu’une simple commande apprise par cœur.