Инвариантность, ковариантность и контравариантность на примере Python

  Рет қаралды 22,740

Диджитализируй!

Диджитализируй!

Күн бұрын

Поговорим о насущном! Инвариантность, ковариантность и контравариантность на примере Python:)
0:00 Вариантность
3:01 Иерархия классов
5:06 Ковариантность
7:05 Инвариантность
10:32 Контравариантность
15:21 Резюме
Мой курс «Хардкорная веб-разработка» - course.to.digital
Книжный клуб:
botanim.to.digital/
botanim_to_digital_bot.t.me/
Telegram - t.me/t0digital
ВК - digitalize.team
RuTube - rutube.ru/channel/24802975/ab...
Дзен - dzen.ru/id/6235d32cb64df01e6e...

Пікірлер: 95
@user-jr3iv3ny9c
@user-jr3iv3ny9c Жыл бұрын
Браво, Алексей! Так филигранно завуалировать под видео о вариантности мысль что фронтэндеры не программисты - это достойно))) Шутка!
@bukanaka
@bukanaka Жыл бұрын
Ах ты ж бэкендер😂
@KoichiHub
@KoichiHub Жыл бұрын
При чем через ошибку, что программисты не фронтендеры
@alexdzehil7194
@alexdzehil7194 Жыл бұрын
Как Александр люто плюсую за алгоритм начисления зарплаты🤣
@P7Vagrant
@P7Vagrant Жыл бұрын
Я для простоты понимания зафиксировал себе так: 1. Инвариантность - стоим на месте (для ассоциации - на линии, inline). То есть указываем тип в коде и дальше этого типа никуда не можем двигаться. Представляем иерархию типа и мы на одной из точек, стоим на одной линии. 2. Ковариантность - можем двигаться по типам вниз по иерархии (Кова... - можно ассоциировать с Копать). 3. Контрвариантность - Двигаемся по типам вверх, к родителям типа (ассоциация - Контр, то есть противоположность, то есть как копать, только наоборот 😊). Возможно кому-то будет полезна такая заметка. P.S.: Спасибо за видео! Очень познавательно и доступно!
@chu_ri5470
@chu_ri5470 Жыл бұрын
Дополнение. Инвариантность не обязательно должна быть типовая. То есть, если у тебя есть переменная месяцДляОтпуска, то её значение не может быть отрицательным или 123. Только [0..12] Даже если речь о инте. Иначе лучше её как то переименовать и дополнительно пояснить. Более того попытка все типы обернуть в классы/enum/синтаксис приведёт вас к более страшным последствиям. Особенно в Питоне из-за не самой удобной работы с интерфейсами и наследованием.
@d1z3ro
@d1z3ro Жыл бұрын
Как будто-бы изменилась подача и, однозначно, в лучшую сторону! Лайк однозначно
@t0digital
@t0digital Жыл бұрын
Спасибооо!
@valk9819
@valk9819 Жыл бұрын
Круто, все четко без воды и с примерами. На пальцах показал за что лайк и питонячее спасибо.
@filippov_es
@filippov_es Жыл бұрын
Какая прелесть! Очень интересно, спасибо большое!
@OlViktorovich
@OlViktorovich Жыл бұрын
Прям актуально, типизация страшная сила ... Спасибо
@lukasmog777
@lukasmog777 4 ай бұрын
Спасибо за видос. Сидел читал википедию и какие-то статьи и была каша в голове была. После видоса сразу все встало на места.
@Keriokutori
@Keriokutori Жыл бұрын
контравариантность - это когда программист делает задачу, которую должен делать сотрудник. Как же это знакомо)))
@oguretsagressive
@oguretsagressive Ай бұрын
Это контрпродуктивность 😁
@alittlemoron4068
@alittlemoron4068 Жыл бұрын
Очень полезное видео. Вообще, я знал про все эти делегаты, контейнеры, но не представлял, что в питоне, таком необязательном для типизации языке, оно используется, и столкнулся с этим сразу на Generic'ах в TypeVar. Было очень послушать эту тему именно на примере питона
@user-pg8ry1tm3t
@user-pg8ry1tm3t Жыл бұрын
Спасибо за видео!
@samvelsafaryan4698
@samvelsafaryan4698 Жыл бұрын
Спасибо за такую работу. Можешь пожалуйста сделать обучающую видео как правильно реализовать идею. Например у меня часто бывает такое что теоретически правильно решил задачу, придумал правильный алгоритм но потом когда хочу писать код сижу перед компьютером часами и не знаю что делать.
@maksimkuznetsov2132
@maksimkuznetsov2132 21 күн бұрын
Привет, сидел на работе. Все было неплохо. И тут попалось это видео, и меня на середине вырубило. Очнулся через пару часов
@t0digital
@t0digital 21 күн бұрын
Что может быть лучше здорового послеобеденного сна!
@Maniakalochka
@Maniakalochka Жыл бұрын
Ничегошеньки не понял, но очень интересно)) Отложу видео на потом, сейчас не хватает знаний
@MadMike93
@MadMike93 Жыл бұрын
на предыдущей работе в тайп хинтах ковариативность использовали в модуле который конфиги грузил разных классов в зависимости от переменной окружения ENVIRONMENT))) ну тип был базовый класс и куча дочек local, dev, testing, test, stage prod)))
@moowmotors
@moowmotors Жыл бұрын
ТОП!
@user-pg8ry1tm3t
@user-pg8ry1tm3t Жыл бұрын
Этак, неявное преобразование типов для ссылок на иммутабельные структуры не работает… а если будет неконстант, также инвариант по ссылкам сохранится?..
@TheDeatgod
@TheDeatgod Жыл бұрын
Если в примере с инвариантностью я сделаю programmers_list = frontenders_list.copy(), то при добавлении элементов в любой из списков результат операции не отразится на втором списке. Очевидно, что frontenders_list и frontenders_list.copy() имеют один и тот же тип.
@MrNagios
@MrNagios Жыл бұрын
Good evening Ozzy
@DES2048
@DES2048 9 ай бұрын
Если очень простыми словами: Инвариантность - можно присвоить именно тот тип, который указан Ковариантность - тип и его потомков Контрвариантность - тип его и предков
@jamjam3337
@jamjam3337 Жыл бұрын
👏
@uicodeuz
@uicodeuz Жыл бұрын
Кайф
@VGCor
@VGCor Жыл бұрын
Типизация непростая тема. Никак не врублюсь почему типы раскиданы по модулям разным, когда есть вроде специальный typing. Нужен тебе какой, то по всему питону ищи... Тему видоса вообще понял только к резьюме 15:50 😂
@sad0FFsky
@sad0FFsky Жыл бұрын
Алексей, как попасть к вам на курс?когда он стартует?
@t0digital
@t0digital Жыл бұрын
Курс ещё не запущен. Подпишитесь на телеграм, там будет вся информация t.me/t0digital
@sad0FFsky
@sad0FFsky Жыл бұрын
@@t0digital а примерные сроки запуска известны?
@user-cw3ui3je5g
@user-cw3ui3je5g Жыл бұрын
Браво. Топ канал.
@JillOverlord
@JillOverlord Жыл бұрын
Пример для инвариантности заставил удивиться. Пальцы всегда сами бьют "from typing import List"... :)
@Skeap11
@Skeap11 Жыл бұрын
Возможно я не въехал, но кажется, что пример про контравариативность некорректный т.к. аннотация аргументов функция работает ковариативно т.к. task_for_employee принимает Employee и его наследников.
@user-vc2nf9cv8b
@user-vc2nf9cv8b 10 ай бұрын
тоже думаю об этом и ломаю голову........
@oguretsagressive
@oguretsagressive Ай бұрын
Все-таки корректный, просто здесь только аргумент "task" контравариантный (подходят функции со всем что выше по иерархии). Аргументы для "task_for_*" ковариантные ("Programmer" и ниже по иерархии).
@user-qs4fv5ui5j
@user-qs4fv5ui5j 7 ай бұрын
Разве инвариантность и контрвариантность не противоречат принципу подстановки Лисков?
@t0digital
@t0digital 7 ай бұрын
Неа. Если интересна тема, задайте вопрос конкретнее
@user-qs4fv5ui5j
@user-qs4fv5ui5j 7 ай бұрын
@@t0digital ну вот такое видел: Этот принцип говорит нам о том, что если класс Sub является подтипом класса Sup, тогда в программе объекты типа Sup должны легко заменяться объектами типа Sub без необходимости изменения кода. А Инвариантность нам по сути не дает подставлять дочерние подтипы
@oguretsagressive
@oguretsagressive Ай бұрын
@@user-qs4fv5ui5j в mutability дело. Если контейнер изменяемый, то происходит две подстановки - по принципу Лисков и в противоположную сторону. Переменные двух разных типов ссылаются на один контейнер. Поэтому если в переменную с более общим типом (Employee) добавим еще одного Employee, он появится и в переменной с более частным типом (Programmer), кто-то заставит этого Employee написать код - и опаньки.
@user-pg8ry1tm3t
@user-pg8ry1tm3t Жыл бұрын
А как же тензорный анализ🤪?..
@furrygem5176
@furrygem5176 Жыл бұрын
7:55 я думал он скажет "фронтендер не программист"
@Max-nr1bv
@Max-nr1bv Жыл бұрын
Есть какая литература по теме?
@t0digital
@t0digital Жыл бұрын
Об этом есть в «Python к вершинам мастерства», Лусиану Рамальо, 2 издание. Мы сейчас читаем ее в Ботаним
@user-pw6wo3se1n
@user-pw6wo3se1n Жыл бұрын
Ребятки! Меня всегда поражают "сюсюканье" и "щенячий восторг" многих "клепающих" свои комментарии, направленные в адрес автора того или иного видео, вне зависимости от того, на сколько доступно удалось автору объяснить рассматриваемые детали темы, а также, - вне зависимости от того, что полезного осталось в черепушках слушателей лекции, после ее окончания. Все это напоминает мне, - не то быль, не то анекдотическую байку о лекции офицера радиотехнически войск противовоздушной обороны в "сержантской учебке" подготавливающей специалистов- операторов РЛС (Радио-локационных станций) из числа солдат-призовников, вот только что принявших воискую присягу. Преподаватель, - капитан, вот уже третий день под ряд билсяся как та рыба об лед, пытаясь обяснить вчерашним школьным "троечникам", - что собой представляют: электрический заряд, поле заряда, потенциал, напряжение как разность потенциалов, электродвижущая сила (эдс), постоянный и переменный токи, электрические цепи, синусоидальная форма переменного тока, его частота, амплитуда, период, фазовые сдвиги, активные и реактивные сопротивления, электрические импульсы и их формы, ёмкость и индуктивность, добротность катушек индуктивности, электромагнитные волны - стоячие, бегущие и отраженные, линии с распределенными параметрами, а также, многое-многое другое, что эти "недоросли" должны бы усвоить еще в школе.А вот сейчас должны будут хотя бы немножко соображать, - обслуживая довольно-таки сложную и дорогостоящую технику, - как с ней работать, как проводить профилактические регламентные работы, как настраивать ее, и при этом еще и выявлять незначительные сбои в ее работе.. Окончив очередную лекцию на тему приемо-передающих антенн, капитан, глядя в абсолютно по-детски чистые, словно у младенцев, глаза слушателей, как и в конце предыдущих занятий произнёс одну и ту же фразу: "Вопросы будут? В ответ последовало гробовое молчание,... Но тут, - о чудо, из задних рядов поднялась чья-то рука - "Разрешите товарищ капитан? Тут абсолютно все понятно, вот только один вопрос, - непонятно, как такая большая амплитуда электрического тока в такой тоненький проводочек помещается?" Было ли это или нет.... Издевался ли придуриваясь, этот "салажонок" над капитаном или же действително был полным дебилом, - история умалчивает... Но вот мне кажется, судя по комментариям, что большинство так и не поняло, что это за термины такие мудреные: "Инвариантность", "Ковариантность" и "Контравариантность", - для чего они, и "с чем их едят"... А всего лишь из-за нечетко сформулированной автором этого видео, задачи по решению проблем с этими тремя факторами или понятиями, (считайте, как хотите). В общем, - все три эти понятия первоначально были приняты в математике. Затем постепенно перекочевали сначала в физику, а затем и в программирование,- как производную отрасль математических вычислений. Я бы к примеру, не использовал бы довольно аморфный пример с профессиональной деятельностью сотрудников. На мой взгляд, здесь гораздо сложнее увязывать понятия "сотрудник" с профессиями и специализациями штата работающих. Попытка привязать эти определения к листингам отдельных кусков программы, - для слушателей-новичков абсолютно ничего не говорит. А вот, если бы в дискуссию ввязались еще и программисты, - то тогда бы скорее всего, - лекция вообще бы переросла в длительный спор профессионалов о "правильности" и "неправильности" написания "кода" а для новичков это бы превратилось в продолжительное и абсолютно напрасное времяпровождение. Я вообще-то, как ветхий старик, - абсолютно не признаю это свободную "эквилибристику" из уже ранее принятыми понятиями и терминами. Под термином "код" - я понимаю кодироваеие в системах исчисления: двоичной, двоично-десятичной, восьмиричной и остальных, а также, - "кодирование" - как синоним шифрования. Все остальное для меня, - это исключительно программирование с листингами программ и блок-схемами определяющими различные алгоритмы, на сколько бы не усложнялись в настоящее время языки программирования... Хотя, я могу в чем-то и ошибаться, однако игра слов, определяющая тот или иной термин, на мой взгляд, только создает путаницу, ибо мне уже довелось в этих новых "сленгах" встречать англоязычные термины, заменившие другие, прежние старые, с абсолютно таким же названиями. А сейчас вернусь к теме определения и пояснения трех приведенных выше понятий. Я бы, к примеру, в подобной лекции прибег бы к задаче создания небольшой, даже элементарной, поисково-справочной базы данных с использованием библиотеки (в прямом смысле этого слова), состоящей из книг-учебных пособий (в цифровом формате) с классификацией этих книг по авторам, по жанрам в области вычислительной техники, по языкам программирования, по темам, оглавлениям, по отдельным определениям того или иного понятия и т.д. Попытки написания небольших листингов программ с постановкой членораздельной задачи по поиску той или другой темы в указанных книгах могли бы достаточно доходчиво и убедительно объяснить суть видеолекции. А так, по примитивным комментариям и не удалось узнать, принес ли указанный видеоурок хоть какую нибудь реальную помощь для обучающихся? Тем более, что в Интернете довольно кратко и доходчиво приведены определения всех трех терминов.
@t0digital
@t0digital Жыл бұрын
Спасибо за комментарий! Рекомендую разбивать текст на небольшие осмысленные абзацы - вероятность того, что кто-то их прочтёт, будет значительно выше.
@user-pw6wo3se1n
@user-pw6wo3se1n Жыл бұрын
@@t0digital Учту. Но согласитесь, что та Ваша лекция была не совсем удачной.
@t0digital
@t0digital Жыл бұрын
@@user-pw6wo3se1n нет, не соглашусь
@user-pw6wo3se1n
@user-pw6wo3se1n Жыл бұрын
@@t0digital Ну что же... Здесь может быть лишь один вывод: Что я гораздо глупее вас. А если, к тому же, окажется в действительности, что многие ваши слушатели и зрители реально, а не на словах, поняли вашу трактовку упомянутых терминов и им это поможет в дальнейшем, то мне остается только порадоваться ростками молодых талантов в зарослях нынешнего, почти сплошного невежества. Просто я привык гораздо сильнее "разжевавать" подаваемый материал, раз я за него взялся, и пытаться его преподать, как говорится, "на пальцах". Я у Вас это больше напоминало лекции Тимофея Хирьянова для студентов МФТИ.
@oguretsagressive
@oguretsagressive Ай бұрын
Осилил оба коммента, понял смысл слова "разжевывать" - усложнить, запутать, добавить воды, канцеляризмов и опечаток (или слов-паразитов, если лекция устная). Чтобы тот, кто изначально не понимал тему, не понял и в конце. Помню в универе самые "разжеванные" материалы как раз этими свойствами и отличались.
@guiterenzog2723
@guiterenzog2723 Жыл бұрын
Если честно, из-за частого повторения запутался. Что я понял: - инвариантность - про то, что в списки (сюда же кортежи) конкретного типа можно помещать объекты только этого типа (наследников нельзя) - ковариантность - про то, что последовательность конкретного типа может содержать объекты как этого типа, так и его наследников - контрвариантность - про то, что можно использовать сущность, предназначенную для конкретного типа, всеми родителями этого типа Корректно?
@t0digital
@t0digital Жыл бұрын
Списки, последовательности и прочее - это конкретные типы, а понятия инвариантности, ковариантности и контравариантности (вероятно в видео я несколько неправильно называл последние два) - абстрактные, то есть не привязаны к конкретным типам вроде листа или последовательности. Про что эти понятия. Вот есть класс Parent и есть его подтип Child, то есть Child определён как class Child(Parent). Понятия инвариантности, ковариантности и контравариантности про то, как более сложные типы, построенные из Parent и Child, относятся к этому наследованию Child от Parent. Более сложные типы это, например, последовательности, списки, Callable и пр. Ковариантность - более сложные типы наследуются в том же порядке, что и сами классы. Например, Sequence[Child] является подтипом Sequence[Parent]. Туда, где ожидается Sequence[Parent], можно передать Sequence[Child]. В обратную сторону это не работает. Инвариантность - более сложные типы никак не относятся к наследованию начальных типов. Нельзя идти ни вверх, ни вниз по иерархии. Например, list[Child] не является подтипом list[Parent], и list[Parent] не является подтипом list[Child]. Туда, где ожидается list[Parent], можно передать только list[Parent], а туда, где ожидается list[Child], можно передать только list[Child]. Контравариантность - более сложные типы наследуются в обратном порядке. Например, Callable[[Parent], None] является подтипом Callable[[Child], None]. Туда, где ожидается Callable[[Child], None], можно передать Callable[[Parent], None]. В обратную сторону это не работает.
@guiterenzog2723
@guiterenzog2723 Жыл бұрын
@@t0digital отличное объяснение, спасибо!
@stanislavserov8622
@stanislavserov8622 Жыл бұрын
Привет! Прошу снять что-то русскоязычное по Flet.
@t0digital
@t0digital Жыл бұрын
про это? flet.dev/
@stanislavserov8622
@stanislavserov8622 Жыл бұрын
@@t0digital да
@stanislavserov8622
@stanislavserov8622 Жыл бұрын
@@t0digital там они в документации написали что до конца года планируют сделать нечто expo, как для react, то есть что-то будет прям на мобилке просматриваться во время разработки и тд.
@t0digital
@t0digital Жыл бұрын
@@stanislavserov8622 не пользовался такой штукой и от мобильной разработки сейчас далек. Пожалуй, писал бы на Дарте напрямую на флатер, если бы занимался мобильной разработкой
@stanislavserov8622
@stanislavserov8622 Жыл бұрын
@@t0digital а по django unicorn можете что-то сказать? только сегодня узнал про это.. в рунете мало инфы
@stanislavkovalev2783
@stanislavkovalev2783 Жыл бұрын
Не петь, а пить )
@t0digital
@t0digital Жыл бұрын
Возмоооожно:)
@KoichiHub
@KoichiHub Жыл бұрын
В TypeScript проще работать с типами, чем в Python. Да и книжечка по тоньше - 'Профессиональный TypeScript' от Черного Бори
@t0digital
@t0digital Жыл бұрын
Да, TS лучше работает с типами
@user-pg8ry1tm3t
@user-pg8ry1tm3t Жыл бұрын
А может ли более узкая специализация класса вызывать перегруженное поведение базового класса? Что-то вроде виртуальных функций или имплементации интерфейсов?..
@t0digital
@t0digital Жыл бұрын
Не понял вопрос, к сожалению:)
@user-pg8ry1tm3t
@user-pg8ry1tm3t Жыл бұрын
@@t0digital просто есть ли какой механизм динамического или иного полиморфизма в питоне?)
@megaman13able
@megaman13able Жыл бұрын
@@user-pg8ry1tm3t кажется для этого есть оператор super
@mark_parker
@mark_parker 4 ай бұрын
@@user-pg8ry1tm3t super()
@proofit404
@proofit404 Жыл бұрын
Даже в примерах кода бэкендеры самые обделённые в зарплате WTF
@user-rw6vm5bs5g
@user-rw6vm5bs5g Жыл бұрын
На руках паныряй!))))) Спалено ;-)
@banzaika
@banzaika Жыл бұрын
Качество хорошеет, но долго
@user-kw4kp7eq9m
@user-kw4kp7eq9m Жыл бұрын
Я правильно понял, что в Питоне: Sequence - ковариантные, списки - инвариантные, а функции - контрвариантные?
@t0digital
@t0digital Жыл бұрын
Sequence это неизменяемая структура, поэтому она ковариантна по отношению к типам данных в ней. Списки инвариантны по отношению к типам в структуре. Функции (Callable, там могут быть вызываемые объекты тоже, не только функции) ковариантны по возвращаемому значению (об этом не было в видео, но это так) и контраварианты по аргументам
@aleksandrdevelopment3321
@aleksandrdevelopment3321 Жыл бұрын
Все очень круто) но откажись уже от пайтона)))
@t0digital
@t0digital Жыл бұрын
В пользу чего:)?
@aleksandrdevelopment3321
@aleksandrdevelopment3321 Жыл бұрын
@@t0digital C#/Java а если уж хочешь быть программистом то С++ %)
@oguretsagressive
@oguretsagressive Ай бұрын
@@aleksandrdevelopment3321 и что собираешься писать на C++?
@alexs8582
@alexs8582 Жыл бұрын
Почему пайтон, если питон?
@t0digital
@t0digital Жыл бұрын
Нэт, пайтон) язык назван в честь Монти Пайтон
@alexs8582
@alexs8582 Жыл бұрын
@@t0digital Понятно, "программисты бывают двух типов - те которые говорят питон и те кто программирует"))
@t0digital
@t0digital Жыл бұрын
@@alexs8582 да я не особо обращаю внимание на это:) мое произношение английских слов в любом случае так себе
@maybejke
@maybejke Жыл бұрын
все видео намеки на этих фронтеендеров, не программеров xDDD
@heisenberg6874
@heisenberg6874 Жыл бұрын
чувак работающий в компании с именем ян😊😊😊
@t0digital
@t0digital Жыл бұрын
Бедолага😂
@avpmk
@avpmk Жыл бұрын
Правильно говорить: "ковариантность" и "контравариантность". Вариантность, не вариативность.
@t0digital
@t0digital Жыл бұрын
Да
@zxw
@zxw Жыл бұрын
Понятнее к сожалению не стало😢
@jamuelsexon
@jamuelsexon Жыл бұрын
Уснул. Скучно.
@t0digital
@t0digital Жыл бұрын
Приятных снов!
@dogbusiness5201
@dogbusiness5201 7 ай бұрын
Спасибо за видео!
Всё об исключениях и работе с ними в Python
30:34
Диджитализируй!
Рет қаралды 48 М.
The Worlds Most Powerfull Batteries !
00:48
Woody & Kleiny
Рет қаралды 27 МЛН
Black Magic 🪄 by Petkit Pura Max #cat #cats
00:38
Sonyakisa8 TT
Рет қаралды 41 МЛН
IS THIS REAL FOOD OR NOT?🤔 PIKACHU AND SONIC CONFUSE THE CAT! 😺🍫
00:41
Инвариант в программировании
18:54
Управление знаниями с помощью Obsidian. Дмитрий Лаухин, Дима Черненьков
1:38:24
Ассоциация ориентированных на решение практиков
Рет қаралды 3,2 М.
Именование переменных, классов и методов в коде
25:40
#1. Читаем исходники open source Python библиотек. Loguru!
58:19
Диджитализируй!
Рет қаралды 89 М.
The Worlds Most Powerfull Batteries !
00:48
Woody & Kleiny
Рет қаралды 27 МЛН