Ответ 1
irange()
возвращает тип генератора, который может быть только повторен. Ничего больше. После того, как вы повторили его, генератор исчерпан и не может быть повторен снова.
Python 2 xrange()
type и Python 3 range()
тип являются типами последовательностей, они поддерживают различные операции, поддерживаемые другими последовательностями, такие как отчетность по их длине, проверка на локализацию и индексирование:
>>> xr = xrange(10, 20, 3)
>>> len(xr)
4
>>> 10 in xr
True
>>> xr[0]
10
>>> xr[1]
13
Вы можете повторять эти объекты более одного раза:
>>> for i in xr:
... print i,
...
10 13 16 19
>>> for i in xr:
... print i,
...
10 13 16 19
Вы можете даже использовать функцию reversed()
, чтобы эффективно перебирать их в обратном направлении:
>>> for i in reversed(xr):
... print i,
...
19 16 13 10
Тип Python 3 range()
является улучшенной версией xrange()
, поскольку он поддерживает больше операций с последовательностями, более эффективен и может обрабатывать значения за пределами sys.maxint
(что было бы целым числом long
в Python 2).
Он поддерживает срез, например, который приводит к новому объекту range()
для разрезанных значений:
>>> r = range(10, 20, 3)
>>> r[:2]
range(10, 16, 3)
Вы можете использовать отрицательные индексы, как вы можете, с другими последовательностями Python, чтобы получить подсчет элементов с конца:
>>> r[-2]
16
>>> r[-2:]
range(16, 22, 3)
и тип поддерживает тестирование для равенства; два экземпляра range()
равны, если они дают одинаковые значения:
>>> range(10, 20, 3) == range(10, 21, 3)
True
В Python 2 единственное преимущество, которое может иметь генератор irange()
, состоит в том, что он не страдает от ограничения недолговыми целыми числами, которые xrange()
подвергаются:
>>> import sys
>>> xrange(sys.maxint)
xrange(9223372036854775807)
>>> xrange(sys.maxint + 1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: Python int too large to convert to C long