Menu
Français

Python range() : start, stop, step et compter à rebours

Comment fonctionne range() en Python — start, stop, step, ranges négatifs, et pourquoi il est paresseux plutôt que de matérialiser une liste.

Un outil pour produire des nombres

range() fait exactement une chose : il produit une séquence d'entiers. C'est le partenaire de choix des boucles for quand tu as besoin d'itérer un nombre spécifique de fois ou de parcourir un intervalle numérique.

La forme la plus simple prend un seul argument — la valeur stop :

main.py
Output
Click Run to see the output here.

Sortie :

0
1
2
3
4

Deux détails qui attrapent les débutants :

  1. Le comptage commence à 0. range(5) te donne cinq nombres, en partant de 0.
  2. La valeur stop est exclusive. range(5) s'arrête avant 5 — il n'inclut pas 5 lui-même.

Ces règles sont cohérentes à travers les opérations de découpage, d'indexation et de range en Python. Une fois que tu as intériorisé « stop est exclusif », ça arrête de te faire trébucher.

Trois formes

range() accepte un, deux ou trois arguments :

main.py
Output
Click Run to see the output here.

Le pas (step) est la taille de chaque saut. range(0, 20, 4) produit tous les quatre nombres. Garde ça en tête la prochaine fois que tu as besoin de « un élément sur deux » ou « un échantillon sur dix ».

Compter à rebours

Le pas peut être négatif, ce qui te permet de compter à l'envers :

main.py
Output
Click Run to see the output here.

Encore une fois, le stop est exclusif — range(10, 0, -1) s'arrête avant 0, pas à 0. Pour inclure 0, mets le stop à -1 :

main.py
Output
Click Run to see the output here.

range est paresseux

En Python 3, range() ne construit pas une liste de nombres en mémoire. Il renvoie un objet range léger qui produit les nombres un par un, à la demande. C'est pour ça que tu peux écrire :

main.py
Output
Click Run to see the output here.

Un « range » d'un milliard de nombres prend essentiellement zéro mémoire. Les nombres sont générés à mesure que la boucle les demande.

Si tu as vraiment besoin d'une liste des nombres — parce que tu veux la modifier, la trier ou l'indexer au-delà des bases — convertis explicitement :

main.py
Output
Click Run to see the output here.

La plupart du temps, tu n'as pas besoin de la liste. for i in range(...) fonctionne directement.

Motifs courants

Une poignée de recettes que tu utiliseras constamment :

Faire quelque chose n fois.

main.py
Output
Click Run to see the output here.

Le _ est une convention qui veut dire « je me fiche de cette valeur » — Python ne l'impose pas, mais n'importe quel lecteur reconnaîtra l'intention.

Indexer une séquence.

Préfère enumerate() à range(len(...)), mais quand tu as spécifiquement besoin juste de l'index :

main.py
Output
Click Run to see the output here.

Quand même, la plupart du temps enumerate(items) est plus propre.

Itérer un élément sur deux.

main.py
Output
Click Run to see the output here.

Ça affiche a, c, e. Pour du simple découpage, cependant, la syntaxe de découpage est encore plus directe : items[::2].

Générer une liste numérique rapide.

main.py
Output
Click Run to see the output here.

C'est une compréhension de liste — couverte plus tard — mais range est ce qui fournit les nombres.

Ce que range() n'est pas

Deux arêtes vives à connaître :

  1. range ne produit que des entiers. Si tu as besoin de pas à virgule flottante (comme 0.0 à 1.0 par incréments de 0.1), utilise numpy.arange ou une boucle avec ton propre compteur.
  2. range ne fonctionne pas avec des itérables arbitraires. C'est spécifiquement pour les entiers. Si tu essaies de « ranger » sur une liste, tu cherches probablement enumerate ou juste la liste elle-même.

En mettre ensemble

Un petit exemple utilisant plusieurs variations d'un coup :

main.py
Output
Click Run to see the output here.

Deux boucles range imbriquées, produisant une grille. Remarque que les deux boucles commencent à 1 — range(1, 6) — parce qu'on veut des étiquettes de 1 à 5.

Vers les collections

Tu as maintenant vu les conditions, les deux types de boucles et range. C'est assez de contrôle de flux pour piloter n'importe quelle collection. Prochain chapitre : les collections elles-mêmes — listes, tuples, ensembles et dictionnaires.

Questions fréquentes

Que fait range() en Python ?

range() produit une séquence d'entiers. range(n) donne de 0 à n-1. range(start, stop) donne les entiers de start jusqu'à mais sans inclure stop. range(start, stop, step) te laisse choisir la taille du pas, y compris des pas négatifs pour compter à rebours.

range() crée-t-il une liste ?

Non. En Python 3, range() renvoie un objet range léger qui génère les nombres à la demande. C'est pourquoi range(10**9) est instantané — il n'alloue pas un milliard d'entiers. Enveloppe-le dans list(...) si tu as vraiment besoin d'une liste.

Comment compter à rebours avec range() en Python ?

Utilise un pas négatif : range(10, 0, -1) compte 10, 9, 8, ..., 1. Rappelle-toi que la valeur stop est toujours exclusive, donc pour inclure 0 il te faudrait range(10, -1, -1).

Apprendre à coder avec Coddy

COMMENCER