La fonction range est souvent utilisée dans les boucles for. En effet, elle permet de générer des séquences de n éléments, sans les stocker en mémoire (contrairement à une liste), ce qui la rend très efficace.
Syntaxe de range
La fonction range s'utilise avec un, deux ou trois arguments : range(start, stop, step). Nous allons voir plusieurs exemples pour illustrer l'utilisation de l'ensemble des paramètres.
range(stop)
Avec un seul argument, range génère une séquence de nombres partant de 0 jusqu'à stop exclu :
for i in range(5): print(i) # Résultat : # 0 # 1 # 2 # 3 # 4
range(start, stop)
Si deux arguments sont passés, la séquence commence à start pour terminer juste avant stop, car nous l'avons vu avant, stop est exclu :
for i in range(2, 6): print(i) # Résultat : # 2 # 3 # 4 # 5
range(start, stop, step)
Le troisième argument définit le pas entre start et stop (exclu) :
for i in range(10, 31, 5): print(i) # Résultat : # 10 # 15 # 20 # 25 # 30
Il est également possible d'utiliser un pas négatif pour créer une séquence décroissante :
# Compte à rebours de 5 à 1 for i in range(5, 0, -1): print(i) # Résultat attendu : # 5 # 4 # 3 # 2 # 1
Utiliser range avec une liste
Nous allons voir dans cette partie que range peut être utilisé pour itérer sur les indices d'une liste ou pour créer une liste de nombres.
Itérer par indice pour modifier une liste
Voici un exemple simple, imaginez vouloir modifier les éléments d'une liste en la parcourant. range(len()) permet l'accès par indice et la réassignation d'une nouvelle valeur :
nombres = [10, 20, 30, 40, 50] for i in range(len(nombres)): nombres[i] = nombres[i] * 2 print(nombres) # Résultat: [20, 40, 60, 80, 100]
À noter
Pour une simple lecture des indices et des éléments, on utilisera le plus souvent la fonction enumerate. Pour une nouvelle liste modifiée, la compréhension de liste est plus pythonique.
Créer une liste de nombres
Le constructeur list combiné avec range permet de créer une liste de manière lisible et concise :
nombres = list(range(1, 11)) print(f"nombres: {nombres}") # Résultat: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] grosse_liste = list(range(1000)) print(f"grosse_liste: {grosse_liste}") # Résultat: [0, 1, 2, ..., 999] liste_avec_pas = list(range(0, 30, 5)) print(f"liste_avec_pas: {liste_avec_pas}") # Résultat: [0, 5, 10, 15, 20, 25]
range et la mémoire
Les chiffres de la séquence ne sont générés qu'au moment où on en a besoin (au moment de l'itération). Il faut aussi savoir que range est de type immuable.
Attention
Bien que range soit efficace en mémoire, si vous faites list(range(1_000_000_000)), votre programme essaiera de stocker un milliard de nombres en mémoire, car ici l'objet range est converti en liste.