Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 12, 2017 20:03:17

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

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

Здравствуйте, нужна помощь, запутался в терминах. Изучаю Python и вот дошёл до итераторов и генераторов. С генераторами я подружился ещё давно, а вот с итераторами и со всем что с ними связано - я никак не разберусь.

Итак, вот что я понял:

“Объект-итератор” - это некий неотображаемый объект, что разрешает проводить на себе процесс итерации.

Термины “Объект-итератор” и “Итератор” это одно и тоже. (Классы звать пока что не будем)

  iterator = iter('Hello')
- Объект итератор



__next__ - перегружаемый “оператор”, что вызывается при вызове функции next(“Объект итератор”)

Циклы автоматизировано создают объекты-итераторы при итерировании итерируемого объекта (последовательности) - сам точно не знаю.

Далее:

У некоторых встроенных типов данных (объектов) например объект-файл имеется свой итератор с помощью которого они адаптируются. И, уже его методы используют его, то есть создавать отдельный итератор для них не надо.

В чём собственно жопа:

Пока писал этот текст многое стало на свои места, но вопросы всё таки остались:

1.) Как узнать: имеет ли объект в себе итератор и с ним можно проводить операции не делая из него последовательность или же он этого итератора не имеет и его нужно отдельно для него создавать, пример:
 file = open('nice.txt', 'r')
print(next(file), end='')
print(next(file), end='')
print(next(file), end='')
# Здесь всё заработает, так как объект имеет свой итератор

В сравнение с:

 lister = ['Hello', 1, 5.2, {5: 'do'}]
next(lister)
# TypeError: 'list' object is not an iterator 
# Так как итератор мы не создавали думая что объект имеет свой.

2.) Итерируемый объект (вот тут первый “пробел”) - Объект к которому применимы инструменты итерирования (инструкции for, while, генераторы и т.д) - по идее любой объект последовательности (даже словарь), ИЛИ ЖЕ: Синоним слова объект-итератор? Чтоб было более понятней:
 my1 = iter([1, 2, 3, 4, 5])
 my2 = 'Или же это?'
Какой из них итерируемый объект?

Ещё одно недопонимание, оффтоп:
Поток вывода-ввода в Python (sys.stdout) как то связан с обычными компьютерными потоками? (понимаю вопрос уж слишком чайниковый тем не менее хочется убрать туман в моей голове)

Офлайн

#2 Окт. 12, 2017 20:08:57

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

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

Возможно где-то что-то спутал, что-то недосказал - дело не в этом. Я действительно не могу понять саму конструкцию итераторов, вот прям не входит даже. На практике я использую итераторы довольно часто, но сам механизм почему-то не понимаю(

Офлайн

#3 Окт. 13, 2017 00:45:22

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

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

ron_1
Изучаю Python и вот дошёл до итераторов и генераторов. С генераторами я подружился ещё давно
Сомнительно, что ты знаешь, что такое генератор. Да и генератором ты можешь называть comprehension, так как часто так переводят comprehension в книгах на русский язык.

Есть iterable, есть iterator и есть generator.

1)
iterable - это всё, к чему можно применить iter() и получить из iter() итератор.
  
>>> iter(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
>>> 
>>> iter([])
<list_iterator object at 0x7f8a21c46470>
>>>
>>> iter('')
<str_iterator object at 0x7f8a21c464e0>
>>>

2)
iterator - это всё, к чему можно применить next() и получить значение либо исключение StopIteration.
  
>>> it = iter([1])
>>> it
<list_iterator object at 0x7f8a21c464e0>
>>> next(it)
1
>>> next(it)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>>

3)
generator - это iterator, у которого есть дополнительные методы send(), throw() и close().
  
>>> g = (i for i in [1])
>>> g
<generator object <genexpr> at 0x7f8a21ea1eb8>
>>>
>>> def f(): yield
... 
>>> g = f()
>>> g
<generator object f at 0x7f8a21ea1eb8>
>>>

