Ответ 1
range
- это класс неизменяемых итерируемых объектов. Их итерационное поведение можно сравнить с list
s: вы не можете называть next
непосредственно на них; вам нужно получить итератор, используя iter
.
Итак, нет, range
не является генератором.
Возможно, вы думаете: "Почему они не сделали это прямое итерабельным"? Ну, range
имеют некоторые полезные свойства, которые были бы невозможны таким образом:
- Они неизменяемы, поэтому их можно использовать в качестве словарных клавиш.
- У них есть атрибуты
start
,stop
иstep
(начиная с методов Python 3.3),count
иindex
, и они поддерживают операцииin
,len
и__getitem__
. - Вы можете перебирать один и тот же
range
несколько раз.
>>> myrange = range(1, 21, 2)
>>> myrange.start
1
>>> myrange.step
2
>>> myrange.index(17)
8
>>> myrange.index(18)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 18 is not in range
>>> it = iter(myrange)
>>> it
<range_iterator object at 0x7f504a9be960>
>>> next(it)
1
>>> next(it)
3
>>> next(it)
5