Python Language Différences entre les fonctions range et xrange


Exemple

Dans Python 2, la fonction range renvoie une liste, tandis que xrange crée un objet xrange spécial, qui est une séquence immuable, qui, contrairement à d'autres types de séquence intégrés, ne prend pas en charge les méthodes d' index ni de count :

Python 2.x 2.3
print(range(1, 10))
# Out: [1, 2, 3, 4, 5, 6, 7, 8, 9]

print(isinstance(range(1, 10), list))
# Out: True

print(xrange(1, 10))
# Out: xrange(1, 10)

print(isinstance(xrange(1, 10), xrange))
# Out: True

En Python 3, xrange a été étendu à la range séquence, ce qui crée ainsi maintenant une range objet. Il n'y a pas de type de xrange :

Python 3.x 3.0
print(range(1, 10))
# Out: range(1, 10)

print(isinstance(range(1, 10), range))
# Out: True

# print(xrange(1, 10))
# The output will be:
#Traceback (most recent call last):
#  File "<stdin>", line 1, in <module>
#NameError: name 'xrange' is not defined

De plus, depuis Python 3.2, la range prend également en charge le découpage, l’ index et le count :

print(range(1, 10)[3:7])
# Out: range(3, 7)
print(range(1, 10).count(5))
# Out: 1
print(range(1, 10).index(7))
# Out: 6

L'avantage d'utiliser un type de séquence spécial au lieu d'une liste est que l'interpréteur n'a pas besoin d'allouer de la mémoire pour une liste et de la remplir:

Python 2.x 2.3
# range(10000000000000000)
# The output would be:
# Traceback (most recent call last):
#  File "<stdin>", line 1, in <module>
# MemoryError

print(xrange(100000000000000000))
# Out: xrange(100000000000000000)

Comme ce dernier comportement est généralement souhaité, le premier a été supprimé dans Python 3. Si vous voulez toujours avoir une liste dans Python 3, vous pouvez simplement utiliser le constructeur list() sur un objet de range :

Python 3.x 3.0
print(list(range(1, 10)))
# Out: [1, 2, 3, 4, 5, 6, 7, 8, 9]

Compatibilité

Afin de maintenir la compatibilité entre les deux versions 2.x Python et Python 3.x, vous pouvez utiliser le builtins module du package externe future pour atteindre à la fois en avant et en arrière-compatiblité-compatiblité:

Python 2.x 2.0
#forward-compatible
from builtins import range

for i in range(10**8):
    pass
Python 3.x 3.0
#backward-compatible
from past.builtins import xrange

for i in xrange(10**8):
    pass

La range de la future bibliothèque prend en charge le découpage, l' index et le count dans toutes les versions de Python, tout comme la méthode intégrée sur Python 3.2+.