Найти - Пользователи
Полная версия: Итератор, итерируемый объект и прочие.
Начало » Python для новичков » Итератор, итерируемый объект и прочие.
1 2 3
Rodegast
> тут вторая ветка со своим старым стилем классов

Нет. Это новый стиль классов.

> Это какой-то новый паттерн делегирования?)

Я не знаю что такое “паттерн делегирования”. А __iter__ тебе вернуть всё что угодно может.
ron_1
Rodegast
Rodegast
Это новый стиль классов.
Да, день был тяжёлый, не заметил наследование object.
Rodegast
Я не знаю что такое “паттерн делегирования”.
https://ru.wikipedia.org/wiki/Шаблон_делегирования
pattern = шаблон
Rodegast
__iter__ тебе вернуть всё что угодно может.
В данном случае __iter__ мне вернул итератор списка, этот класс просто “класс-обёртка”, но обёртывает он глобальный объект, а не свой атрибут, поэтому я подумал о делегирование.
py.user.next
Rodegast
Нет. Это новый стиль классов.
ron_1
Да, день был тяжёлый, не заметил наследование object.
Это новый стиль классов во втором питоне, который уже сам по себе устаревший.
В третьем питоне реализован только новый стиль классов, поэтому наследование от object происходит само.

ron_1
Так же нету чёткой грани между итератором и итерируемым объектом (слова лутца).
В питоне эти понятия разделены. Итерируемый объект может не быть итератором. А итератор - это определённый протокол (набор правил).

Пример iterable, но не iterator
  
>>> r = range(3)
>>> r
range(0, 3)
>>> next(r)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'range' object is not an iterator
>>> list(r)
[0, 1, 2]
>>> set(r)
{0, 1, 2}
>>>
iterable - это объект, у которого можно получить итератор с помощью глобальной функции iter(). Все эти циклы и конструкторы так и действуют - вызывают iter(), чтобы получить от объекта итератор по объекту (объект сам его формирует и отдаёт функции iter(), когда она вызывается для этого объекта).

Это легко проверить
  
>>> class A:
...   def __iter__(self):
...     print('hello')
... 
>>> list(A())
hello
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: iter() returned non-iterator of type 'NoneType'
>>> 
>>> set(A())
hello
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: iter() returned non-iterator of type 'NoneType'
>>> 
>>> for i in A(): pass
... 
hello
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: iter() returned non-iterator of type 'NoneType'
>>>


ron_1
  
class my:
    def __init__(self):
        self.a = [1, 2, 3]
    def __iter__(self):
        self.n = 0
        return self
    def __next__(self):
        self.n += 1
        return self.a[self.n]
В твоём коде нарушен протокол итератора. В конце он должен порождать исключение StopIteration.

И вот результат этого нарушения протокола итератора
  
>>> class my:
...     def __init__(self):
...         self.a = [1, 2, 3]
...     def __iter__(self):
...         self.n = 0
...         return self
...     def __next__(self):
...         self.n += 1
...         return self.a[self.n]
... 
>>> for i in my():
...   i
... 
2
3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 9, in __next__
IndexError: list index out of range
>>>
Rodegast
> pattern = шаблон

Да в курсе я. Просто психам хаскелистам оно без надобности.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB