
En Python, vous pouvez générer une série de nombres avec la fonction intégrée range().
Cet article décrit le contenu suivant.
- range() et le type de plage
- plage (arrêt): 0 <= x < arrêt
- plage (début, arrêt) : début <= x < arrêt
- range(start, stop, step): start <= x < stop (augmentation par pas)
- Plage inversée()
- range() avec flotteur
- range() et xrange() en Python2
Consultez l’article suivant pour plus de détails sur la boucle for en Python.
range() et le type de plage
En Python 3, range() crée un objet de type range.
Un objet de type range ne stocke pas de valeurs, mais les crée si nécessaire, donc ses valeurs ne sont pas affichées avec print(). Puisqu’il s’agit d’un objet itérable, la valeur peut être imprimée dans la boucle for.
print(range(3))
# range(0, 3)
print(type(range(3)))
# <class 'range'>
for i in range(3):
print(i)
# 0
# 1
# 2
Si vous voulez générer une liste, utilisez list().
print(list(range(3)))
# [0, 1, 2]
Dans l’exemple de code suivant, le résultat de range() est converti en une liste avec list(). Ceci est juste pour l’explication, donc list() n’est pas nécessaire avec la boucle for.
Notez que Python2 a range() et xrange(), et le comportement de range() est différent entre Python2 et Python3. Cela sera expliqué à la fin de cet article.
plage (arrêt): 0 <= x < arrêt
Si vous spécifiez un entier comme range(stop), une série de nombres 0 <= i
print(list(range(3)))
# [0, 1, 2]
print(list(range(10)))
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
La spécification d’une valeur négative la rend vide.
print(list(range(-3)))
# []
plage (début, arrêt) : début <= x < arrêt
Si vous spécifiez deux entiers comme range(start, stop), une série de nombres start <= i
Le résultat sera vide lorsque stop <= start.
print(list(range(3, 10)))
# [3, 4, 5, 6, 7, 8, 9]
print(list(range(10, 3)))
# []
print(list(range(-3, 3)))
# [-3, -2, -1, 0, 1, 2]
print(list(range(3, -3)))
# []
range(0, stop) est équivalent à range(stop).
print(range(0, 3) == range(3))
# True
range(start, stop, step): start <= x < stop (augmentation par pas)
Si vous spécifiez trois entiers comme range(start, stop, step), une série de nombres start <= i < stop croissant par pas est générée.
Si vous spécifiez une valeur négative pour le troisième pas d’argument, il diminuera. Dans ce cas, il sera vide sauf si start <= stop.
print(list(range(3, 10, 2)))
# [3, 5, 7, 9]
print(list(range(10, 3, 2)))
# []
print(list(range(10, 3, -2)))
# [10, 8, 6, 4]
print(list(range(3, 10, -2)))
# []
range(start, stop, 1) est équivalent à range(start, stop).
print(range(3, 10, 1) == range(3, 10))
# True
range(0, stop, 1) est équivalent à range(0, stop) et range(stop).
print(range(0, 10, 1) == range(0, 10) == range(10))
# True
Plage inversée()
Spécifier une valeur négative pour le troisième pas d’argument peut générer des nombres décroissants.
print(list(range(3, 10, 2)))
# [3, 5, 7, 9]
print(list(range(9, 2, -2)))
# [9, 7, 5, 3]
Il est également possible d’utiliser la fonction intégrée reversed() pour inverser le résultat de range().
print(list(reversed(range(3, 10, 2))))
# [9, 7, 5, 3]
De plus, dans ce cas, vous n’avez pas besoin de list() si vous l’utilisez dans l’instruction for.
for i in reversed(range(3, 10, 2)):
print(i)
# 9
# 7
# 5
# 3
range() avec flotteur
Comme dans les exemples précédents, vous ne pouvez spécifier que l’entier int comme argument de range().
Une erreur se produit lorsque le nombre à virgule flottante float est spécifié.
# print(list(range(0.3, 1.0, 0.2)))
# TypeError: 'float' object cannot be interpreted as an integer
Si vous souhaitez générer une série de flottants, utilisez des compréhensions de liste.
print([i / 10 for i in range(3, 10, 2)])
# [0.3, 0.5, 0.7, 0.9]
Une légère erreur peut se produire lors de la multiplication des nombres à virgule flottante. Il peut être arrondi en utilisant round().
print([i * 0.1 for i in range(3, 10, 2)])
# [0.30000000000000004, 0.5, 0.7000000000000001, 0.9]
print([round(i * 0.1, 1) for i in range(3, 10, 2)])
# [0.3, 0.5, 0.7, 0.9]
Si vous pouvez utiliser NumPy, il est plus facile d’utiliser np.arange(). La spécification de l’argument de np.arange() est la même que celle de range(), et float peut être utilisé.
import numpy as np
print(np.arange(3))
# [0 1 2]
print(np.arange(3, 10))
# [3 4 5 6 7 8 9]
print(np.arange(3, 10, 2))
# [3 5 7 9]
print(np.arange(0.3, 1.0, 0.2))
# [0.3 0.5 0.7 0.9]
Consultez les articles suivants pour np.arange() et la conversion entre numpy.ndarray et list.
range() et xrange() en Python2
Python2 a deux fonctions, range() et xrange(). Python3 n’a pas xrange() mais seulement range().
Il y a une différence entre range() en Python2 et Python3. Notez qu’une erreur se produira si l’ancien code pour Python2 est exécuté tel qu’il est dans Python3.
range() renvoie list et xrange() renvoie un objet de type xrange.
print(range(3))
# [0, 1, 2]
print(type(range(3)))
# <type 'list'>
print(xrange(3))
# xrange(3)
print(type(xrange(3)))
# <type 'xrange'>
Les types xrange() et xrange en Python2 sont équivalents aux types range() et range en Python3.
Si vous souhaitez exécuter l’ancien code Python2 dans Python3, vous devez remplacer xrange() par range().
En Python2, range() renvoie une liste, ce qui équivaut à list(range()) en Python3. S’il est utilisé dans l’instruction for, vous n’avez pas besoin de list(), mais s’il est utilisé comme liste, vous devez ajouter list().