Дальше:

iterator и generator являются iterable.
  
>>> g = (i for i in [1, 2, 3])
>>> 
>>> next(g)
1
>>> for i in g: i
... 
2
3
>>>

Чтобы создать iterator, нужно: 1) сделать метод __iter__, который вернёт в конечном итоге сам объект; 2) сделать метод __next__, который вернёт либо значение, либо породит StopIteration.
  
>>> class It:
...     
...     def __init__(self):
...         self.obj = 'abc'
...     
...     def __iter__(self):
...         self.i = 0
...         return self
...     
...     def __next__(self):
...         if self.i < len(self.obj):
...             out = self.obj[self.i]
...             self.i += 1
...             return out
...         else:
...             raise StopIteration
... 
>>> it = It()
>>> 
>>> for i in it: i
... 
'a'
'b'
'c'
>>> next(it)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 16, in __next__
StopIteration
>>> 
>>> for i in it: i
... 
'a'
'b'
'c'
>>>

Чтобы создать generator, нужно сделать функцию, у которой внутри есть yield.
  
>>> def f():
...     yield 1
...     yield 2
...     yield 3
...     for i in 'abc':
...         yield i
...     yield 4
...     yield 5
...     yield 6
... 
>>> g = f()
>>> 
>>> for i in g: i
... 
1
2
3
'a'
'b'
'c'
4
5
6
>>>


ron_1
1.) Как узнать: имеет ли объект в себе итератор
Надо проверить наличие метода __next__ у объекта.
  
>>> [].__next__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute '__next__'
>>> 
>>> iter([]).__next__
<method-wrapper '__next__' of list_iterator object at 0x7ffb47e52438>
>>>

tags: iterable iterator generator



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

Офлайн

#4 Окт. 13, 2017 16:21:49

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

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

py.user.next
Говоря о генераторах я подразумевал генераторы списков, словарей, кортежей и т.д.

Что я понял:
1.) Итератор - это объект, что автоматически создаётся при циклической обработки типа данных.
2.) Итератор - это отдельный класс, у которого взаимодействие других классов с ним определенно в языке Python.



Что я не понял:
1.) Когда мы создаём класс определяя методы __iter__ и __next__ - мы создаём объект-итератор для класса или же мы создаём поведение класса при воплощение его в объект-итератор?

 class MyClass:
  def __iter__():
   return ...
  def __next__():
   return 'Hello'
x = MyClass()
#Можем ли мы сразу написать next(x)?
#Или же мы всего лишь создали поведение для объекта-итератора данного класса iterator = iter(x); next(iterator)?
# Если же это всего лишь поведение, то как создать образ выполнения функции next()?
 

2.) Изучая итераторы можно ли сказать что мы “лезем под капот” или же это типичная операция в мире Python?

3.)Итерируемый объект и объект-итератор это одно и тоже?

4.) Протокол итерации - это некие правила выполнения итерации (обращение к объекту и получение результата)? Вот здесь отдельно попрошу точного, полного определения этого термина, так как в паутине я его к сожалению не нашёл

Что показалось интересным:

Если мы создадим объект итератор, то из него мы можем создать ещё один объект итератор и эта операция может проводиться - бесконечно.


P.S Чем больше пытаюсь вникнуть в механизм циклов, итераторов, тем больше путаюсь. Приходится ждать следующего дня чтобы со свежей головой начать изучать эти итераторы и так уже 4 день.
И кажется мне что всё это появилось из-за предопределённого неправильного понимания итераторов. Я вроде знаю, а вроде не знаю, странное чувство.

Офлайн

#5 Окт. 13, 2017 16:52:29

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

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

ron_1
И кажется мне что всё это появилось из-за предопределённого неправильного понимания итераторов.
Скорее всего, ты выбрал для изучения языка совсем не то, что нужно. Много плохого материала есть, где пишут простые вещи слишком сложным языком без какой-либо необходимости в этом.

