Pull to refresh

Comments 8

Ярким примером (генератора) являются функции range и enumerate
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. На сколько я помню первое поведение является более правильным — если мы запрашиваем новый итератор, мы хотим итерировать с начала.

Спасибо, что откликнулись.
Буду вдвойне благодарен, если обратите внимание на… кх-м-м (внушительным голосом)
Ярким примером (генератора) являются функции range и enumerate
Прошу прощения, но я возражал именно на это.
во втором питоне он и есть list
это не так: во втором питоне range — всего лишь функция, возвращающая list
Замечательно, спасибо.

Хорошо бы только заменить мелкие ошибки вроде отсутствия запятых вокруг «на мой взгляд», а также использовать поменьше жаргона. Всё-таки у нас академической литературе про программированию уже порядка полста лет; смысла использовать новояз нет.
В стандартной библиотеки он объявлен

Начало интересное, но читать тяжело из-за частых проблем с падежами.

range еще умеет выдавать элементы по индексам, но слайсы не умеет
In [1]: my_range = range(100)

In [2]: my_range[2]
Out[2]: 2

In [3]: my_range[:2]
Out[3]: range(0, 2)

в отличие от итераторов.
Еще интересной особенностью, которой обладает итератор — это одноразовое использование
Статья получилась интересной, спасибо
In [16]: my_iter = iter([1, 2, 3, 4, 5])

In [17]: my_iter
Out[17]: <list_iterator at 0x4a5bb10>

In [18]: [x for x in my_iter]
Out[18]: [1, 2, 3, 4, 5]

In [19]: [x for x in my_iter]
Out[19]: []
Sign up to leave a comment.

Articles