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

Поделиться
HTML-код
  • Опубликовано: 27 ноя 2024

Комментарии • 91

  • @АртёмМеньшиков-о8х

    Браво, Алексей! Так филигранно завуалировать под видео о вариантности мысль что фронтэндеры не программисты - это достойно))) Шутка!

    • @bukanaka
      @bukanaka Год назад +1

      Ах ты ж бэкендер😂

    • @KoichiHub
      @KoichiHub Год назад

      При чем через ошибку, что программисты не фронтендеры

  • @P7Vagrant
    @P7Vagrant Год назад +5

    Я для простоты понимания зафиксировал себе так:
    1. Инвариантность - стоим на месте (для ассоциации - на линии, inline). То есть указываем тип в коде и дальше этого типа никуда не можем двигаться. Представляем иерархию типа и мы на одной из точек, стоим на одной линии.
    2. Ковариантность - можем двигаться по типам вниз по иерархии (Кова... - можно ассоциировать с Копать).
    3. Контрвариантность - Двигаемся по типам вверх, к родителям типа (ассоциация - Контр, то есть противоположность, то есть как копать, только наоборот 😊).
    Возможно кому-то будет полезна такая заметка.
    P.S.: Спасибо за видео! Очень познавательно и доступно!

    • @chu_ri5470
      @chu_ri5470 Год назад +1

      Дополнение.
      Инвариантность не обязательно должна быть типовая. То есть, если у тебя есть переменная месяцДляОтпуска, то её значение не может быть отрицательным или 123. Только [0..12] Даже если речь о инте. Иначе лучше её как то переименовать и дополнительно пояснить.
      Более того попытка все типы обернуть в классы/enum/синтаксис приведёт вас к более страшным последствиям. Особенно в Питоне из-за не самой удобной работы с интерфейсами и наследованием.

  • @alexdzehil7194
    @alexdzehil7194 Год назад +12

    Как Александр люто плюсую за алгоритм начисления зарплаты🤣

  • @valk9819
    @valk9819 Год назад +1

    Круто, все четко без воды и с примерами. На пальцах показал за что лайк и питонячее спасибо.

  • @d1z3ro
    @d1z3ro Год назад +15

    Как будто-бы изменилась подача и, однозначно, в лучшую сторону! Лайк однозначно

  • @lukasmog777
    @lukasmog777 9 месяцев назад +1

    Спасибо за видос. Сидел читал википедию и какие-то статьи и была каша в голове была. После видоса сразу все встало на места.

  • @OlViktorovich
    @OlViktorovich Год назад +5

    Прям актуально, типизация страшная сила ... Спасибо

  • @filippov_es
    @filippov_es Год назад +3

    Какая прелесть! Очень интересно, спасибо большое!

  • @Keriokutori
    @Keriokutori Год назад +9

    контравариантность - это когда программист делает задачу, которую должен делать сотрудник. Как же это знакомо)))

    • @oguretsagressive
      @oguretsagressive 7 месяцев назад +1

      Это контрпродуктивность 😁

  • @alittlemoron4068
    @alittlemoron4068 Год назад +4

    Очень полезное видео. Вообще, я знал про все эти делегаты, контейнеры, но не представлял, что в питоне, таком необязательном для типизации языке, оно используется, и столкнулся с этим сразу на Generic'ах в TypeVar. Было очень послушать эту тему именно на примере питона

  • @DES2048
    @DES2048 Год назад

    Если очень простыми словами:
    Инвариантность - можно присвоить именно тот тип, который указан
    Ковариантность - тип и его потомков
    Контрвариантность - тип его и предков

  • @maksimkuznetsov2132
    @maksimkuznetsov2132 6 месяцев назад

    Привет, сидел на работе. Все было неплохо.
    И тут попалось это видео, и меня на середине вырубило. Очнулся через пару часов

    • @t0digital
      @t0digital  6 месяцев назад +1

      Что может быть лучше здорового послеобеденного сна!

  • @Maniakalochka
    @Maniakalochka Год назад +2

    Ничегошеньки не понял, но очень интересно))
    Отложу видео на потом, сейчас не хватает знаний

  • @samvelsafaryan4698
    @samvelsafaryan4698 Год назад +2

    Спасибо за такую работу. Можешь пожалуйста сделать обучающую видео как правильно реализовать идею. Например у меня часто бывает такое что теоретически правильно решил задачу, придумал правильный алгоритм но потом когда хочу писать код сижу перед компьютером часами и не знаю что делать.

  • @КириллЧе-я5ы
    @КириллЧе-я5ы Год назад

    Спасибо за видео!

  • @MrNagios
    @MrNagios Год назад

    Good evening Ozzy

  • @IvanFedulov
    @IvanFedulov 21 день назад

    питон с запущенным где-то сбоку надсмотрщиком за типами не самый удачный вариант для демонстрации (как и связка js с ts, например). c одной стороны в IDE демонстрируются ошибки компиляции и тут же следом вывод в консоли где мы видим что "неправильные" элементы в список добавились. а еще realize не переводится на русский как "реализовывать".

    • @t0digital
      @t0digital  21 день назад

      1) Питон и JS/TS два наиболее популярных языка сейчас, поэтому показываю на них. 2) Англ не родной, как и для аудитории здесь, поэтому похуй.

  • @СергейСеливерстов-р8ш

    Браво. Топ канал.

  • @moowmotors
    @moowmotors Год назад

    ТОП!

  • @JillOverlord
    @JillOverlord Год назад

    Пример для инвариантности заставил удивиться. Пальцы всегда сами бьют "from typing import List"... :)

  • @ВкторСтаховский

    Ребятки! Меня всегда поражают "сюсюканье" и "щенячий восторг" многих "клепающих" свои комментарии, направленные в адрес автора того или иного видео, вне зависимости от того, на сколько доступно удалось автору объяснить рассматриваемые детали темы, а также, - вне зависимости от того, что полезного осталось в черепушках слушателей лекции, после ее окончания.
    Все это напоминает мне, - не то быль, не то анекдотическую байку о лекции офицера радиотехнически войск противовоздушной обороны в "сержантской учебке" подготавливающей специалистов- операторов РЛС (Радио-локационных станций) из числа солдат-призовников, вот только что принявших воискую присягу.
    Преподаватель, - капитан, вот уже третий день под ряд билсяся как та рыба об лед, пытаясь обяснить вчерашним школьным "троечникам", - что собой представляют: электрический заряд, поле заряда, потенциал, напряжение как разность потенциалов, электродвижущая сила (эдс), постоянный и переменный токи, электрические цепи, синусоидальная форма переменного тока, его частота, амплитуда, период, фазовые сдвиги, активные и реактивные сопротивления, электрические импульсы и их формы, ёмкость и индуктивность, добротность катушек индуктивности, электромагнитные волны - стоячие, бегущие и отраженные, линии с распределенными параметрами, а также, многое-многое другое, что эти "недоросли" должны бы усвоить еще в школе.А вот сейчас должны будут хотя бы немножко соображать, - обслуживая довольно-таки сложную и дорогостоящую технику, - как с ней работать, как проводить профилактические регламентные работы, как настраивать ее, и при этом еще и выявлять незначительные сбои в ее работе..
    Окончив очередную лекцию на тему приемо-передающих антенн, капитан, глядя в абсолютно по-детски чистые, словно у младенцев, глаза слушателей, как и в конце предыдущих занятий произнёс одну и ту же фразу: "Вопросы будут? В ответ последовало гробовое молчание,... Но тут, - о чудо, из задних рядов поднялась чья-то рука - "Разрешите товарищ капитан? Тут абсолютно все понятно, вот только один вопрос, - непонятно, как такая большая амплитуда электрического тока в такой тоненький проводочек помещается?"
    Было ли это или нет.... Издевался ли придуриваясь, этот "салажонок" над капитаном или же действително был полным дебилом, - история умалчивает...
    Но вот мне кажется, судя по комментариям, что большинство так и не поняло, что это за термины такие мудреные: "Инвариантность", "Ковариантность" и "Контравариантность", - для чего они, и "с чем их едят"... А всего лишь из-за нечетко сформулированной автором этого видео, задачи по решению проблем с этими тремя факторами или понятиями, (считайте, как хотите).
    В общем, - все три эти понятия первоначально были приняты в математике. Затем постепенно перекочевали сначала в физику, а затем и в программирование,- как производную отрасль математических вычислений.
    Я бы к примеру, не использовал бы довольно аморфный пример с профессиональной деятельностью сотрудников. На мой взгляд, здесь гораздо сложнее увязывать понятия "сотрудник" с профессиями и специализациями штата работающих.
    Попытка привязать эти определения к листингам отдельных кусков программы, - для слушателей-новичков абсолютно ничего не говорит. А вот, если бы в дискуссию ввязались еще и программисты, - то тогда бы скорее всего, - лекция вообще бы переросла в длительный спор профессионалов о "правильности" и "неправильности" написания "кода" а для новичков это бы превратилось в продолжительное и абсолютно напрасное времяпровождение. Я вообще-то, как ветхий старик, - абсолютно не признаю это свободную "эквилибристику" из уже ранее принятыми понятиями и терминами. Под термином "код" - я понимаю кодироваеие в системах исчисления: двоичной, двоично-десятичной, восьмиричной и остальных, а также, - "кодирование" - как синоним шифрования.
    Все остальное для меня, - это исключительно программирование с листингами программ и блок-схемами определяющими различные алгоритмы, на сколько бы не усложнялись в настоящее время языки программирования... Хотя, я могу в чем-то и ошибаться, однако игра слов, определяющая тот или иной термин, на мой взгляд, только создает путаницу, ибо мне уже довелось в этих новых "сленгах" встречать англоязычные термины, заменившие другие, прежние старые, с абсолютно таким же названиями.
    А сейчас вернусь к теме определения и пояснения трех приведенных выше понятий.
    Я бы, к примеру, в подобной лекции прибег бы к задаче создания небольшой, даже элементарной, поисково-справочной базы данных с использованием библиотеки (в прямом смысле этого слова), состоящей из книг-учебных пособий (в цифровом формате) с классификацией этих книг по авторам, по жанрам в области вычислительной техники, по языкам программирования, по темам, оглавлениям, по отдельным определениям того или иного понятия и т.д. Попытки написания небольших листингов программ с постановкой членораздельной задачи по поиску той или другой темы в указанных книгах могли бы достаточно доходчиво и убедительно объяснить суть видеолекции.
    А так, по примитивным комментариям и не удалось узнать, принес ли указанный видеоурок хоть какую нибудь реальную помощь для обучающихся? Тем более, что в Интернете довольно кратко и доходчиво приведены определения всех трех терминов.

    • @t0digital
      @t0digital  Год назад +1

      Спасибо за комментарий! Рекомендую разбивать текст на небольшие осмысленные абзацы - вероятность того, что кто-то их прочтёт, будет значительно выше.

    • @ВкторСтаховский
      @ВкторСтаховский Год назад

      @@t0digital Учту. Но согласитесь, что та Ваша лекция была не совсем удачной.

    • @t0digital
      @t0digital  Год назад +1

      @@ВкторСтаховский нет, не соглашусь

    • @ВкторСтаховский
      @ВкторСтаховский Год назад

      @@t0digital Ну что же... Здесь может быть лишь один вывод: Что я гораздо глупее вас.
      А если, к тому же, окажется в действительности, что многие ваши слушатели и зрители реально, а не на словах, поняли вашу трактовку упомянутых терминов и им это поможет в дальнейшем, то мне остается только порадоваться ростками молодых талантов в зарослях нынешнего, почти сплошного невежества.
      Просто я привык гораздо сильнее "разжевавать" подаваемый материал, раз я за него взялся, и пытаться его преподать, как говорится, "на пальцах".
      Я у Вас это больше напоминало лекции Тимофея Хирьянова для студентов МФТИ.

    • @oguretsagressive
      @oguretsagressive 7 месяцев назад

      Осилил оба коммента, понял смысл слова "разжевывать" - усложнить, запутать, добавить воды, канцеляризмов и опечаток (или слов-паразитов, если лекция устная). Чтобы тот, кто изначально не понимал тему, не понял и в конце. Помню в универе самые "разжеванные" материалы как раз этими свойствами и отличались.

  • @uicodeuz
    @uicodeuz Год назад +2

    Кайф

  • @MadMike93
    @MadMike93 Год назад

    на предыдущей работе в тайп хинтах ковариативность использовали в модуле который конфиги грузил разных классов в зависимости от переменной окружения ENVIRONMENT))) ну тип был базовый класс и куча дочек local, dev, testing, test, stage prod)))

  • @Skeap11
    @Skeap11 Год назад +2

    Возможно я не въехал, но кажется, что пример про контравариативность некорректный т.к. аннотация аргументов функция работает ковариативно т.к. task_for_employee принимает Employee и его наследников.

    • @УтерСветоносный-б2ш
      @УтерСветоносный-б2ш Год назад +2

      тоже думаю об этом и ломаю голову........

    • @oguretsagressive
      @oguretsagressive 7 месяцев назад

      Все-таки корректный, просто здесь только аргумент "task" контравариантный (подходят функции со всем что выше по иерархии). Аргументы для "task_for_*" ковариантные ("Programmer" и ниже по иерархии).

  • @VGCor
    @VGCor Год назад +1

    Типизация непростая тема. Никак не врублюсь почему типы раскиданы по модулям разным, когда есть вроде специальный typing. Нужен тебе какой, то по всему питону ищи... Тему видоса вообще понял только к резьюме 15:50 😂

  • @sad0FFsky
    @sad0FFsky Год назад

    Алексей, как попасть к вам на курс?когда он стартует?

    • @t0digital
      @t0digital  Год назад

      Курс ещё не запущен. Подпишитесь на телеграм, там будет вся информация t.me/t0digital

    • @sad0FFsky
      @sad0FFsky Год назад

      @@t0digital а примерные сроки запуска известны?

  • @TheDeatgod
    @TheDeatgod Год назад

    Если в примере с инвариантностью я сделаю programmers_list = frontenders_list.copy(), то при добавлении элементов в любой из списков результат операции не отразится на втором списке. Очевидно, что frontenders_list и frontenders_list.copy() имеют один и тот же тип.

  • @jamjam3337
    @jamjam3337 Год назад

    👏

  • @KoichiHub
    @KoichiHub Год назад

    В TypeScript проще работать с типами, чем в Python. Да и книжечка по тоньше - 'Профессиональный TypeScript' от Черного Бори

    • @t0digital
      @t0digital  Год назад +1

      Да, TS лучше работает с типами

  • @КириллЧе-я5ы
    @КириллЧе-я5ы Год назад +3

    А как же тензорный анализ🤪?..

  • @furrygem5176
    @furrygem5176 Год назад

    7:55 я думал он скажет "фронтендер не программист"

  • @stanislavserov8622
    @stanislavserov8622 Год назад

    Привет! Прошу снять что-то русскоязычное по Flet.

    • @t0digital
      @t0digital  Год назад +1

      про это? flet.dev/

    • @stanislavserov8622
      @stanislavserov8622 Год назад

      @@t0digital да

    • @stanislavserov8622
      @stanislavserov8622 Год назад

      @@t0digital там они в документации написали что до конца года планируют сделать нечто expo, как для react, то есть что-то будет прям на мобилке просматриваться во время разработки и тд.

    • @t0digital
      @t0digital  Год назад

      @@stanislavserov8622 не пользовался такой штукой и от мобильной разработки сейчас далек. Пожалуй, писал бы на Дарте напрямую на флатер, если бы занимался мобильной разработкой

    • @stanislavserov8622
      @stanislavserov8622 Год назад

      @@t0digital а по django unicorn можете что-то сказать? только сегодня узнал про это.. в рунете мало инфы

  • @guiterenzog2723
    @guiterenzog2723 Год назад

    Если честно, из-за частого повторения запутался.
    Что я понял:
    - инвариантность - про то, что в списки (сюда же кортежи) конкретного типа можно помещать объекты только этого типа (наследников нельзя)
    - ковариантность - про то, что последовательность конкретного типа может содержать объекты как этого типа, так и его наследников
    - контрвариантность - про то, что можно использовать сущность, предназначенную для конкретного типа, всеми родителями этого типа
    Корректно?

    • @t0digital
      @t0digital  Год назад +7

      Списки, последовательности и прочее - это конкретные типы, а понятия инвариантности, ковариантности и контравариантности (вероятно в видео я несколько неправильно называл последние два) - абстрактные, то есть не привязаны к конкретным типам вроде листа или последовательности.
      Про что эти понятия. Вот есть класс 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 Год назад +1

      @@t0digital отличное объяснение, спасибо!

  • @КириллЧе-я5ы
    @КириллЧе-я5ы Год назад

    Этак, неявное преобразование типов для ссылок на иммутабельные структуры не работает… а если будет неконстант, также инвариант по ссылкам сохранится?..

  • @aleksandrdevelopment3321
    @aleksandrdevelopment3321 Год назад +1

    Все очень круто) но откажись уже от пайтона)))

    • @t0digital
      @t0digital  Год назад +1

      В пользу чего:)?

    • @aleksandrdevelopment3321
      @aleksandrdevelopment3321 Год назад

      @@t0digital C#/Java а если уж хочешь быть программистом то С++ %)

    • @oguretsagressive
      @oguretsagressive 7 месяцев назад

      @@aleksandrdevelopment3321 и что собираешься писать на C++?

  • @proofit404
    @proofit404 Год назад +1

    Даже в примерах кода бэкендеры самые обделённые в зарплате WTF

  • @ИльяТвердов-н3е
    @ИльяТвердов-н3е Год назад

    На руках паныряй!))))) Спалено ;-)

  • @banzaika
    @banzaika Год назад

    Качество хорошеет, но долго

  • @Max-nr1bv
    @Max-nr1bv Год назад

    Есть какая литература по теме?

    • @t0digital
      @t0digital  Год назад +1

      Об этом есть в «Python к вершинам мастерства», Лусиану Рамальо, 2 издание. Мы сейчас читаем ее в Ботаним

  • @maybejke
    @maybejke Год назад

    все видео намеки на этих фронтеендеров, не программеров xDDD

  • @alexs8582
    @alexs8582 Год назад

    Почему пайтон, если питон?

    • @t0digital
      @t0digital  Год назад +1

      Нэт, пайтон) язык назван в честь Монти Пайтон

    • @alexs8582
      @alexs8582 Год назад

      @@t0digital Понятно, "программисты бывают двух типов - те которые говорят питон и те кто программирует"))

    • @t0digital
      @t0digital  Год назад

      @@alexs8582 да я не особо обращаю внимание на это:) мое произношение английских слов в любом случае так себе

  • @КириллЧе-я5ы
    @КириллЧе-я5ы Год назад

    А может ли более узкая специализация класса вызывать перегруженное поведение базового класса? Что-то вроде виртуальных функций или имплементации интерфейсов?..

    • @t0digital
      @t0digital  Год назад

      Не понял вопрос, к сожалению:)

    • @КириллЧе-я5ы
      @КириллЧе-я5ы Год назад

      @@t0digital просто есть ли какой механизм динамического или иного полиморфизма в питоне?)

    • @megaman13able
      @megaman13able Год назад

      @@КириллЧе-я5ы кажется для этого есть оператор super

    • @mark_parker
      @mark_parker 10 месяцев назад

      @@КириллЧе-я5ы super()

  • @heisenberg6874
    @heisenberg6874 Год назад +1

    чувак работающий в компании с именем ян😊😊😊

  • @АртурЗарипов-ю9п

    Я правильно понял, что в Питоне: Sequence - ковариантные, списки - инвариантные, а функции - контрвариантные?

    • @t0digital
      @t0digital  Год назад +3

      Sequence это неизменяемая структура, поэтому она ковариантна по отношению к типам данных в ней. Списки инвариантны по отношению к типам в структуре. Функции (Callable, там могут быть вызываемые объекты тоже, не только функции) ковариантны по возвращаемому значению (об этом не было в видео, но это так) и контраварианты по аргументам

  • @avpmk
    @avpmk Год назад +1

    Правильно говорить: "ковариантность" и "контравариантность". Вариантность, не вариативность.

  • @zxw
    @zxw Год назад +1

    Понятнее к сожалению не стало😢

  • @jamuelsexon
    @jamuelsexon Год назад

    Уснул. Скучно.

    • @t0digital
      @t0digital  Год назад +1

      Приятных снов!

  • @dogbusiness5201
    @dogbusiness5201 Год назад

    Спасибо за видео!