ron_1
Говоря о генераторах я подразумевал генераторы списков, словарей, кортежей и т.д.
Это распространённая вольная трактовка термина, которая приводит к двусмысленности, так как в питоне есть именно генераторы, которые так и называются generator. А то, что ты описал, - это comprehension (включение, охват) и никакого отношения к генераторам не имеет.

ron_1
3.)Итерируемый объект и объект-итератор это одно и тоже?
Это не одно и то же, я выше написал фразу:
py.user.next
Есть iterable, есть iterator и есть generator.
Это значит, что это три разных понятия.

ron_1
1.) Итератор - это объект, что автоматически создаётся при циклической обработки типа данных.
Это цикл вызывает неявно iter() для объекта, а потом полученный итератор использует на каждом шаге, вызывая для него next(). Сами эти функции вызывают, соответственно, методы __iter__() и __next__() у самого объекта.

ron_1
#Можем ли мы сразу написать next(x)?
Можешь писать next(), когда у объекта есть метод __next__().

ron_1
1.) Когда мы создаём класс определяя методы __iter__ и __next__ - мы создаём объект-итератор
Сам класс является итератором (описывает итератор, которым сразу станет его экземпляр). Как только ты его инстанциируешь (создашь объект этого класса), то этот экземпляр уже будет итератором и к нему сразу можно применять next().


ron_1
4.) Протокол итерации - это некие правила выполнения итерации
Найди себе хороший материал, где с нуля всё разжёвывается. Спрашиваешь какую-то билиберду с высокого уровня, не зная даже основ. Чтобы бесконечно не разъяснять тебе элементарнейшие вещи, я сразу отсылаю тебя к книгам высокого качества. Переписывать их сюда буква в букву слишком затратно и абсолютно бессмысленно. Бери Лутца, там как раз с нуля можно подняться до высот.



Отредактировано py.user.next (Окт. 13, 2017 17:02:22)

Офлайн

#6 Окт. 13, 2017 17:01:24

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

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

py.user.next

py.user.next
Найди себе хороший материал, где с нуля всё разжёвывается.
Книга Марка Лутца “Изучаем Python” - плохой материал?
py.user.next
Спрашиваешь какую-то билиберду с высокого уровня, не зная даже основ.
Ну дядя, ну хорошо же начинали. Основы чего? Основы ООП? Да, не знаю. Я шёл по этой книге от начала до средины пока не столкнулся с итераторами и всей этой кашей. И слышать “не зная основ” как минимум оскорбительно. Хоть вы и профессионал в своей области, но видеть в людях потенциал и их старания это явно не ваше.

Офлайн

#7 Окт. 13, 2017 17:11:47

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

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

ron_1
Основы чего? Основы ООП? Да, не знаю.
Основы всего. У меня нет желания объяснять тебе, что такое экземпляр, что такое класс. Итератор - это такой шаблон ООП, реализованный в питоне и ряде других языков. Но у меня нет желания объяснять тебе, что такое шаблон ООП.

Вот по этому набору слов понятно, что ты не знаешь основ:
ron_1
 #Или же мы всего лишь создали поведение для объекта-итератора данного класса iterator
Есть класс, есть его экземпляр, он же объект класса. А вот эта фраза “поведение для объекта-итератора этого класса” говорит о том, что ты вообще не понимаешь, что никакого отдельного объекта-итератора у класса нет, вообще никаких отдельных объектов у класса нет. Ты просто что-то неправильно понял и начинаешь эту фигню распространять всё дальше и дальше на смежные или просто похожие области. Не поняв одного, пытаешься с помощью этого понять другое, ещё более сложное.

