Les conteneurs en Python : La classe range

1 – Introduction

Dans cet article de blog, on va découvrir la classe « range » et son utilisation en général. C’est une classe très utile surtout pour faire des boucles « for » avec un nombre d’itérations connu à l’avance, parcours de listes, de chaines de caractères, … etc.

2 – Utilisation

2.1 – Syntaxe

La classe range est utilisée quand on veut avoir un objet qui contient une suite de nombres entiers. Il existe trois syntaxes différentes pour créer un objet de type « range » :

>>> a1 = range(b)             # un seul paramètre
>>> a2 = range(a, b) # deux paramètres
>>> a3 = range(a, b, c) # trois paramètres
  • La syntaxe avec un seul paramètre crée un objet « a1 » de type « range » qui contient les éléments de « 0 » à « b-1 ». Si « b » est un nombre entier strictement positif, « a1 » contient exactement « b » éléments. Dans le cas contraire, « a1 » ne contient aucun élément. De manière générale :
range(b) --------> 0, 1, 2, ..., b-1
  • La deuxième syntaxe représente un forme un peu plus générique de la construction d’un objet « range ». En effet, avec cette syntaxe, on a la possibilité de préciser le début « a » de la suite de nombres. Dans ce cas, l’objet « a2 » contient les élément de « a » à « b-1 ». Si « b » est supérieur strictement à « a », l’objet « a2 » contient exactement « b-a » éléments, sinon (si « a » est supérieur ou égal à « b ») l’objet « a2 » ne contient aucun élément. De manière générale :
range(a, b) --------> a, a+1, a+2, ..., b-1
  • La troisième syntaxe est la forme la plus générique.  Dans ce cas là, trois paramètres sont à fournir qui correspondent respectivement au début de la suite de nombre, la borne supérieure, et le « pas ». Le « pas » est égal à la différence entre deux nombre successifs de cette suite de nombres. De manière générale :
range(a, b, c) --------> a, a+c, a+2*c, a+3*c, ..., a+k*c
tel que : a+k*c < b <= a+(k+1)*c

La figure suivante illustre le lien qui existe entre les trois syntaxes :

Figure 1: Equivalences entre les différentes syntaxes

2.2 – Cas d’utilisation

2.2.1 – Exemples

Généralement, on utilise « range » pour fixer le nombre d’itérations d’une boucle « for » (voir article sur les structures de contrôle).

for i in range(100):
print("Hello world!")

Le code précédent affiche cent (100) fois la phrase « Hello world! ».

2.3.2 – Méthodes d’un objet range

  • La méthode « index » :
    La méthode index prend un seul paramètre et retourne l’indice de ce paramètre dans l’objet. Si la valeur du paramètre n’appartient pas à l’objet « range », la méthode lève une exception de type « ValueError ».
>>> r = range(10)
>>> r.index(9)
9
>>> r.index(10)
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
r.index(10)
ValueError: 10 is not in range
  • La méthode « count » :
    La méthode « count », quant à elle, permet de compter le nombre d’apparitions d’une valeur dans l’ibjet range.
>>> r = range(1, 10, 2)
>>> r.count(1)
1
>>> r.count(10)
0

2.3.3 – Attributs d’un objet range

La classe « range » définit trois attributs : « start », « stop », « step ». Ils correspondent respectivement à la valeur de début, la borne sup, et le pas. Les trois attributs sont en lecture seule; C’est-à-dire, qu’une fois l’objet range est créé, on ne peut plus modifier les valeurs de ces attributs.

>>> r = range(1, 100, 3)
>>> r.start
1
>>> r.stop
100
>>> r.step
3
>>> r.start = 6
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
r.start = 6
AttributeError: readonly attribute

Voici comment sont intialisés les trois attributs selon la syntaxe utilisée lors de la création de l’objet (Voir section 2.1) :

startstopstep
range(b)0b1
range(a, b)ab1
range(a, b, c)abc

2.3.4 – Quelques astuces

  • Vérifier qu’une valeur appartient à un objet range :

Pour vérifier qu’une valeur « v » appartient à une objet de type range « r », on peut utiliser l’opérateur « in » :

>>> r = range(0,100, 2)
>>> v = 50
>>> v in r
True
>>> 100 in r
False

Bien sûr, on peut également utiliser le méthode « count » qui retourne « 1 » si la valeur appartient bien à l’objet range, « 0 » sinon.

  • Construire une liste à partir des éléments range :

Comme on vu précécemment, un objet range ne stocke pas toutes les valeurs mais consèrve seulement les informations sur le début, fin, et le pas concernant la suite de nombres. Pour avoir la liste complète des nombres à partir des éléments d’un objet range :

>>> r = range(2, 10, 2)  
>>> l1 = list(r) # première syntaxe
>>> l2 = [*r] # deuxième syntaxe
>>> l1
[2, 4, 6, 8]
>>> l2
[2, 4, 6, 8]
  • Itérer sur un objet range :

Comme un objet de type « range » est un itérable, on peut créer un itérateur sur cet objet comme suit :

>>> r = range(0,10,1)
>>> it = iter(r)
>>> next(it)
0
>>> next(it)
1
>>> next(it)
2

3 – Conclusion

Dans cet article, nous avons présenté la classe python « range » de manière générale, les différente manières de créer des objets « range », et comment les utiliser.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *