Спасибо Сергей ! Этот курс по ООП более Новичко-Ориентированный ) Читаю комментарии и хочу сказать тем кто не понимает: ребята, до любого материала нужно созреть, вы же не расстраиваетесь когда клубника в огороде еще зеленая ) Просто нужно продолжать и всё придет 100 % !
не утешайте преподавателя ) к обратной связи надо прислушиваться, ну если она адекватная конечно, действительно не ясно, видимо, ключевых слов каких-то не хватает чтоб понять как сделать объект класса итерируемым. Ну что маг методы добавить понятно и без видео, а вот если это уже словарь или список, то исходя из видео уже не понятно как делать
Урок #19 = Пройден Ура, и еще раз ура. С магическими методами окончено 😁 В целом, было очень интересно узнать о них, и на что они все способны. Я прошел все стадии. Недопонимание, Отрицание, Гнев, Принятие. И даже соглашусь с популярным комментом ниже. Не вся инфа должна пониматься сразу. Все придет с опытом ) Фух, половина курса пройдена...летс гоу гайсы ко второй
Тут ОЧЕНЬ ВАЖНО понимать, что автор показал частный случай. Чтобы мы могли проитерироваться по объекту, должны быть выполнены два следующих условия: 1) Объект должен реализовывать метод `__iter__` 2) Полученный в результате метода `__iter__` объект должен реализовывать метод `__next__` То есть совсем не обязательно, чтобы класс реализовывал сразу два этих метода. Главное соблюсти соглашение: возможность передать объект в функцию `iter()` и возможность передать результат этой функции в функцию `next()` и всё. Пример 'самостоятельного' класса-итератора: class Iterator: def __init__(self): self.count = 0 def __iter__(self): return self def __next__(self): self.count += 1 if self.count > 10: raise StopIteration return self.count # Output: 1 2 3 4 5 6 7 8 9 10 for i in Iterator(): print(i, end=" ") Пример 'не самостоятельного' класса-итератора: class Iterator: def __iter__(self): return IteratorAddition()
class IteratorAddition: def __init__(self): self.count = 0 def __next__(self): self.count += 1 if self.count > 10: raise StopIteration return self.count # Output: 1 2 3 4 5 6 7 8 9 10 for i in Iterator(): print(i, end=" ")
Сергей, я нашел один недочет в видео. Я несколько раз пересмотрел этот урок и проработал его в пайчарм. Вот что я нашел: Когда мы будем перебирать наш экземпляр класса FRange, то успешно переберем наш экземпляр. Но вот значение нашего счетчика (self.value) мы не обнулили. Понятно, что при следующем переборе экз. в цикле, мы автоматически вызовем ____iter__ и value обнулится. Но если по логике программы нам нужно будет использовать этот же экз. но в "свежем виде", то обнуление value при возникновении StopIteration тоже нужно было предусмотреть.
А в целом, я очень благодарен вам за этот урок, я долго ждал, когда дойду до него и в тоже время боялся потому, что мне тема перебора была очень непонятна. Спасибо вам за ваш труд!
да, все верно, FRange работает, как и обычный генератор, там все то же самое, мы его можем перебрать только один раз, если хотим снова, то нужно опять инициализировать
Здравствуйте, Сергей! Наверное, в функции __next__ класса FRange2D вместо iter(self.fr) можно просто вернуть self.fr. Спасибо за очередной прекрасный урок!
а почему на 04:45 в консоли мы получили аутпут следующего вида?: 1) адрес и название запущенной программы 2) текст ошибки 3) вывод данных кода, который не вызывает возмущения среды разработки. Если точнее, то суть вопроса такова: почему ошибка в консоли находится выше выведенных без ошибки данных, хотя в коде строчка, спровоцировавшая ошибку идёт после беспроблемных строчек?
указав self.value внутри __iter__ будем получать ошибку при попытке получить следующее значение через print(next(...)). решается переносом self.value в __init__, да и в принципе более логично задать значение при создании объекта класса
Здраствуйте! Посмотрел это видео несколько раз, и все было понятно. Но где-то на шестой раз возник вопрос: почему цикл for перебирает итератор на основе класса FRange не до упора? То есть, не поднимается исключение StopIteration.
На самом деле проверяет "до упора" )) Просто там встроен обработчик исключений и, как только возникает StopIteration цикл for завершает перебор. Благодаря обработке этого исключения мы его не видим и программа продолжает работать.
Впервые знакомлюсь с ООП по Вашим видео. Дошел до #11 Дескрипторы, все супер! Далее разбираются исключительно магические методы. Мне для первого знакомства с ООП нужно разбирать приведенные методы, или будет лучше изучить более общие вопросы ООП (полиморфизм, наследование и т.д.), а уже после углубляться в различные методы?
Кто подскажет, почему когда передаешь step 0.1 получаются похожие на это 0.30000000000000004 значения с разным интервалами? Обычный range не принимает за step вещественные числа, но если вызвать arange в numpe и передать за шаг 0.1 результат будет такой же как и в начале. Не могу понять почему так происходит.
Не пойму, __iter__ без __next__ не работает получается что ли? Записал в пайчарм метод __iter__ и перебрал объект класса через for. Выдает ошибку, что объект неитерируемый
Серёга ни фига не секу в программировании , но как это работает в реальной жизни, зачем это нужно числа там с шагом и итерирование . это просто сокращает время на вычисления и написание кода , или что это делает ?
Здравствуйте, Сергей. Почему, к примеру, в методе __len__ мы можем вызывать функцию len() и эта функция не будет рекурсивно вызывать метод, а если в __iter__ вызвать функцию iter(), то будет бесконечная рекурсия?
@@selfedu_rus так и есть, но почему так происходит с одними функциями, а с другими нет? А хотя я просто неправильно записал реализацию метода, рекурсии таки нет, но существуют ли функции которые неявно вызывают соответствующие методы, когда рекурсия убивает программу? И еще вопрос, зачем в __iter__ возвращать сам объект, когда должны итератор?
@@vladsnisar2207 В данном случае в качестве итератора выступает сам объект. А рекурсии неявно возникают, но очень редко. Если такое произойдет, вы сразу увидите )
@@selfedu_rus это я вижу и понимаю, но мне казалось, что он должен делать дополнительную строку между каждой выводимой строкой. Но судя по всему он просто переводит каретку на новую строку, делая четыре строчки вместо одной
Не совсем понимаю конструкцию "return self". По сути self является ссылкой на объект, а на что ссылается в данном случае self? Кортеж или список тех переменных, которые находятся в методе init?
Но даже если нет функции __iter__ , по сути fr имеет метод __next__ и является итерируемым объектом ? Или в этот момент он не является итератором из за отсутствия функции iter?
итераторы - универсальный механизм перебора итерируемых последовательностей, даже тех, которые будут придуманы в будущем и на данный момент отсутствуют
@@selfedu_rus А как программа понимает, что именно это значение итерируется? Я думал, что они смотрят на некие зарезервированные переменные. Например там есть step, stop, start. Но выводит именно value. Я про метод __iter__ , где передается объект. В методе __next__ понятно, там передается само значение value.
То есть получается мы можем перебирать элементы fr с помощью функции __next__ но при этом ( пока не прописана функция iter) наш объект будет итерируемым, но не являться итератором? А чтобы перебрать его в цикле for , то объект должен быть обязательно итератором, для чего и прописывается функция iter?
не пойму где, но где то мои выводы ошибочны 1. все в питоне обьекты и некоторые обьекты имеют встроеную функцию(строки, списки и т.д.) __iter__ а некоторые нет(числа)? 2. в цикле for iter превращает наш экземпляр в итерируемый обьект. И если созданые нами классы не имеют __iter__ то они не воспринимаются функцией next. 3. Так что же по сути делает iter показывает для next что это обьект можно перебирать (Эй, этот обьект я вернула его с ним можно работать) ставя на нем значек итерабельный обьект. 4. Может ли еще кто либо использовать результаты функции iter кроме функции next ? 5. почему бы не сделать эту проверку функции next. Зачем такая сложность в питоне?
Итератор следует воспринимать, как универсальный механизм для перебора итерированных объектов - это его главное назначение. Например, в будущем, любой пользователь может создать новый, свой собственный итерируемый объект, который автоматически можно будет перебирать через итератор, например, с помощью цикла for. Это такой паттерн проектирования.
@@selfedu_rus спасибо за обьяснение. Как пользоваться этим всем примерно понял. Думаю со временем дойдет зачем создатели питона сделали две отдельных функции(iter и next) а не одну общуюю
Эх, как же путанно все объясняют итераторы : ( Говорится, что поведение нашего объекта FRange повторяется, похоже на поведение обычного объекта range. При этом реально демонстрируется другой принцип работы...
@@selfedu_rus Сергей, я с огромным уважением отношусь к вашему творчеству. Но это просто крик души... Представим, что я первый раз вижу итераторы. Мне говорят, что вот это вот работает подобно встроенному ренджу. Я буру объект встроенного ренджа. Смотрю его методы и в нём нет метода __next__ ! Вопрос, почему ?? Ведь в примере я вижу iter и next...
Здравствуйте Сергей!Спасибо вам огромное за ваш курс, вы лучший преподователь!!
if Sergey == Best Teacher:
print('Sergey Best Teacher')
else:
print('Sergey is still the best Teacher')
@@tm_workout Спасибо за ваш курс я его уже дохожу и буду начинать по Data science и надеюсь научится писать торговых роботов) Мне 14.
Спасибо Сергей ! Этот курс по ООП более Новичко-Ориентированный )
Читаю комментарии и хочу сказать тем кто не понимает: ребята, до любого материала нужно созреть, вы же не расстраиваетесь когда клубника в огороде еще зеленая ) Просто нужно продолжать и всё придет 100 % !
не утешайте преподавателя ) к обратной связи надо прислушиваться, ну если она адекватная конечно, действительно не ясно, видимо, ключевых слов каких-то не хватает чтоб понять как сделать объект класса итерируемым. Ну что маг методы добавить понятно и без видео, а вот если это уже словарь или список, то исходя из видео уже не понятно как делать
@@and_energy Не совсем понял, про словарь и список. Попробуйте точней задать вопрос. Мб я знаю ответ.
спасибо за урок! Если вдруг кто-то не знал, чтобы продублировать строчку в pycharm, достаточно нажать комбинацию клавиш ctrl + d)
Урок #19 = Пройден
Ура, и еще раз ура. С магическими методами окончено 😁
В целом, было очень интересно узнать о них, и на что они все способны. Я прошел все стадии. Недопонимание, Отрицание, Гнев, Принятие. И даже соглашусь с популярным комментом ниже. Не вся инфа должна пониматься сразу. Все придет с опытом )
Фух, половина курса пройдена...летс гоу гайсы ко второй
Метод __iter__ возвращает сам объект?😯 так просто? Офигенно... 🤓Спасибо за мое прозрение!😇
Тут ОЧЕНЬ ВАЖНО понимать, что автор показал частный случай.
Чтобы мы могли проитерироваться по объекту, должны быть выполнены два следующих условия:
1) Объект должен реализовывать метод `__iter__`
2) Полученный в результате метода `__iter__` объект должен реализовывать метод `__next__`
То есть совсем не обязательно, чтобы класс реализовывал сразу два этих метода. Главное соблюсти соглашение: возможность передать объект в функцию `iter()` и возможность передать результат этой функции в функцию `next()` и всё.
Пример 'самостоятельного' класса-итератора:
class Iterator:
def __init__(self):
self.count = 0
def __iter__(self):
return self
def __next__(self):
self.count += 1
if self.count > 10:
raise StopIteration
return self.count
# Output: 1 2 3 4 5 6 7 8 9 10
for i in Iterator():
print(i, end=" ")
Пример 'не самостоятельного' класса-итератора:
class Iterator:
def __iter__(self):
return IteratorAddition()
class IteratorAddition:
def __init__(self):
self.count = 0
def __next__(self):
self.count += 1
if self.count > 10:
raise StopIteration
return self.count
# Output: 1 2 3 4 5 6 7 8 9 10
for i in Iterator():
print(i, end=" ")
Вы просто святой! Это гениальное объяснение!
Спасибо. Все понятно. Хороший пример.
Сергей, я нашел один недочет в видео. Я несколько раз пересмотрел этот урок и проработал его в пайчарм. Вот что я нашел: Когда мы будем перебирать наш экземпляр класса FRange, то успешно переберем наш экземпляр. Но вот значение нашего счетчика (self.value) мы не обнулили. Понятно, что при следующем переборе экз. в цикле, мы автоматически вызовем ____iter__ и value обнулится. Но если по логике программы нам нужно будет использовать этот же экз. но в "свежем виде", то обнуление value при возникновении StopIteration тоже нужно было предусмотреть.
А в целом, я очень благодарен вам за этот урок, я долго ждал, когда дойду до него и в тоже время боялся потому, что мне тема перебора была очень непонятна. Спасибо вам за ваш труд!
да, все верно, FRange работает, как и обычный генератор, там все то же самое, мы его можем перебрать только один раз, если хотим снова, то нужно опять инициализировать
Урок - класс!!! Спасибо!
хороша подача матеріалу!
а можно пожалуйста ссылку на видео, где не в рамках ооп разбирались итераторы?
Лайк прожал
лучший
Спасибо за видео. Хотелось бы увидеть как реализовать FRange(), FRange(10), FRange(1, 10), FRange(10, 1) и
Здравствуйте Сергей!
Есть ли у Вас планы на создание контента по асинхронному программированию на Python?
пока нет
Здравствуйте, Сергей! Наверное, в функции __next__ класса FRange2D вместо iter(self.fr) можно просто вернуть self.fr.
Спасибо за очередной прекрасный урок!
Да, совершенно верно! Я, скорее, записал в общем виде, просто не всегда можно возвращать сам объект класса.
Спасибо за видео !
а почему на 04:45 в консоли мы получили аутпут следующего вида?:
1) адрес и название запущенной программы
2) текст ошибки
3) вывод данных кода, который не вызывает возмущения среды разработки.
Если точнее, то суть вопроса такова: почему ошибка в консоли находится выше выведенных без ошибки данных, хотя в коде строчка, спровоцировавшая ошибку идёт после беспроблемных строчек?
вывод ошибок выполняется в отдельный поток ошибок, поэтому она может выводиться и до и после успешного вывода программы
Спасибо!
указав self.value внутри __iter__ будем получать ошибку при попытке получить следующее значение через print(next(...)).
решается переносом self.value в __init__, да и в принципе более логично задать значение при создании объекта класса
спасибо
Здраствуйте! Посмотрел это видео несколько раз, и все было понятно. Но где-то на шестой раз возник вопрос: почему цикл for перебирает итератор на основе класса FRange не до упора? То есть, не поднимается исключение StopIteration.
На самом деле проверяет "до упора" )) Просто там встроен обработчик исключений и, как только возникает StopIteration цикл for завершает перебор. Благодаря обработке этого исключения мы его не видим и программа продолжает работать.
Впервые знакомлюсь с ООП по Вашим видео. Дошел до #11 Дескрипторы, все супер! Далее разбираются исключительно магические методы. Мне для первого знакомства с ООП нужно разбирать приведенные методы, или будет лучше изучить более общие вопросы ООП (полиморфизм, наследование и т.д.), а уже после углубляться в различные методы?
на следующем уроке наследование начнется, а магические методы нужно знать при программировании на Python
@@selfedu_rus спасибо большое что находите время ответить! Жду Ваших уроков с нетерпением!
спасибо!
честно, не хватает обьяснения после 8:30 когда мы делаем к примеру: return self и после, очень плохо понятно
Кто подскажет, почему когда передаешь step 0.1 получаются похожие на это 0.30000000000000004 значения с разным интервалами? Обычный range не принимает за step вещественные числа, но если вызвать arange в numpe и передать за шаг 0.1 результат будет такой же как и в начале. Не могу понять почему так происходит.
округление вещественных чисел, чтобы от этого избавиться можно использовать функцию round
Не пойму, __iter__ без __next__ не работает получается что ли? Записал в пайчарм метод __iter__ и перебрал объект класса через for. Выдает ошибку, что объект неитерируемый
Это как пытатся ехать на машине без колес, вроде и машина, но не едет. В next описываются ваши правила\инструкции как перебирать экземпляр класса
Серёга ни фига не секу в программировании , но как это работает в реальной жизни, зачем это нужно числа там с шагом и итерирование . это просто сокращает время на вычисления и написание кода , или что это делает ?
перебор тех-же данных к примеру, но вы слишком далёкую тему затронули как для - не секущего в программировании) без базы
я же правильно понимаю, что перенос self.velue в метод __iter__ не принципиальный момент, но просто не логичнее ли его оставить в __init__?
создать атрибут value лучше в инит, а в iter должна быть инициализация начальным значением
Здравствуйте, Сергей. Почему, к примеру, в методе __len__ мы можем вызывать функцию len() и эта функция не будет рекурсивно вызывать метод, а если в __iter__ вызвать функцию iter(), то будет бесконечная рекурсия?
Наверное вы в __iter__ вызываете iter(), вот и получается рекурсия.
@@selfedu_rus так и есть, но почему так происходит с одними функциями, а с другими нет? А хотя я просто неправильно записал реализацию метода, рекурсии таки нет, но существуют ли функции которые неявно вызывают соответствующие методы, когда рекурсия убивает программу? И еще вопрос, зачем в __iter__ возвращать сам объект, когда должны итератор?
@@vladsnisar2207 В данном случае в качестве итератора выступает сам объект. А рекурсии неявно возникают, но очень редко. Если такое произойдет, вы сразу увидите )
12:25 явно видно, что между строками нет пустой строки, почему не сработал print() после цикла for x in row ?
print() находится внутри первого цикла (см. по отступам справа)
@@selfedu_rus это я вижу и понимаю, но мне казалось, что он должен делать дополнительную строку между каждой выводимой строкой. Но судя по всему он просто переводит каретку на новую строку, делая четыре строчки вместо одной
@@АлексейАлексеев-ц8х9т у предыдущего print() прописан аргумент end="", т.е. он не делает перевода стоки
Не совсем понимаю конструкцию "return self". По сути self является ссылкой на объект, а на что ссылается в данном случае self? Кортеж или список тех переменных, которые находятся в методе init?
self - объект класса, это как строка - объект класса str
👍
Но даже если нет функции __iter__ , по сути fr имеет метод __next__ и является итерируемым объектом ? Или в этот момент он не является итератором из за отсутствия функции iter?
Я просто не понимаю next мы можем применять , а цикл for где используется итератор - нет
@@teacherit5840 цикл for неявно вызывает iter, а затем next
вообще нифига непонятно зачем нужны итераторы и когда они применяются, но за видос спасибо)
итераторы - универсальный механизм перебора итерируемых последовательностей, даже тех, которые будут придуманы в будущем и на данный момент отсутствуют
Ну когда циклы будешь крутить тогда поймёшь😁Сергей немного сложновато объясняет
я после 8 минуты уже запутался
Обязательно значение в итерируемом классе должно называться self.value? Что если указать self.number или self.kolichestvo ?
конечно, любое
@@selfedu_rus А как программа понимает, что именно это значение итерируется? Я думал, что они смотрят на некие зарезервированные переменные. Например там есть step, stop, start. Но выводит именно value. Я про метод __iter__ , где передается объект. В методе __next__ понятно, там передается само значение value.
@@pashamix оно возвращается методом next()
То есть получается мы можем перебирать элементы fr с помощью функции __next__ но при этом ( пока не прописана функция iter) наш объект будет итерируемым, но не являться итератором? А чтобы перебрать его в цикле for , то объект должен быть обязательно итератором, для чего и прописывается функция iter?
да, потому что for вызывает iter. а если его в классе нет, то ошибка получается
self.value должен стоять в конструкторе класса, иначе при вызове последовательности через next произойдет ошибка
в инициализаторе это и прописано
не пойму где, но где то мои выводы ошибочны
1. все в питоне обьекты и некоторые обьекты имеют встроеную функцию(строки, списки и т.д.) __iter__ а некоторые нет(числа)?
2. в цикле for iter превращает наш экземпляр в итерируемый обьект. И если созданые нами классы не имеют __iter__ то они не воспринимаются функцией next.
3. Так что же по сути делает iter показывает для next что это обьект можно перебирать (Эй, этот обьект я вернула его с ним можно работать) ставя на нем значек итерабельный обьект.
4. Может ли еще кто либо использовать результаты функции iter кроме функции next ?
5. почему бы не сделать эту проверку функции next. Зачем такая сложность в питоне?
iter() возвращает итератор, а не объект (иногда объект = итератор, но не всегда), соответственно next() перебирает указанный итератор
@@selfedu_rus Может ли еще где либо использоваться результаты функции iter кроме функции next ?
@@selfedu_rus а чем self перед прохождением через __iter__ отличается от self который возвращает __iter__ .
Итератор следует воспринимать, как универсальный механизм для перебора итерированных объектов - это его главное назначение. Например, в будущем, любой пользователь может создать новый, свой собственный итерируемый объект, который автоматически можно будет перебирать через итератор, например, с помощью цикла for. Это такой паттерн проектирования.
@@selfedu_rus спасибо за обьяснение. Как пользоваться этим всем примерно понял. Думаю со временем дойдет зачем создатели питона сделали две отдельных функции(iter и next) а не одну общуюю
Эх, как же путанно все объясняют итераторы : (
Говорится, что поведение нашего объекта FRange повторяется, похоже на поведение обычного объекта range. При этом реально демонстрируется другой принцип работы...
Дерзайте! :)))
@@selfedu_rus Сергей, я с огромным уважением отношусь к вашему творчеству. Но это просто крик души...
Представим, что я первый раз вижу итераторы. Мне говорят, что вот это вот работает подобно встроенному ренджу.
Я буру объект встроенного ренджа. Смотрю его методы и в нём нет метода __next__ ! Вопрос, почему ?? Ведь в примере я вижу iter и next...
@@mantrida Не, я совершенно искренне сказал, без каких-либо обид! ) В целом, вы правы, наверное стоило поподробнее раскрыть...
«До полутора» только правильно, а не «До полтора» :)
4расава
Пили исчо!!!1
очень плохой и неочевидный пример подобран.