Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
range
— count
, и на это стоит пролить немного света.from itertools import count
def test(f):
for i in f:
print(i, end=' ')
if i == 1:
break
print("~", end=' ')
for i in f:
print(i, end=' ')
if i == 2: # на всякий случай ;)
break
print()
def mygen():
yield 0
yield 1
yield 2
test([0, 1, 2]) # 0 1 ~ 0 1 2
test(range(3)) # 0 1 ~ 0 1 2
test(mygen()) # 0 1 ~ 2
test((i for i in (0, 1, 2))) # 0 1 ~ 2
test(count()) # 0 1 ~ 2
range
ведёт себя как list
, что неудивительно — во втором питоне он и есть list
.Вывод вашей функции test зависит то того, что возвращает метод iter: в первых двух случаях это итератор-обертка, а в остальных трёх — self, в котором есть метод next. На сколько я помню первое поведение является более правильным — если мы запрашиваем новый итератор, мы хотим итерировать с начала.
во втором питоне он и есть listэто не так: во втором питоне range — всего лишь функция, возвращающая list
В стандартной библиотеки он объявлен
Начало интересное, но читать тяжело из-за частых проблем с падежами.
In [1]: my_range = range(100)
In [2]: my_range[2]
Out[2]: 2
In [3]: my_range[:2]
Out[3]: range(0, 2)
Итерируемый объект, итератор и генератор