Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 20, 2017 20:58:05

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2683
Репутация: +  182  -
Профиль   Отправить e-mail  

Итератор, итерируемый объект и прочие.

> тут вторая ветка со своим старым стилем классов

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

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

Я не знаю что такое “паттерн делегирования”. А __iter__ тебе вернуть всё что угодно может.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#2 Ноя. 20, 2017 21:07:30

ron_1
Зарегистрирован: 2017-10-12
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Итератор, итерируемый объект и прочие.

Rodegast

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

Офлайн

#3 Ноя. 21, 2017 01:25:39

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9726
Репутация: +  843  -
Профиль   Отправить e-mail  

Итератор, итерируемый объект и прочие.

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
>>>



Отредактировано py.user.next (Ноя. 21, 2017 01:32:39)

Офлайн

#4 Ноя. 21, 2017 10:11:31

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2683
Репутация: +  182  -
Профиль   Отправить e-mail  

Итератор, итерируемый объект и прочие.

> pattern = шаблон

Да в курсе я. Просто психам хаскелистам оно без надобности.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version