Форум сайта python.su
Здравствуйте, нужна помощь, запутался в терминах. Изучаю Python и вот дошёл до итераторов и генераторов. С генераторами я подружился ещё давно, а вот с итераторами и со всем что с ними связано - я никак не разберусь.
Итак, вот что я понял:
“Объект-итератор” - это некий неотображаемый объект, что разрешает проводить на себе процесс итерации.
Термины “Объект-итератор” и “Итератор” это одно и тоже. (Классы звать пока что не будем)
iterator = iter('Hello')
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 # Так как итератор мы не создавали думая что объект имеет свой.
my1 = iter([1, 2, 3, 4, 5])
my2 = 'Или же это?'
Офлайн
Возможно где-то что-то спутал, что-то недосказал - дело не в этом. Я действительно не могу понять саму конструкцию итераторов, вот прям не входит даже. На практике я использую итераторы довольно часто, но сам механизм почему-то не понимаю(
Офлайн
ron_1Сомнительно, что ты знаешь, что такое генератор. Да и генератором ты можешь называть comprehension, так как часто так переводят comprehension в книгах на русский язык.
Изучаю Python и вот дошёл до итераторов и генераторов. С генераторами я подружился ещё давно
>>> 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> >>>
>>> 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 >>>
>>> g = (i for i in [1]) >>> g <generator object <genexpr> at 0x7f8a21ea1eb8> >>> >>> def f(): yield ... >>> g = f() >>> g <generator object f at 0x7f8a21ea1eb8> >>>
>>> g = (i for i in [1, 2, 3]) >>> >>> next(g) 1 >>> for i in g: i ... 2 3 >>>
>>> 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' >>>
>>> 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Надо проверить наличие метода __next__ у объекта.
1.) Как узнать: имеет ли объект в себе итератор
>>> [].__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> >>>
Отредактировано py.user.next (Ноя. 21, 2017 01:26:29)
Офлайн
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()?
Офлайн
ron_1Скорее всего, ты выбрал для изучения языка совсем не то, что нужно. Много плохого материала есть, где пишут простые вещи слишком сложным языком без какой-либо необходимости в этом.
И кажется мне что всё это появилось из-за предопределённого неправильного понимания итераторов.
ron_1Это распространённая вольная трактовка термина, которая приводит к двусмысленности, так как в питоне есть именно генераторы, которые так и называются generator. А то, что ты описал, - это comprehension (включение, охват) и никакого отношения к генераторам не имеет.
Говоря о генераторах я подразумевал генераторы списков, словарей, кортежей и т.д.
ron_1Это не одно и то же, я выше написал фразу:
3.)Итерируемый объект и объект-итератор это одно и тоже?
py.user.nextЭто значит, что это три разных понятия.
Есть iterable, есть iterator и есть generator.
ron_1Это цикл вызывает неявно iter() для объекта, а потом полученный итератор использует на каждом шаге, вызывая для него next(). Сами эти функции вызывают, соответственно, методы __iter__() и __next__() у самого объекта.
1.) Итератор - это объект, что автоматически создаётся при циклической обработки типа данных.
ron_1Можешь писать next(), когда у объекта есть метод __next__().#Можем ли мы сразу написать next(x)?
ron_1Сам класс является итератором (описывает итератор, которым сразу станет его экземпляр). Как только ты его инстанциируешь (создашь объект этого класса), то этот экземпляр уже будет итератором и к нему сразу можно применять next().
1.) Когда мы создаём класс определяя методы __iter__ и __next__ - мы создаём объект-итератор
ron_1Найди себе хороший материал, где с нуля всё разжёвывается. Спрашиваешь какую-то билиберду с высокого уровня, не зная даже основ. Чтобы бесконечно не разъяснять тебе элементарнейшие вещи, я сразу отсылаю тебя к книгам высокого качества. Переписывать их сюда буква в букву слишком затратно и абсолютно бессмысленно. Бери Лутца, там как раз с нуля можно подняться до высот.
4.) Протокол итерации - это некие правила выполнения итерации
Отредактировано py.user.next (Окт. 13, 2017 17:02:22)
Офлайн
py.user.next
py.user.nextКнига Марка Лутца “Изучаем Python” - плохой материал?
Найди себе хороший материал, где с нуля всё разжёвывается.
py.user.nextНу дядя, ну хорошо же начинали. Основы чего? Основы ООП? Да, не знаю. Я шёл по этой книге от начала до средины пока не столкнулся с итераторами и всей этой кашей. И слышать “не зная основ” как минимум оскорбительно. Хоть вы и профессионал в своей области, но видеть в людях потенциал и их старания это явно не ваше.
Спрашиваешь какую-то билиберду с высокого уровня, не зная даже основ.
Офлайн
ron_1Основы всего. У меня нет желания объяснять тебе, что такое экземпляр, что такое класс. Итератор - это такой шаблон ООП, реализованный в питоне и ряде других языков. Но у меня нет желания объяснять тебе, что такое шаблон ООП.
Основы чего? Основы ООП? Да, не знаю.
ron_1Есть класс, есть его экземпляр, он же объект класса. А вот эта фраза “поведение для объекта-итератора этого класса” говорит о том, что ты вообще не понимаешь, что никакого отдельного объекта-итератора у класса нет, вообще никаких отдельных объектов у класса нет. Ты просто что-то неправильно понял и начинаешь эту фигню распространять всё дальше и дальше на смежные или просто похожие области. Не поняв одного, пытаешься с помощью этого понять другое, ещё более сложное.#Или же мы всего лишь создали поведение для объекта-итератора данного класса iterator
ron_1Я тебе написал ответ, а ты спрашиваешь “итератор и итерируемый объект - это одно и то же?”. А для кого я это всё писал? Значит, ты либо не читал, либо читал и не понял ничего. Если ты не читал, то ты не ценишь время окружающих; если ты не понял, то у тебя что-то с интеллектом.
И слышать “не зная основ” как минимум оскорбительно.
ron_1Она для самых маленьких написана, чтобы они могли понять сложные вещи.
Книга Марка Лутца “Изучаем Python” - плохой материал?
ron_1И что, что ты шёл? Идти можно по-разному, можно читать всё по диагонали и убеждать себя, что ты такой понимающий. Где гарантия, что ты в пройденном понял всё или хотя бы большую часть? Эта книга не тонкая, читать её долго и лениво, поэтому диагональ там имеет большую вероятность. Если ты хочешь с наскока взять весь язык - это твои проблемы, но мы-то тут при чём?
Я шёл по этой книге от начала до средины пока не столкнулся с итераторами
Отредактировано py.user.next (Окт. 13, 2017 17:26:42)
Офлайн
py.user.next
py.user.nextЯ вам даю абсолютную гарантию того что я читал каждую страницу, вникаясь в каждое слово.
Основы всего.
py.user.nextЯ прочитал всё что вы написали, но понял лишь малую часть, так как изучаю сейчас итераторы не дойдя до генераторов. Вы дали мне образное понятие, а мне требовалось точное определение этих двух терминов. Я дисциплинарный человек и в книге Лутца как вы сказали нету точного понятия того или иного, метод обучения строится на такой конструкции объяснения: Обратите внимание на эту форму присваивания, она из разряда канонических и является стандартом - что я понял из вышеизложенного? Эту книгу нужно читать людям, которые уже дышат питоном и им надо лишь поумничать среди коллег. Там нету никакого конструктива, только поверхностное объяснение, примеры и так рекурсионо.
Я тебе написал ответ, а ты спрашиваешь “итератор и итерируемый объект - это одно и то же?”. А для кого я это всё писал? Значит, ты либо не читал, либо читал и не понял ничего. Если ты не читал, то ты не ценишь время окружающих; если ты не понял, то у тебя что-то с интеллектом.
py.user.nextЗадайте мне любой вопрос до 417 страницы книги Марка Лутца “Изучаем Python”, я отвечу вам на него САМ, я даю вам слово Мужчины, что не полезу ни в учебник ни в сеть, дабы показать свои псевдознания.
Где гарантия, что ты понял там всё?
Офлайн
ron_1Что такое переменная?
Задайте мне любой вопрос до 417 страницы
Офлайн
py.user.next
Переменная это сылка на место объекта в памяти. При создании сылки на неизменяемый объект мы можно сказать присваеваем значение переменной, но дело с изменяемыми объектами, такими как списки, словари обстоят по другому: при изменение любой переменной, что сылается на объект - изменение касается всех сылок, так как объект един, пример:
z = x = [1, 2, 3] z[1] = 5 print(x) # Выведет [1, 5, 3]
Офлайн