ron_1
И слышать “не зная основ” как минимум оскорбительно.
Я тебе написал ответ, а ты спрашиваешь “итератор и итерируемый объект - это одно и то же?”. А для кого я это всё писал? Значит, ты либо не читал, либо читал и не понял ничего. Если ты не читал, то ты не ценишь время окружающих; если ты не понял, то у тебя что-то с интеллектом.

ron_1
Книга Марка Лутца “Изучаем Python” - плохой материал?
Она для самых маленьких написана, чтобы они могли понять сложные вещи.

ron_1
Я шёл по этой книге от начала до средины пока не столкнулся с итераторами
И что, что ты шёл? Идти можно по-разному, можно читать всё по диагонали и убеждать себя, что ты такой понимающий. Где гарантия, что ты в пройденном понял всё или хотя бы большую часть? Эта книга не тонкая, читать её долго и лениво, поэтому диагональ там имеет большую вероятность. Если ты хочешь с наскока взять весь язык - это твои проблемы, но мы-то тут при чём?



Отредактировано py.user.next (Окт. 13, 2017 17:26:42)

Офлайн

#8 Окт. 13, 2017 17:33:05

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

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

py.user.next

py.user.next
Основы всего.
Я вам даю абсолютную гарантию того что я читал каждую страницу, вникаясь в каждое слово.
py.user.next
Я тебе написал ответ, а ты спрашиваешь “итератор и итерируемый объект - это одно и то же?”. А для кого я это всё писал? Значит, ты либо не читал, либо читал и не понял ничего. Если ты не читал, то ты не ценишь время окружающих; если ты не понял, то у тебя что-то с интеллектом.
Я прочитал всё что вы написали, но понял лишь малую часть, так как изучаю сейчас итераторы не дойдя до генераторов. Вы дали мне образное понятие, а мне требовалось точное определение этих двух терминов. Я дисциплинарный человек и в книге Лутца как вы сказали нету точного понятия того или иного, метод обучения строится на такой конструкции объяснения: Обратите внимание на эту форму присваивания, она из разряда канонических и является стандартом - что я понял из вышеизложенного? Эту книгу нужно читать людям, которые уже дышат питоном и им надо лишь поумничать среди коллег. Там нету никакого конструктива, только поверхностное объяснение, примеры и так рекурсионо.
Но вам не повезло, я изучал язык ещё в 2012 году и имел и всё ещё имею представление о циклах и других инструкций.

py.user.next
Где гарантия, что ты понял там всё?
Задайте мне любой вопрос до 417 страницы книги Марка Лутца “Изучаем Python”, я отвечу вам на него САМ, я даю вам слово Мужчины, что не полезу ни в учебник ни в сеть, дабы показать свои псевдознания.

Офлайн

#9 Окт. 13, 2017 17:41:55

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

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

ron_1
Задайте мне любой вопрос до 417 страницы
Что такое переменная?
Что такое функция?
Что такое объект?
Что такое класс?
Что такое экземпляр класса?
Что такое метод класса?
Что такое self в методе класса?
Что такое конструктор класса?

Чем функция next() отличается от метода __next__() объекта?



Офлайн

#10 Окт. 13, 2017 17:48:26

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

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

py.user.next
Переменная это сылка на место объекта в памяти. При создании сылки на неизменяемый объект мы можно сказать присваеваем значение переменной, но дело с изменяемыми объектами, такими как списки, словари обстоят по другому: при изменение любой переменной, что сылается на объект - изменение касается всех сылок, так как объект един, пример:

 z = x = [1, 2, 3]
z[1] = 5
print(x) # Выведет [1, 5, 3]

Не изучал

Не изучал, но, объект - это экземпляр класса
Класс - это создатель экземпляров. Который в свою очередь сам является экземпляром type() метакласса

Метод класса - это функция внутри класса присущая только ему

self указатель на экземпляр
__init__ конструктор класса, вызывается первый при его создании (существует ошибочное мнение, о том что он экземпляром не является, а является __new__

Это одно и тоже, функция next() вызывает __next__()

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version