Разбор задачки на функциональное программирование в Python

แชร์
ฝัง
  • เผยแพร่เมื่อ 3 ก.ย. 2022
  • Разбираем ещё одну задачку с codewars на функциональное программирование в Python.
    Мой курс «Хардкорная веб-разработка» - course.to.digital
    Книжный клуб Ботаним!, где мы читаем хорошие ИТ-книги: botanim.to.digital/
    Telegram: t0digital.t.me
    /****************** about ******************/
    Меня зовут Алексей Голобурдин, я программирую с 2004 года и на этом канале делюсь своим опытом. Я основатель и руководитель компаний:
    - Диджитализируй digitalize.team, разрабатываем сложные IT системы для бизнеса;
    - Salesbeat salesbeat.pro, комплексный модуль доставки для интернет магазинов.
    Telegram канал - t.me/t0digital
    ВК - digitalize.team
    RuTube - rutube.ru/channel/24802975/ab...
    Дзен - dzen.ru/id/6235d32cb64df01e6e...

ความคิดเห็น • 219

  • @Maniakalochka
    @Maniakalochka ปีที่แล้ว +67

    Очень хочу ещё видео с решением задачек на codewars в вашем исполнении. Это, наверняка, будет интересно не только мне :-)

  • @drakutont
    @drakutont ปีที่แล้ว +43

    Лучшая рекламная интеграция!

    • @theencryptedpartition4633
      @theencryptedpartition4633 ปีที่แล้ว

      Вот бы в каждым видео в ютубе было так

    • @m0zg153
      @m0zg153 ปีที่แล้ว +2

      За булавки однозначно лайк

    • @symbolminded5167
      @symbolminded5167 ปีที่แล้ว

      Откуда пошел мем?

    • @t0digital
      @t0digital  ปีที่แล้ว

      @@symbolminded5167 какой?

    • @symbolminded5167
      @symbolminded5167 ปีที่แล้ว

      @@t0digital С У(к)рюпинским заводом булавок

  • @Sadownick
    @Sadownick ปีที่แล้ว +28

    Ну как и всегда, отличная подача материала и простое и понятное объяснение, однозначно лайк 👍🏻

  • @negonifas
    @negonifas ปีที่แล้ว +3

    ЭТО ВЕЛИКОЛЕПНО! Смотреть и слушать ПРОЦЕСС в вашем исполнении. Со времён когда вы мне объяснили за лямбду, уже это теперь самый доходчивый способ передачи знаний.

  • @igorratnik2357
    @igorratnik2357 ปีที่แล้ว +1

    Спасибо))) Хороший формат)))

  • @nickolasmaslow7041
    @nickolasmaslow7041 ปีที่แล้ว +1

    Спасибо за Ваш труд! Я считаю Ваш канал самым лучшим в сфере программирования на Python, более понятных и атмосферных видео я не видел.

  • @diplspec5758
    @diplspec5758 ปีที่แล้ว +1

    Круто! Было полезно! Спасибо!

  • @andreykulikov3760
    @andreykulikov3760 ปีที่แล้ว +1

    Мощно, спасибо!

  • @cs_dequeue
    @cs_dequeue ปีที่แล้ว

    Спасибо за разбор! Определенно было полезно!

  • @ExtraterrestrialCatgirl
    @ExtraterrestrialCatgirl ปีที่แล้ว +1

    Спасибо за разбор! Интересная задачка

  • @k1kk2k91
    @k1kk2k91 ปีที่แล้ว

    Спасибо за отличную подачу, лайк!

  • @donfedor007
    @donfedor007 ปีที่แล้ว +3

    Круть! Интересное решение! Я заморочился с оператором типа add и передавал их, но Ваше решение очень элегантное 💪👍

  • @user-qd5bg5sw7k
    @user-qd5bg5sw7k ปีที่แล้ว +1

    Великолепно!

  • @r35p3ct00
    @r35p3ct00 ปีที่แล้ว +1

    Спасибо спонсору😁

  • @gheorgheprodan6143
    @gheorgheprodan6143 ปีที่แล้ว +10

    Какое совпадение. Именно и за этой задачки я бросил решать каты на codewars. Я не мог ни как её решить. Понял что ничего не понимаю в функциях. Но теперь я всё понял и могу продолжить мой путь самурая. 🤺
    Спасибо Алексей! 👏

    • @ne4to777
      @ne4to777 ปีที่แล้ว

      переходи на js там более наглядно с функциями работать.

    • @user-co6qk3hl9z
      @user-co6qk3hl9z ปีที่แล้ว

      @@ne4to777 Знание ФП не зависит от ЯП.

    • @ne4to777
      @ne4to777 ปีที่แล้ว +1

      @@user-co6qk3hl9z , перечитай ещё раз мой коммент более вдумчиво.

  • @VGCor
    @VGCor ปีที่แล้ว +1

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

  • @TheAutonomoos
    @TheAutonomoos ปีที่แล้ว +3

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

  • @Vjidowkdkcpapqkfjfw
    @Vjidowkdkcpapqkfjfw ปีที่แล้ว

    Спасибо!

  • @krev3
    @krev3 ปีที่แล้ว +2

    Очень залипчивая задача. Попалась месяц назад на codewars, и просидел с ней несколько ночей. Аж голова разболелась. На удивление, ход разсуждений совпал как у автора в ролике. Решение было подобным но без лямбда, попроще.
    Столько нового узнал по теории пока решал.
    И как точно подметили в коментах: пока мозги правильно не повернёшь, трудно начать рассуждать как автор ролика.
    Спасибо за задачу и разбор. Уже захотелось опять вернуться в codewars. 👏

  • @gnompirogov9259
    @gnompirogov9259 ปีที่แล้ว

    очень полезно и интересно

  • @user-ir4vd5yk4x
    @user-ir4vd5yk4x ปีที่แล้ว +1

    Спасибо)

  • @boobatrustahimmortal
    @boobatrustahimmortal ปีที่แล้ว

    Спасибо автору и таким же авторам как и ты! Благодаря вам моя стоимость на рынке только возрастает, а предложения по работе уже начинают доставать, как спам.

  • @danilgaleev4359
    @danilgaleev4359 ปีที่แล้ว +4

    Привет! Когда планируется третья часть по разработке вашей системы для донатов? Очень жду, хочется посмотреть продолжение) Спасибо за классный, полезный и увлекательный контент!

  • @MrAnetto
    @MrAnetto ปีที่แล้ว +18

    Я бы реализовал операции так
    def plus(number):
    return number.__add__
    т.е. мы возвращаем функцию переданного аргумента. Тогда four(plus(nine())) развернётся в 9.__add__(4)
    ps: кстати, в таких задачах нередко стоит знать классическую "обратная польская запись"

    • @undefinedundefined2459
      @undefinedundefined2459 ปีที่แล้ว +4

      а с минусом/делением как? например, seven(minus(five())) развернется ведь не в ту сторону (5 - 7)

    • @arthur_koba
      @arthur_koba ปีที่แล้ว +1

      Я не эксперт, но вроде задачка про функциональное программирование, без ООП.

    • @MrAnetto
      @MrAnetto ปีที่แล้ว +2

      @@arthur_koba в питоне всё объект, и операция плюс вызывает магический метод __add__. То есть a+b и a.__add__(b) - эквивалентные записи одного и того же

    • @MrAnetto
      @MrAnetto ปีที่แล้ว +8

      @@undefinedundefined2459 отличный вопрос :)
      Казалось бы, что нам нужны методы плюс __add__, минус - __sub__, целочисленное деление __floordiv__, умножение __mul__. Прелесть в том, что для не-коммутативных методов (важен порядок, типа минус и деление) есть "правосторонние" аналоги. То есть a.__sub__(b)==a-b, а есть a.__rsub__(b)==b-a. То есть буковка R в начале говорит о другом порядке операндов.
      Итого берём __add__, __rsub__, __rfloordiv__, __mul__, и всё работает как планировалось

    • @arthur_koba
      @arthur_koba ปีที่แล้ว +2

      @@MrAnetto это понятно, что все объект. Но задача скорее всего ограничена применением функционального программирования, без использования магических методов. И её не обязательно решать на python, можно взять и другой язык скорее всего, и реализовать тоже самое на тех же самых лямбда функциях.

  • @rinaatt
    @rinaatt ปีที่แล้ว +1

    Можно еще вспомнить про пакет operator и functools, в частности про functools.partial

  • @99phenomenon
    @99phenomenon ปีที่แล้ว

    Thx!)

  • @PlanSK
    @PlanSK ปีที่แล้ว +2

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

    • @t0digital
      @t0digital  ปีที่แล้ว

      Спасибо!

  • @alvares2729
    @alvares2729 ปีที่แล้ว

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

  • @comisarrex5961
    @comisarrex5961 ปีที่แล้ว

    интересно будет услышать твое мнение про pyscript

  • @user-kmv89
    @user-kmv89 ปีที่แล้ว

    Спасибо, как раз бился над этой задачей месяц назад, и так и не решил ее

  • @clauseclause6640
    @clauseclause6640 ปีที่แล้ว +3

    Можно было вынести логику из операторов в отдельную функцию, и оттуда передавать или метод из библиотеки operator, ну или просто передавать имя магического метода, типа `__add__` и в функции просто применять его через getattr

  • @cyber_engine
    @cyber_engine ปีที่แล้ว

    Какая извращенная задача.
    Прям как я люблю.

  • @slaviksemen4919
    @slaviksemen4919 ปีที่แล้ว +1

    Где купить булавки?🙂

  • @jth.000
    @jth.000 ปีที่แล้ว +4

    1:23. Я не поленился и загуглил. Так вот, в Урюпкинске есть только крановый завод ;(

    • @t0digital
      @t0digital  ปีที่แล้ว +8

      Завод булавок просто ещё не раскрутился! Но мы ему поможем!

  • @mafiya25
    @mafiya25 ปีที่แล้ว

    Прикольно
    А через декораторы это как-то можно замутить?

  • @svfastunov
    @svfastunov ปีที่แล้ว

    Нет в Урюпинске завода булавок. Трикотажная фабрика есть.

    • @t0digital
      @t0digital  ปีที่แล้ว +1

      Просто не раскрутился ещё. Поможем!

  • @mlr__roal_6867
    @mlr__roal_6867 ปีที่แล้ว +1

    А где ссылка на булавки?

  • @georgestatefield
    @georgestatefield ปีที่แล้ว +2

    🤣 Браво
    Урюпкинскому
    Заводу
    Булавок!

  • @user-dz6by9gb9y
    @user-dz6by9gb9y ปีที่แล้ว +3

    Я думал фишка задачи в том, что функции динамически в коде объявляются. И что-то вроде такого решения вижу:
    from operator import mul, add, sub, floordiv
    operands = {'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5, 'six': 6, 'seven': 7, 'ehgt': 8, 'nine': 9, 'zero': 0}
    operators = {'times': mul, 'plus': add, 'minus': sub, 'devided_by': floordiv}
    for operand, value in operands.items():
    exec(f'def {operand}(param=None): return {value} if param is None else param({value})')
    for operator, value in operators.items():
    exec(f'def {operator}(param): return lambda param2: {value.__name__}(param2, param)')
    print(one(minus(three())))

    • @kapitanov1025
      @kapitanov1025 ปีที่แล้ว

      бро все твои старания в ооп это хорошо, но выходит очень много кода и не очень хорошего (читабельность, чистота и понятность ушли, закрыв за собой двеь)

    • @user-dz6by9gb9y
      @user-dz6by9gb9y ปีที่แล้ว

      @@kapitanov1025 тут посыл больше не в ооп, а в динамическом объявлении функций через exec. Поправил код без ООП. Теперь очень коротко получилось)

    • @t0digital
      @t0digital  ปีที่แล้ว +2

      @@user-dz6by9gb9y exec это антипаттерн. Я не знаю нормальных сценариев его использования. Наверное, можно что-то придумать, но тут он точно не нужен.
      Способы не писать отдельно определения функций one-two есть и так, в комментах здесь или в телеге упоминались

  • @DeSpectraLDemon
    @DeSpectraLDemon ปีที่แล้ว

    8:56 в first_operand передается 7 по причине ...?
    Значение первого по порядку аргумента, переданного лямбда функции, присваивается первой по порядку переменной, объявленной в лямбда функции?
    Т.е. например чтобы испортить реализацию, мы можем в _digit() вызвать operator(number, -1), тогда значение second_operand будет всегда -1?

  • @Andrey-iq1ls
    @Andrey-iq1ls ปีที่แล้ว

    Честно говоря, я в программировании, дв и в IT в целом полное днище, но как натолкнулся на канал Алексея - смотрю взахлёб. Это какой-то абсолютно новый опыт и мотивация для меня, спасибо большое!

    • @t0digital
      @t0digital  ปีที่แล้ว +1

      Спасибо, рад слышать!

  • @pokruk0
    @pokruk0 ปีที่แล้ว

    Прикольно, но хотелось бы что-то по-сложнее

  • @kutsokon
    @kutsokon ปีที่แล้ว +2

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

  • @egorletov8686
    @egorletov8686 ปีที่แล้ว +1

    Для тех, кому нужна задача.
    5 kuy ката, название "Calculating with Functions"
    Может называлась в видео, извините.

  • @robbarret9568
    @robbarret9568 ปีที่แล้ว

    А второй способ где?

  • @user-lg6dt3jf1j
    @user-lg6dt3jf1j ปีที่แล้ว

    Не понял, где ссылка на Урюпкинский завод булавок?

  • @r735g3
    @r735g3 ปีที่แล้ว +8

    А можно ссылку на саму задачу на Code wars? Хочу попробовать сам решить прежде чем смотреть разбор

    • @t0digital
      @t0digital  ปีที่แล้ว +6

      www.codewars.com/kata/525f3eda17c7cd9f9e000b39/train/python

    • @alvaresification
      @alvaresification ปีที่แล้ว

      некоторые другие решения этой задачи на codewars впечатляют, оказывается подходов к решению далеко не один

  • @shurko
    @shurko ปีที่แล้ว +2

    Или даже так [one, two, three, four, five, six, seven, eight, nine] = ((lambda n : lambda f = (lambda x : x) : f(n))(n) for n in range(1, 10))

  • @m-fusion
    @m-fusion ปีที่แล้ว +1

    Решал эту задачку на js. В принципе ничего сложного, если мозг повернут на ФП. Но первый раз ломает мозг.

  • @szizoid4987
    @szizoid4987 ปีที่แล้ว +1

    Замудренное какое-то решение в ролике. Я решил через строки и функцию eval. Всё просто, если у функции digit нет аргументов, возвращается само число int. Если есть, возвращается eval(str(digit) + operator)
    Сами же операторы работают схоже. У них аргумент обязательный, и они возвращают строку типа str(operator) + arg.
    То есть условно eight() вернёт int 8
    plus(eight()) вернёт строку '+8'
    А какой-нибудь one(plus(eight())) вернёт eval('1' + '+8')
    Или 9

    • @t0digital
      @t0digital  ปีที่แล้ว

      eval антипаттерн

  • @user-xm1mq2sn1e
    @user-xm1mq2sn1e ปีที่แล้ว

    Эта задача как раз в не решённых у меня лежала. Я про неё и забыл уже. А тут - раз! :) Спасибо, круто. А что вообще скажете на счёт Codewars и иже с ним? Я там уже три месяца. До 3 kyu дорос (на полпути ко 2-му). И вот думаю, хватит ли базы для того, чтобы переходить к каким-то фреймворкам?.. По каким критериям можно оценить свою базовую подготовку? Слышал мнение, что на hackerrank более реальные задачи... Что скажете?

    • @user-pv9ly4pq2j
      @user-pv9ly4pq2j ปีที่แล้ว +1

      давно пора) 3 кью - это уже довольно потно, особенно если получается решать задачи похожим на best practices образом. вообще для работы на фреймворках прокаченные алгоритмы не нужны, достаточно знать базовые вещи, типа big O notation. Полезнее будет прокачать понимание ООП. а вообще, работа программистом - это не столько про само программирование, сколько про инструменты вокруг этого. У бэкендеров, например, это БД, гит, контейнеризация, сети, архитектура приложений в целом.

  • @maxwaterman2052
    @maxwaterman2052 ปีที่แล้ว

    Не питонист, но задачка интересная!
    Ушел за булавками.

  • @StanislavBeskaev
    @StanislavBeskaev ปีที่แล้ว +1

    Непривычно видеть Алексея небритым

  • @davidalkamyan2856
    @davidalkamyan2856 ปีที่แล้ว

    Хотелось бы ссылку на задание на самом Codewars. Заранее спасибо.

    • @t0digital
      @t0digital  ปีที่แล้ว

      Поищите тут в комментах, уже давал

  • @artyommart
    @artyommart ปีที่แล้ว +2

    Здраствуйте Диджитализируй!
    Я изучаю Python уже несколько месяцев но волнуюсь что не смогу найти работу в web(Django) или в других сферах.
    Python и вправду используют много в профессиональной разработке?
    Какие известные приложения написаны на нем?
    Заранее спасибо

    • @andreiosipov2766
      @andreiosipov2766 ปีที่แล้ว

      А что вы подразумеваете под программами? То, что на компьютер устанавливается? В таком случае - никакие. А вот какие-то сервисы, бекенды, внутренние иснтрументы компаний, прикладные задачи в различных сферах - этого очень много написано.

    • @t0digital
      @t0digital  ปีที่แล้ว

      Запрещенный instagram на python+django, например. Но в почти любом большом веб-сервисе есть код на python, уверен в этом. Самый популярный скриптовый язык в мире потому что:)

  • @user-ov5hf3cl3k
    @user-ov5hf3cl3k ปีที่แล้ว

    как попасть на завод , Урюпинский, булавки нужны.

  • @Kosty1024Bit
    @Kosty1024Bit ปีที่แล้ว

    Классно, круто. Но на всякий случай, в питоне уже есть операция целочисленного деления - //

  • @fedorivanov8420
    @fedorivanov8420 ปีที่แล้ว

    Что нравится на канале: подача, профессионализм, умение пользоваться ИДЕ. Что хочется улучшить: лоХика, проХрамма, ТАПАЛ 🤣🤣

  • @drygdryg2
    @drygdryg2 ปีที่แล้ว

    Хочу добавить, что в данном решении лямбда-функции, которые возвращают функции-операторы (plus, minus, times, divided_by), можно классифицировать как замыкания (closures). Замыкание - это функция, которая находится внутри другой функции и ссылается на переменные объявленные в теле внешней функции.

    • @mikeofs1304
      @mikeofs1304 ปีที่แล้ว

      Это они и есть. Собственно полноценно реализовать лямбда исчисление без замыканий невозможно

  • @user-dj4vn5md1x
    @user-dj4vn5md1x ปีที่แล้ว

    Урюпкинский завод булавок ❤️

  • @ivan-ivanov-ivanovich
    @ivan-ivanov-ivanovich ปีที่แล้ว +1

    А можно ссылочку на обоинку ?

    • @t0digital
      @t0digital  ปีที่แล้ว +2

      to.digital/wlp/vecher-tuchi-gory-doroga-ogni-vyderzhka.jpg

  • @MACTEP-XPEHACTEP
    @MACTEP-XPEHACTEP ปีที่แล้ว

    Блин, как-то не могу понять, как в first_operand попадает значение?
    оно берется из общего нейм спейса откуда-то?

    • @ArquitectoR
      @ArquitectoR ปีที่แล้ว

      Оно передаётся при вызове лямбды

  • @user-vx1zf6pn9r
    @user-vx1zf6pn9r ปีที่แล้ว +1

    Чем Вам lambda не угодили?
    Берем функцию цифр:
    def number(n: int, obj=None):
    if obj is None:
    return n
    return obj(n)
    Добавляем действие, например умножение:
    def times(num):
    return lambda n: number(n) * num
    Расписываем цифры следующим образом:
    one = lambda n=None: number(1, n)

    • @t0digital
      @t0digital  ปีที่แล้ว +1

      Один из вариантов, да. У меня тоже есть лямбды, они всем мне угодили:)

    • @user-vx1zf6pn9r
      @user-vx1zf6pn9r ปีที่แล้ว

      Не осуждаю, а подмечаю

    • @user-vx1zf6pn9r
      @user-vx1zf6pn9r ปีที่แล้ว

      @@t0digital Просто расписывать однострочные функции, когда БОЖЕСТВЕННАЯ ЛЯМБДА не канонично (ирония). Решил сам без мам и пап, потом глянул решение)
      Спасибо за контент)

  • @pennypy
    @pennypy ปีที่แล้ว

    Ответ - 42

  • @user-jn4cq9dy3f
    @user-jn4cq9dy3f ปีที่แล้ว +2

    Всё ждал, когда всплывёт "магия"... ;))) Зачем lambda, когда у int есть методы ___add__, __sub__, __mul__, __div___

    • @t0digital
      @t0digital  ปีที่แล้ว +2

      В контексте простых математических операторов можно было ими воспользоваться, да. Но если задача расширится до более сложных примеров, то подход с lambda будет универсальным и позволит реализовать что-то, чего нет в магических методах.

  • @普京的手机
    @普京的手机 2 หลายเดือนก่อน

    int(a / b) не всегда равно a // b

  • @nucluster
    @nucluster ปีที่แล้ว

    Так, я не понял, а где фраза "ссылка в описании"? 😬😁

  • @user-gl5qq5ru1v
    @user-gl5qq5ru1v ปีที่แล้ว

    Надеюсь продажи у завода булавок подскочили после рекламы 😊

    • @t0digital
      @t0digital  ปีที่แล้ว

      Уверен! Помогли заводу!

  • @MrGeralt67
    @MrGeralt67 ปีที่แล้ว

    Все-таки непонятно каким образом в функции, которая реализует операцию, например minus, происходит подстановка значения переменной first_operand. Эта переменная не является параметром функции minus.

  • @testing...9127
    @testing...9127 ปีที่แล้ว +2

    О! Я первый?

  • @qulinxao
    @qulinxao ปีที่แล้ว

    примечательна асимметрия с выносом _digit и без аналогичного выноса _function

    • @t0digital
      @t0digital  ปีที่แล้ว

      Не понял, какой _function?

    • @qulinxao
      @qulinxao ปีที่แล้ว

      @@t0digital который подобно _digit действует но не над неизменными а над вызываемыми - об том и речь асимметрия восприятия у реализатора данных которые объект действия и функции которые субъект действия - хотя по задаче разнице нет ваще есть вызываемые имена которые имеют два поведения когда без арга и когда с аргом

  • @user-yy6dx1wj9r
    @user-yy6dx1wj9r ปีที่แล้ว

    А где ссылка на задачку? Может перед видосом сам решить захотел?)

  • @user-hs6lj9zt4p
    @user-hs6lj9zt4p ปีที่แล้ว +1

    Алексей, скажите, если бы вы стали делать , например, сайт знакомст, то бэкэнд и фронтенд на каком языке начали делать?

    • @t0digital
      @t0digital  ปีที่แล้ว +2

      Фронт на solidjs, бэк на fastapi, но возможно с частями на других языках вроде go или rust

    • @user-hs6lj9zt4p
      @user-hs6lj9zt4p ปีที่แล้ว

      @@t0digital спасибо за ответ!

    • @dimontusgaming8362
      @dimontusgaming8362 ปีที่แล้ว +1

      @@t0digital Раст на канале ждём. будет круто

  • @Mralex22801
    @Mralex22801 ปีที่แล้ว +3

    Не нашёл в описании ссылки на Урюпкинский завод булавок?! За что вам только платят.

  • @siberianwolf777
    @siberianwolf777 ปีที่แล้ว

    На code wars есть похожие задачи. Реализация только на лямбда функциях. Т.е реализация только в алгебре черча. Вот это сложно, по сравнению с этой задачей.

  • @masson6359
    @masson6359 ปีที่แล้ว

    ну конечно решение не лучшее) Хардкод + повторение. мне кажется здесь неплохо можно использовать map + lambda.

    • @t0digital
      @t0digital  ปีที่แล้ว

      Можно, да. Не стал рефачить усложнять код. Помимо DRY не стоит забывать про KISS. DRY он про то, что в случае изменений придется изменить что-то в нескольких местах. В данном случае эти несколько мест находятся непосредственно рядом друг с другом и изменения не будут проблемой. А вот нагромождения мапов и лямбд понимание кода в значительной степени усложнят. А вместе с тем и увеличится вероятность багов, к слову.

    • @masson6359
      @masson6359 ปีที่แล้ว

      @@t0digital зато красиво) я даже видел решение вида просто импортировать операторы из питоновский библиотеки))) а цифры задать тем же мапом

  • @sikelmon
    @sikelmon ปีที่แล้ว

    Склейки мешают моему обучению Виму + нет вывода нажатых клавиш. Прошу учесть ))))))

  • @creativesolution4827
    @creativesolution4827 ปีที่แล้ว

    я второй

  • @damirkayumov6574
    @damirkayumov6574 ปีที่แล้ว

    А в Урюпинске разве есть завод булавок? Мне кажется надо тщательней спонсоров подбирать. А то и к основной теме недоверие появляется!

    • @t0digital
      @t0digital  ปีที่แล้ว

      Конечно, есть! Специальный Урюпинский завод булавок

  • @arxxximed
    @arxxximed ปีที่แล้ว

    Хм а если я решу задачу без лямбда, и вообще без возврата функций? Интересно, а вообще часто используют возврат функций на практике?

    • @ArquitectoR
      @ArquitectoR ปีที่แล้ว

      Да, часто используют. Эту задачу можно решить без них, достаточно из функций-операторов возвращать кортеж из действия и второго операнда, а в _digit его обрабатывать.

  • @ne4to777
    @ne4to777 ปีที่แล้ว

    Неплохо для процедурщика, но если начал в ФП иди до конца, хотя судя по видео ФП в пайтоне это боль. Вот то же самое на js:
    const number = n => f => f ? f(n) : n
    const one = number(1)
    const two = number(2)
    ...
    const plus = x => y => x + y
    const minus = x => y => x - y
    ...

    • @geri_freki
      @geri_freki ปีที่แล้ว

      Совсем не боль )
      А в JS разве нельзя сделать что-то типа:
      one, two, three = map(number, (1, 2, 3)) ?

    • @ne4to777
      @ne4to777 ปีที่แล้ว +1

      @@geri_freki , можно, конечно, так и надо делать, но я сделал, чтоб больше на то, что в видео было похоже:
      const [one, two, three] = [1, 2, 3].map(number)

    • @geri_freki
      @geri_freki ปีที่แล้ว

      ​@@ne4to777 круто! здесь в комментах рекомендовали видео th-cam.com/video/5C6sv7-eTKg/w-d-xo.html уже неделю его частями смотрю - пытаюсь самостоятельно написать лямбда-функции, когда лектор это предлагает. Причем у него какой-то кастомный IDE - можно реально писать код в упрощенной λ-нотации и он выполняется как обычный python-код, типа: AND = λxy.xyx 😀это как lambda x: lambda y: x(y)(x)

    • @ne4to777
      @ne4to777 ปีที่แล้ว

      @@geri_freki , в программировании как таковые лямбды не нужны, это просто гимнастика для ума, и выглядит как новый синтаксис для языка. Просто относись к ним как функции, которые возвращают функции и все, этого достаточно. В js это поняли и сделали новый оператор =>. В питоне, видимо, решили все усложнить и ввели грозное слово lambda, зачем непонятно.

  • @iliakaribski2150
    @iliakaribski2150 ปีที่แล้ว

    1. Передача функции с использованием параметров из другой функции вроде называется замыканием
    2. Вероятнее при решении таких задач было бы удобнее использовать конструкцию assert(не говоря уже на собеседованиях), а то сравнивать строчки по порядку вывода моветон

    • @t0digital
      @t0digital  ปีที่แล้ว

      1. Замыкание это доступ к переменной, определённой в функции выше, ничего больше.
      def outer():
      some_var = 123
      def inner():
      print(some_var) # Это замыкание, some_var определен в outer
      return inner
      Вообще не понимаю, зачем под это обычное правило области видимости переменных ввели отдельное слово и так часто его используют:) LEGB правило областей видимости переменных есть, в нём есть Enclosing.
      2. Область применения assert - показать пользователю твоего кода, что он его использует неверно. Не знаю, где здесь стоит использовать assert. Не вижу под него места. Ну если захочется зачем-то проверить тип в _digit, что там первое число типа int, например. Но эту проверку лучше вынести в статическую проверку типов в mypy.

    • @qulinxao
      @qulinxao ปีที่แล้ว

      @@t0digital предположим ваше высказанное "непонимание" ради накрутки
      вложенность функций не покрывает замыкания - в замыканиях стек перестаёт быть достаточным для реализации исполнения
      т.е замыканиями самими по себе обеспечивается переход подобный от конечных автоматам к стековым - замыкания же "делают" динамическую память с временем существования имени пока оно откуда либо видно

    • @t0digital
      @t0digital  ปีที่แล้ว

      @@qulinxao ну вопросы видимости и времени жизни переменных связаны. Вот здесь эта переменная видна, и вот такой у нее срок жизни. Нахрена это называть замыканием, пугая этим словом бедных новичков, понятия не имею. Это просто области видимости и ничего больше, причем интуитивно понятные области видимости.

    • @qulinxao
      @qulinxao ปีที่แล้ว

      >1. Замыкание это доступ к переменной, определённой в функции выше, ничего больше.
      это достаточно слабое(широкое утверждение) - в том же Паскале были вложенные функции и не было замыканий :)
      Схема выкристаллизовала замыкания
      в Паскале(Алголе :) ) чтение/запись выданой из функции-внука в основную программу "ссылки" на переменную в функции-родителе очевидно приводило к чудесам на стеке
      замыкание это когда значения живут пока о них помнят

    • @qulinxao
      @qulinxao ปีที่แล้ว

      @@t0digital непонимание обусловленно кривизной истории не будь ответвления Алголов с их строгой вложенностью не было бы Схемы какой она стала

  • @sergeyhets3395
    @sergeyhets3395 ปีที่แล้ว

    Зочем лямбды, когда можно сделать на partial более элегантное решение?

    • @t0digital
      @t0digital  ปีที่แล้ว

      Зачем partial, когда можно сделать на лямбдах)? Есть тонна разных вариантов, на любой извращенческий вкус и цвет)

  • @tgakatiger
    @tgakatiger ปีที่แล้ว +1

    th-cam.com/video/5C6sv7-eTKg/w-d-xo.html - прекрасное руководство по функциональщине

    • @geri_freki
      @geri_freki ปีที่แล้ว

      Спасибо за ссылку! Смотрю сейчас - реально крутая лекция.

  • @user-xm1mq2sn1e
    @user-xm1mq2sn1e ปีที่แล้ว

    Если не трудно, объясни вот такой прикол в Питоне:
    print(type(0b1001)) # выдаёт int
    print(type('0b1001')) # выдаёт str
    int('0b1001') # выдаёт xyz )))

    • @Bluespyy
      @Bluespyy ปีที่แล้ว

      print(type(0b1001)) # выдаёт int потому что 0b1001 это целое число (9) записанное в двоичной системе счисления
      print(type('0b1001')) # выдаёт str потому что type всегда будет возвращать если аргумент строка
      int('0b1001') # выдаёт xyz. нет не выдает. там только ошибка может быть. int вряд-ли когда-нибудь в жизни сможет вернуть что-либо кроме чисел. Если же ты все-таки захотел задать аргумент в виде строки, то вторым аргументом должна быть система счисления, в которой это число записано. Например print(int('0b1001')) -> ошибка, но print(int('0b1001', 2)) -> 9

  • @arxxximed
    @arxxximed ปีที่แล้ว

    Эх жаль тут "два плюс два , деленное на два " не сработает ))

  • @idensas
    @idensas ปีที่แล้ว

    Эх, как красиво решили... А я как лошпендель решил через использование eval и exec, ахах.

  • @dimontusgaming8362
    @dimontusgaming8362 ปีที่แล้ว

    Хех сам решал эту задачу... Только без лямд так как для меня это сложно. Все сводилось к тому что если def one(): получает пустоту то оно возвращает число return "1" . Действия def plus(number): return "+"+number возвращает действия и число строкой "+1". Вот если в число попадает def one(number): что-то другое. То распарсиваю строку и делаю действия match number[0]: case "+": print(1+number[1]) . Пока моих умений в питоне хвататет только для этого. До лямд функций не дошел да и ООП ещё не начал изучать (((

    • @dimontusgaming8362
      @dimontusgaming8362 ปีที่แล้ว +1

      Было бы классно больше решений задачек с код ворса на канале увидеть.

    • @ArquitectoR
      @ArquitectoR ปีที่แล้ว

      А нафига это преобразование в строку и обратно? В Питоне есть кортежи (tuple), заюзай их.

    • @dimontusgaming8362
      @dimontusgaming8362 ปีที่แล้ว

      @@ArquitectoR История это умалчивает.

  • @RabcriN
    @RabcriN ปีที่แล้ว

    Как давно Медисон стал айтишником?

  • @silkcode3178
    @silkcode3178 ปีที่แล้ว

    А где вы пишите код? Что за редактор ?

    • @t0digital
      @t0digital  ปีที่แล้ว +2

      nvim. Есть на канале видео о настройках

    • @misatokatsuragi9122
      @misatokatsuragi9122 ปีที่แล้ว

      @@t0digital нужно теперь видео про настройку Alacritty) особенно на маке)

    • @daninspace9009
      @daninspace9009 ปีที่แล้ว

      @@misatokatsuragi9122 там настраивать то нечего, открыл example конфиг, там всё подписано что за что отвечает - выставляешь как душа просит

    • @misatokatsuragi9122
      @misatokatsuragi9122 ปีที่แล้ว

      @@daninspace9009 на маке оно как-то через одно место работает) Кривые размеры окна и странность с дубликацией символов при вводе)

    • @daninspace9009
      @daninspace9009 ปีที่แล้ว

      @@misatokatsuragi9122 в конфиге всего 6 значений касательно мака, и не похоже чтобы они могли такое вызывать. Попробуйте use_thin_strokes=false и поставить и разные startup_mode. Но думаю не в конфиге дело

  • @romul23
    @romul23 ปีที่แล้ว

    Я один пошел гуглить продукцию Урюпинского Завода Булавок?

  • @user-pu6us9kg5r
    @user-pu6us9kg5r ปีที่แล้ว

    "five" is not defined какой смысл этого условия?

    • @t0digital
      @t0digital  ปีที่แล้ว

      «five не определен». Какое тут условие? О чем речь?

  • @RomanKardashov
    @RomanKardashov ปีที่แล้ว

    def number_func(number):
    return lambda operator = None: operator(number) if operator else number
    zero, one, two, three, four, five, six, seven, eight, nine = (
    number_func(i) for i in range(10)
    )
    def plus(second):
    return lambda first: first + second
    def minus(second):
    return lambda first: first - second
    def times(second):
    return lambda first: first * second
    def divide_by(second):
    return lambda first: first / second
    assert one(plus(three())) == 4
    assert one(times(three())) == 3
    assert four(times(nine())) == 36
    assert nine(minus(seven())) != three()
    assert nine(minus(seven(plus(two())))) == zero()

  • @av10n91
    @av10n91 ปีที่แล้ว

    from typing import Callable
    class N():
    def __init__(self, n: int) -> None:
    self.n = n
    def __call__(self, mode: (Callable | None) = None) -> int:
    if mode is None:
    return self.n
    return mode(self.n)
    class Operation():
    def __init__(self, att_name: str) -> None:
    self.att_name = att_name
    def __call__(self, n: int) -> Callable:
    return getattr(n, self.att_name)
    plus = Operation('__radd__')
    minus = Operation('__rsub__')
    times = Operation('__rmul__')
    div = Operation('__rtruediv__')
    zero = N(0)
    one = N(0)
    two = N(0)
    three = N(3)
    four = N(4)
    five = N(5)
    six = N(6)
    seven = N(7)
    eight = N(8)
    nine = N(9)
    print(seven(times(five())))

    • @t0digital
      @t0digital  ปีที่แล้ว +1

      Имеет место быть. На кодварс стоит тег у этой задачи functional programming. Не ООП програминг:)

    • @av10n91
      @av10n91 ปีที่แล้ว

      @@t0digital Да я это уже для себя заметил, когда пересмотрел и переосмыслил видео.

  • @shurko
    @shurko ปีที่แล้ว +2

    eight = lambda f = (lambda x : 8) : f(8)
    fourt = lambda f = (lambda x : 4) : f(4)
    div = lambda r : lambda l : l/r
    eight (div (fourt ()))
    Как-то так.

    • @ne4to777
      @ne4to777 ปีที่แล้ว

      ваши способы нужно объединить и получится идеально. То есть добавь вспомогательную функцию, чтоб логика в числах не повторялась (_digit в видео, но только красивенько перепиши)

  • @mlavrentev9106
    @mlavrentev9106 ปีที่แล้ว

    Чот мне кажется, что это линух

  • @masynchin
    @masynchin ปีที่แล้ว

    Вместо убогого None и его проверки, нужно использовать функцию identity (= lambda x: x)

  • @filippov_es
    @filippov_es ปีที่แล้ว

    Прикольная задача, но одна из предыдущих про многократный вызов функций (или объектов) была интереснее))
    Я эту задачку решил без lambd'ы, просто перегонял в строку и потом через eval отдавал результат. С одной стороны нагляднее и проще, с другой стороны скучнее.

    • @rinaatt
      @rinaatt ปีที่แล้ว +1

      eval o_O, акстись, забудь про её существование!

    • @filippov_es
      @filippov_es ปีที่แล้ว

      @@rinaatt а чего б нет? Ей, конечно, с манипулятором типа мышь не потягаться, но тут-то чудесная вещь)

    • @rinaatt
      @rinaatt ปีที่แล้ว +1

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

    • @filippov_es
      @filippov_es ปีที่แล้ว

      @@rinaatt погоди-погоди-пгди.. тут не о комерции речь) Вообще сложно представить реализацию этой функции в комерции. Это как черепашка, чисто для фана)

  • @mike_SSS
    @mike_SSS ปีที่แล้ว

    Опять клавиатуру используешь!(( А как же мышь?

  • @ruslandidyk3172
    @ruslandidyk3172 ปีที่แล้ว

    Вариант с классом:
    named_numbers = ('zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine')
    class Number:
    def __init__(self, value):
    self.value = value
    def __call__(self, func=None):
    return func(self.value) if func else self.value
    for num_name, num_value in zip(named_numbers, range(len(named_numbers))):
    locals()[num_name] = Number(value=num_value)
    def plus(value): return lambda second_value: value + second_value
    print(nine(plus(five())))

    • @masynchin
      @masynchin ปีที่แล้ว

      Вам будет полезно узнать о функции enumerate