Найти - Пользователи
Полная версия: Итератор, итерируемый объект и прочие.
Начало » Python для новичков » Итератор, итерируемый объект и прочие.
1 2 3
ron_1
py.user.next
То что я написал насчёт классов и всё что с ними связано является моим несистиматизированным опытом в этом языке и он не был получен благодаря этой книги. Я написал “не изучал” так как не изучал функции в книге, но я могу дать вам полный ответ в отношении их основанный на моём личном опыте и дурацких курсов. Дальше, я заметил что вы продиктовали слишком много терминов следующих после 417 страницы и решил писать всё что знаю.
Rodegast
Да забей ты на итераторы. Когда надо будет разберёшся.
py.user.next
ron_1
Я написал “не изучал” так как не изучал функции в книге, но я могу дать вам полный ответ в отношении их основанный на моём личном опыте и дурацких курсов.
Тебе нужно изучить основы программирования - самого обычного программирования без всякого питона. Сейчас много курсов есть (и письменных, и видео), где рассказывается о переменных, функциях, конструкциях и алгоритмах в любых языках. Например, ты знаешь, что такое оператор в программе?
Теперь понятно, почему ты не понял моё первое сообщение: я думал, ты знаешь основы программирования. А так, получается, что ты не знаешь основ, но лезешь в слишком сложный и специфичный для конкретного языка программирования материал, который без основ понять невозможно. Что такое объект? Ты не можешь понять это, потому что основ не знаешь. Ты говоришь “объект - это экземпляр, а экземпляр - это объект”.
У тебя информатика в школе была? Обычно это всё там выдают с использованием псевдокода: понятие алгоритма, понятие исходного кода программы, операторов и всего остального.
ron_1
Rodegast
Да, так и сделал. Пропустил эту главу.
ron_1
py.user.next
Я просмотрел несколько обучающих видео уроков по основам программирования. Единственное что для себя открыл нового это термин “Структура данных” (я знал, что это такое, но не знал как называется) . А насчёт текста: я так написал из-за того что писал очень быстро т.к спешил, надо было отойти по собственным делам. В спешке пришла первая ассоциация объекта - экземпляр класса. Сейчас я попытаюсь вам изложить свои знания объекта: Объект - это отдельный тип данных который имеет специфические атрибуты, так же объект может ориентироваться в среде благодаря полиморфизму, а точнее с помощью перегрузки операторов, объект - это основа любого языка программирования, принцип типизаций строится на объектах и их поведениях, объект это “представитель” информации в программировании. В том сообщении изложены не все мои знания, а всего лишь их малейшая часть.
ron_1
Сейчас достаточно попрактиковался на итераторах и классах и возник ещё один вопрос: Зачем создавать итератор из итерируемого объекта когда можно напрямую вызывать функцию next(Итерируемый объект)? И тут какая то хрень начинается: объекты встроенных типов данных (списки, строки) не могут быть аргументом в next() без явного преобразования в итератор, а вот собственные (созданные мною) объекты могут

 class MyClass:
    def __init__(self):
        self.x = [1, 2, 3, 4]
        self.num = 0
    def __iter__(self):
        return self
    def __next__(self):
        self.num += 1
        return self.x[self.num]
x = MyClass()
print(next(x)); print(next(x)); print(next(x));

Но:
 x1 = [1, 2, 3]
# А вот тут
# print(next(x)) Выведет ошибку - ПОЧЕМУ?
my_iter = iter(x1)
print(next(my_iter)); print(next(my_iter))
# Без итератора не работает

создаётся ложное ощущение, что запутались сами разработчики языка
py.user.next
ron_1
Зачем создавать итератор из итерируемого объекта когда можно напрямую вызывать функцию next(Итерируемый объект)?
Невнимательно читаешь ещё. Итерируемый объект - это не итератор. Итерируемый объект - это iterable, про который я писал в первом ответе этого топика. Раз уж ты не знаешь нифига, то итерируемый объект - это такой объект, у которого можно получить итератор. Список, например, является итерируемым объектом, но не является итератором. У него есть метод __iter__(), поэтому к нему можно применить функцию iter(); а функция iter() уже вернёт итератор, который будет получен из встроенного метода __iter__(). Внутри встроенного метода __iter__() этот итератор будет построен по внутренним (скрытым) правилам. Пойми одну вещь: список и итератор по этому списку - это два абсолютно разных объекта.

Вот смотри: список один, а независимых друг от друга итераторов на нём может быть несколько.
  
>>> lst = [1, 2, 3]
>>> 
>>> it1 = iter(lst)
>>> it2 = iter(lst)
>>> it3 = iter(lst)
>>> 
>>> id(lst), id(it1), id(it2), id(it3)
(140567794603848, 140567794681000, 140567794681112, 140567794681224)
>>> 
>>> next(it1)
1
>>> next(it1)
2
>>> next(it2)
1
>>> next(it1)
3
>>> next(it2)
2
>>> next(it3)
1
>>>

  
>>> 
>>> lst.append(4)
>>> 
>>> next(it1)
4
>>> next(it2)
3
>>> next(it2)
4
>>> 
ron_1
py.user.next
Сейчас, я полностью разобрался со всеми этими танцами вызова дождя и заметил что вы всё таки кое-что недосказали.
Реализация ООП в классах часто связана с утиной типизацией и поэтому иногда приходится имитировать поведение итерируемых объектов. Но в типе списков всё это реализовывалось по другому, там iter() возвращал уже сам объект итератора экземпляра, а не объект экземпляра.
 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]
g = my()
print(g is iter(g))
n = [5, 10]
print(n is iter(n))

Вывод:
True
False

Поэтому я не понимал принцип построения итераторов и путался. Так же нету чёткой грани между итератором и итерируемым объектом (слова лутца). В пользовательских классах iter(экземпляр) возвращает сам экземпляр и сделано это всё формально ( для инструментов поддерживающих протокол итерации: циклы, map). То есть просто имитация поведения встроенного типа. А вот в самих встроенных типах уже проходит линия между итератором и итерируемым объектом (экземпляром).

Это и было мне трудно понять. Всё равно, Спасибо, за вашу помощь в этой неразберихе, можете не отвечать на это сообщение.

P.S по сути, итератор тоже является итерируемым объектом.
Rodegast
> Сейчас, я полностью разобрался со всеми этими … В пользовательских классах iter(экземпляр) возвращает сам экземпляр

Ну тогда вот тебе дополнительная информация для размышления
 >>> a = [1, 2, 3]
>>> class my(object):
...     def __iter__(self):
...         return iter(a)
>>> g = my()
>>> g is iter(g)
False
>>> for x in g:
...    x
1
2
3
ron_1
Rodegast
Дядя петя… Это уже древнегреческий пайтон, тут вторая ветка со своим старым стилем классов, где класс - это класс, а не тип. Да и у вас там как бы возврат итератора списка идёт, а не итератора пользовательского класса. Это какой-то новый паттерн делегирования?)

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