Форум сайта python.su
py.user.next
То что я написал насчёт классов и всё что с ними связано является моим несистиматизированным опытом в этом языке и он не был получен благодаря этой книги. Я написал “не изучал” так как не изучал функции в книге, но я могу дать вам полный ответ в отношении их основанный на моём личном опыте и дурацких курсов. Дальше, я заметил что вы продиктовали слишком много терминов следующих после 417 страницы и решил писать всё что знаю.
Офлайн
Да забей ты на итераторы. Когда надо будет разберёшся.
Офлайн
ron_1Тебе нужно изучить основы программирования - самого обычного программирования без всякого питона. Сейчас много курсов есть (и письменных, и видео), где рассказывается о переменных, функциях, конструкциях и алгоритмах в любых языках. Например, ты знаешь, что такое оператор в программе?
Я написал “не изучал” так как не изучал функции в книге, но я могу дать вам полный ответ в отношении их основанный на моём личном опыте и дурацких курсов.
Отредактировано py.user.next (Окт. 14, 2017 02:02:45)
Офлайн
Rodegast
Да, так и сделал. Пропустил эту главу.
Офлайн
py.user.next
Я просмотрел несколько обучающих видео уроков по основам программирования. Единственное что для себя открыл нового это термин “Структура данных” (я знал, что это такое, но не знал как называется) . А насчёт текста: я так написал из-за того что писал очень быстро т.к спешил, надо было отойти по собственным делам. В спешке пришла первая ассоциация объекта - экземпляр класса. Сейчас я попытаюсь вам изложить свои знания объекта: Объект - это отдельный тип данных который имеет специфические атрибуты, так же объект может ориентироваться в среде благодаря полиморфизму, а точнее с помощью перегрузки операторов, объект - это основа любого языка программирования, принцип типизаций строится на объектах и их поведениях, объект это “представитель” информации в программировании. В том сообщении изложены не все мои знания, а всего лишь их малейшая часть.
Отредактировано ron_1 (Окт. 14, 2017 18:41:42)
Офлайн
Сейчас достаточно попрактиковался на итераторах и классах и возник ещё один вопрос: Зачем создавать итератор из итерируемого объекта когда можно напрямую вызывать функцию 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)) # Без итератора не работает
Офлайн
ron_1Невнимательно читаешь ещё. Итерируемый объект - это не итератор. Итерируемый объект - это iterable, про который я писал в первом ответе этого топика. Раз уж ты не знаешь нифига, то итерируемый объект - это такой объект, у которого можно получить итератор. Список, например, является итерируемым объектом, но не является итератором. У него есть метод __iter__(), поэтому к нему можно применить функцию iter(); а функция iter() уже вернёт итератор, который будет получен из встроенного метода __iter__(). Внутри встроенного метода __iter__() этот итератор будет построен по внутренним (скрытым) правилам. Пойми одну вещь: список и итератор по этому списку - это два абсолютно разных объекта.
Зачем создавать итератор из итерируемого объекта когда можно напрямую вызывать функцию next(Итерируемый объект)?
>>> 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 >>>
Отредактировано py.user.next (Окт. 16, 2017 02:36:58)
Офлайн
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(экземпляр) возвращает сам экземпляр
Ну тогда вот тебе дополнительная информация для размышления
>>> 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
Офлайн
Rodegast
Дядя петя… Это уже древнегреческий пайтон, тут вторая ветка со своим старым стилем классов, где класс - это класс, а не тип. Да и у вас там как бы возврат итератора списка идёт, а не итератора пользовательского класса. Это какой-то новый паттерн делегирования?)
Офлайн