No video

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

  Рет қаралды 28,014

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

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

Жыл бұрын

Разбираем ещё одну задачку с codewars на функциональное программирование в Python.
Мой курс «Хардкорная веб-разработка» - course.to.digital
Книжный клуб Ботаним!, где мы читаем хорошие ИТ-книги: botanim.to.dig...
Telegram: t0digital.t.me
/****************** about ******************/
Меня зовут Алексей Голобурдин, я программирую с 2004 года и на этом канале делюсь своим опытом. Я основатель и руководитель компаний:
- Диджитализируй digitalize.team, разрабатываем сложные IT системы для бизнеса;
- Salesbeat salesbeat.pro, комплексный модуль доставки для интернет магазинов.
Telegram канал - t.me/t0digital
ВК - digital...
RuTube - rutube.ru/chan...
Дзен - dzen.ru/id/623...

Пікірлер: 215
@Maniakalochka
@Maniakalochka Жыл бұрын
Очень хочу ещё видео с решением задачек на codewars в вашем исполнении. Это, наверняка, будет интересно не только мне :-)
@drakutont
@drakutont Жыл бұрын
Лучшая рекламная интеграция!
@theencryptedpartition4633
@theencryptedpartition4633 Жыл бұрын
Вот бы в каждым видео в ютубе было так
@m0zg153
@m0zg153 Жыл бұрын
За булавки однозначно лайк
@symbolminded5167
@symbolminded5167 Жыл бұрын
Откуда пошел мем?
@t0digital
@t0digital Жыл бұрын
@@symbolminded5167 какой?
@symbolminded5167
@symbolminded5167 Жыл бұрын
@@t0digital С У(к)рюпинским заводом булавок
@Sadownick
@Sadownick Жыл бұрын
Ну как и всегда, отличная подача материала и простое и понятное объяснение, однозначно лайк 👍🏻
@negonifas
@negonifas Жыл бұрын
ЭТО ВЕЛИКОЛЕПНО! Смотреть и слушать ПРОЦЕСС в вашем исполнении. Со времён когда вы мне объяснили за лямбду, уже это теперь самый доходчивый способ передачи знаний.
@gheorgheprodan6143
@gheorgheprodan6143 Жыл бұрын
Какое совпадение. Именно и за этой задачки я бросил решать каты на codewars. Я не мог ни как её решить. Понял что ничего не понимаю в функциях. Но теперь я всё понял и могу продолжить мой путь самурая. 🤺 Спасибо Алексей! 👏
@ne4to777
@ne4to777 Жыл бұрын
переходи на js там более наглядно с функциями работать.
@user-co6qk3hl9z
@user-co6qk3hl9z Жыл бұрын
@@ne4to777 Знание ФП не зависит от ЯП.
@ne4to777
@ne4to777 Жыл бұрын
@@user-co6qk3hl9z , перечитай ещё раз мой коммент более вдумчиво.
@krev3
@krev3 Жыл бұрын
Очень залипчивая задача. Попалась месяц назад на codewars, и просидел с ней несколько ночей. Аж голова разболелась. На удивление, ход разсуждений совпал как у автора в ролике. Решение было подобным но без лямбда, попроще. Столько нового узнал по теории пока решал. И как точно подметили в коментах: пока мозги правильно не повернёшь, трудно начать рассуждать как автор ролика. Спасибо за задачу и разбор. Уже захотелось опять вернуться в codewars. 👏
@MrAnetto
@MrAnetto Жыл бұрын
Я бы реализовал операции так def plus(number): return number.__add__ т.е. мы возвращаем функцию переданного аргумента. Тогда four(plus(nine())) развернётся в 9.__add__(4) ps: кстати, в таких задачах нередко стоит знать классическую "обратная польская запись"
@undefinedundefined2459
@undefinedundefined2459 Жыл бұрын
а с минусом/делением как? например, seven(minus(five())) развернется ведь не в ту сторону (5 - 7)
@arthur_koba
@arthur_koba Жыл бұрын
Я не эксперт, но вроде задачка про функциональное программирование, без ООП.
@MrAnetto
@MrAnetto Жыл бұрын
@@arthur_koba в питоне всё объект, и операция плюс вызывает магический метод __add__. То есть a+b и a.__add__(b) - эквивалентные записи одного и того же
@MrAnetto
@MrAnetto Жыл бұрын
@@undefinedundefined2459 отличный вопрос :) Казалось бы, что нам нужны методы плюс __add__, минус - __sub__, целочисленное деление __floordiv__, умножение __mul__. Прелесть в том, что для не-коммутативных методов (важен порядок, типа минус и деление) есть "правосторонние" аналоги. То есть a.__sub__(b)==a-b, а есть a.__rsub__(b)==b-a. То есть буковка R в начале говорит о другом порядке операндов. Итого берём __add__, __rsub__, __rfloordiv__, __mul__, и всё работает как планировалось
@arthur_koba
@arthur_koba Жыл бұрын
@@MrAnetto это понятно, что все объект. Но задача скорее всего ограничена применением функционального программирования, без использования магических методов. И её не обязательно решать на python, можно взять и другой язык скорее всего, и реализовать тоже самое на тех же самых лямбда функциях.
@nickolasmaslow7041
@nickolasmaslow7041 Жыл бұрын
Спасибо за Ваш труд! Я считаю Ваш канал самым лучшим в сфере программирования на Python, более понятных и атмосферных видео я не видел.
@donfedor007
@donfedor007 Жыл бұрын
Круть! Интересное решение! Я заморочился с оператором типа add и передавал их, но Ваше решение очень элегантное 💪👍
@danilgaleev4359
@danilgaleev4359 Жыл бұрын
Привет! Когда планируется третья часть по разработке вашей системы для донатов? Очень жду, хочется посмотреть продолжение) Спасибо за классный, полезный и увлекательный контент!
@rinaatt
@rinaatt Жыл бұрын
Можно еще вспомнить про пакет operator и functools, в частности про functools.partial
@TheAutonomoos
@TheAutonomoos Жыл бұрын
Сам бы я до такого использования лямбда функций вряд ли дошел. Спасибо, что делишься опытом!
@VGCor
@VGCor Жыл бұрын
Как раз недавно решал такую задачу на упомянутом сайте. Лайк за рекламу! Нужно больше годной рекламы в роликах!
@boobatrustahimmortal
@boobatrustahimmortal Жыл бұрын
Спасибо автору и таким же авторам как и ты! Благодаря вам моя стоимость на рынке только возрастает, а предложения по работе уже начинают доставать, как спам.
@andreykulikov3760
@andreykulikov3760 Жыл бұрын
Мощно, спасибо!
@diplspec5758
@diplspec5758 Жыл бұрын
Круто! Было полезно! Спасибо!
@alvares2729
@alvares2729 Жыл бұрын
Решение кажется очевидным. Сам сразу же подумал про такое же, не вникая в синтаксис. Но вот чтоб чз лямбда функцию сделать, никогда бы не догадался сам. Не знал что можно не передавая в функцию аргумент/число работать с ним. Думаю про лямбда функции можно еще отдельный видос выложить, обо всех хитростях. Наверняка есть еще n+ трюков о к. я не знал
@clauseclause6640
@clauseclause6640 Жыл бұрын
Можно было вынести логику из операторов в отдельную функцию, и оттуда передавать или метод из библиотеки operator, ну или просто передавать имя магического метода, типа `__add__` и в функции просто применять его через getattr
@Vjidowkdkcpapqkfjfw
@Vjidowkdkcpapqkfjfw Жыл бұрын
Спасибо!
@igorratnik2357
@igorratnik2357 Жыл бұрын
Спасибо))) Хороший формат)))
@user-qd5bg5sw7k
@user-qd5bg5sw7k Жыл бұрын
Великолепно!
@user-dz6by9gb9y
@user-dz6by9gb9y Жыл бұрын
Я думал фишка задачи в том, что функции динамически в коде объявляются. И что-то вроде такого решения вижу: 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 Жыл бұрын
@@user-dz6by9gb9y exec это антипаттерн. Я не знаю нормальных сценариев его использования. Наверное, можно что-то придумать, но тут он точно не нужен. Способы не писать отдельно определения функций one-two есть и так, в комментах здесь или в телеге упоминались
@jth.000
@jth.000 Жыл бұрын
1:23. Я не поленился и загуглил. Так вот, в Урюпкинске есть только крановый завод ;(
@t0digital
@t0digital Жыл бұрын
Завод булавок просто ещё не раскрутился! Но мы ему поможем!
@PlanSK
@PlanSK Жыл бұрын
Спасибо, Алексей! Отличная подача материала, как глоток свежего воздуха, когда смотришь ролик с кодингом и не хочется заснуть!
@t0digital
@t0digital Жыл бұрын
Спасибо!
@cs_dequeue
@cs_dequeue Жыл бұрын
Спасибо за разбор! Определенно было полезно!
@k1kk2k91
@k1kk2k91 Жыл бұрын
Спасибо за отличную подачу, лайк!
@r735g3
@r735g3 Жыл бұрын
А можно ссылку на саму задачу на Code wars? Хочу попробовать сам решить прежде чем смотреть разбор
@t0digital
@t0digital Жыл бұрын
www.codewars.com/kata/525f3eda17c7cd9f9e000b39/train/python
@alvaresification
@alvaresification Жыл бұрын
некоторые другие решения этой задачи на codewars впечатляют, оказывается подходов к решению далеко не один
@egorletov8686
@egorletov8686 Жыл бұрын
Для тех, кому нужна задача. 5 kuy ката, название "Calculating with Functions" Может называлась в видео, извините.
@Vjidowkdkcpapqkfjfw
@Vjidowkdkcpapqkfjfw Жыл бұрын
спасибо! как раз ищу!
@user-ir4vd5yk4x
@user-ir4vd5yk4x Жыл бұрын
Спасибо)
@DeSpectraLDemon
@DeSpectraLDemon Жыл бұрын
8:56 в first_operand передается 7 по причине ...? Значение первого по порядку аргумента, переданного лямбда функции, присваивается первой по порядку переменной, объявленной в лямбда функции? Т.е. например чтобы испортить реализацию, мы можем в _digit() вызвать operator(number, -1), тогда значение second_operand будет всегда -1?
@r35p3ct00
@r35p3ct00 Жыл бұрын
Спасибо спонсору😁
@georgestatefield
@georgestatefield Жыл бұрын
🤣 Браво Урюпкинскому Заводу Булавок!
@user-vx1zf6pn9r
@user-vx1zf6pn9r Жыл бұрын
Чем Вам 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 Жыл бұрын
Один из вариантов, да. У меня тоже есть лямбды, они всем мне угодили:)
@user-vx1zf6pn9r
@user-vx1zf6pn9r Жыл бұрын
Не осуждаю, а подмечаю
@user-vx1zf6pn9r
@user-vx1zf6pn9r Жыл бұрын
@@t0digital Просто расписывать однострочные функции, когда БОЖЕСТВЕННАЯ ЛЯМБДА не канонично (ирония). Решил сам без мам и пап, потом глянул решение) Спасибо за контент)
@kutsokon
@kutsokon Жыл бұрын
Кто куда, а я в Урюпинский завод булавок прикалывать свою мечту
@artyommart
@artyommart Жыл бұрын
Здраствуйте Диджитализируй! Я изучаю Python уже несколько месяцев но волнуюсь что не смогу найти работу в web(Django) или в других сферах. Python и вправду используют много в профессиональной разработке? Какие известные приложения написаны на нем? Заранее спасибо
@andreiosipov2766
@andreiosipov2766 Жыл бұрын
А что вы подразумеваете под программами? То, что на компьютер устанавливается? В таком случае - никакие. А вот какие-то сервисы, бекенды, внутренние иснтрументы компаний, прикладные задачи в различных сферах - этого очень много написано.
@t0digital
@t0digital Жыл бұрын
Запрещенный instagram на python+django, например. Но в почти любом большом веб-сервисе есть код на python, уверен в этом. Самый популярный скриптовый язык в мире потому что:)
@user-jn4cq9dy3f
@user-jn4cq9dy3f Жыл бұрын
Всё ждал, когда всплывёт "магия"... ;))) Зачем lambda, когда у int есть методы ___add__, __sub__, __mul__, __div___
@t0digital
@t0digital Жыл бұрын
В контексте простых математических операторов можно было ими воспользоваться, да. Но если задача расширится до более сложных примеров, то подход с lambda будет универсальным и позволит реализовать что-то, чего нет в магических методах.
@szizoid4987
@szizoid4987 Жыл бұрын
Замудренное какое-то решение в ролике. Я решил через строки и функцию 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 антипаттерн
@svfastunov
@svfastunov Жыл бұрын
Нет в Урюпинске завода булавок. Трикотажная фабрика есть.
@t0digital
@t0digital Жыл бұрын
Просто не раскрутился ещё. Поможем!
@Mralex22801
@Mralex22801 Жыл бұрын
Не нашёл в описании ссылки на Урюпкинский завод булавок?! За что вам только платят.
@gnompirogov9259
@gnompirogov9259 Жыл бұрын
очень полезно и интересно
@99phenomenon
@99phenomenon Жыл бұрын
Thx!)
@m-fusion
@m-fusion Жыл бұрын
Решал эту задачку на js. В принципе ничего сложного, если мозг повернут на ФП. Но первый раз ломает мозг.
@slaviksemen4919
@slaviksemen4919 Жыл бұрын
Где купить булавки?🙂
@fedorivanov8420
@fedorivanov8420 Жыл бұрын
Что нравится на канале: подача, профессионализм, умение пользоваться ИДЕ. Что хочется улучшить: лоХика, проХрамма, ТАПАЛ 🤣🤣
@maxwaterman2052
@maxwaterman2052 Жыл бұрын
Не питонист, но задачка интересная! Ушел за булавками.
@user-lg6dt3jf1j
@user-lg6dt3jf1j Жыл бұрын
Не понял, где ссылка на Урюпкинский завод булавок?
@user-gl5qq5ru1v
@user-gl5qq5ru1v Жыл бұрын
Надеюсь продажи у завода булавок подскочили после рекламы 😊
@t0digital
@t0digital Жыл бұрын
Уверен! Помогли заводу!
@StanislavBeskaev
@StanislavBeskaev Жыл бұрын
Непривычно видеть Алексея небритым
@user-ov5hf3cl3k
@user-ov5hf3cl3k Жыл бұрын
как попасть на завод , Урюпинский, булавки нужны.
@MrGeralt67
@MrGeralt67 Жыл бұрын
Все-таки непонятно каким образом в функции, которая реализует операцию, например minus, происходит подстановка значения переменной first_operand. Эта переменная не является параметром функции minus.
@shurko
@shurko Жыл бұрын
Или даже так [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))
@Andrey-iq1ls
@Andrey-iq1ls Жыл бұрын
Честно говоря, я в программировании, дв и в IT в целом полное днище, но как натолкнулся на канал Алексея - смотрю взахлёб. Это какой-то абсолютно новый опыт и мотивация для меня, спасибо большое!
@t0digital
@t0digital Жыл бұрын
Спасибо, рад слышать!
@user-dj4vn5md1x
@user-dj4vn5md1x Жыл бұрын
Урюпкинский завод булавок ❤️
@comisarrex5961
@comisarrex5961 Жыл бұрын
интересно будет услышать твое мнение про pyscript
@MACTEP-XPEHACTEP
@MACTEP-XPEHACTEP Жыл бұрын
Блин, как-то не могу понять, как в first_operand попадает значение? оно берется из общего нейм спейса откуда-то?
@ArquitectoR
@ArquitectoR Жыл бұрын
Оно передаётся при вызове лямбды
@drygdryg2
@drygdryg2 Жыл бұрын
Хочу добавить, что в данном решении лямбда-функции, которые возвращают функции-операторы (plus, minus, times, divided_by), можно классифицировать как замыкания (closures). Замыкание - это функция, которая находится внутри другой функции и ссылается на переменные объявленные в теле внешней функции.
@mikeofs1304
@mikeofs1304 Жыл бұрын
Это они и есть. Собственно полноценно реализовать лямбда исчисление без замыканий невозможно
@mafiya25
@mafiya25 Жыл бұрын
Прикольно А через декораторы это как-то можно замутить?
@mlr__roal_6867
@mlr__roal_6867 Жыл бұрын
А где ссылка на булавки?
@user-kmv89
@user-kmv89 Жыл бұрын
Спасибо, как раз бился над этой задачей месяц назад, и так и не решил ее
@pokruk0
@pokruk0 Жыл бұрын
Прикольно, но хотелось бы что-то по-сложнее
@普京的手机
@普京的手机 3 ай бұрын
int(a / b) не всегда равно a // b
@cyber_engine
@cyber_engine Жыл бұрын
Какая извращенная задача. Прям как я люблю.
@user-yy6dx1wj9r
@user-yy6dx1wj9r Жыл бұрын
А где ссылка на задачку? Может перед видосом сам решить захотел?)
@user-xm1mq2sn1e
@user-xm1mq2sn1e Жыл бұрын
Эта задача как раз в не решённых у меня лежала. Я про неё и забыл уже. А тут - раз! :) Спасибо, круто. А что вообще скажете на счёт Codewars и иже с ним? Я там уже три месяца. До 3 kyu дорос (на полпути ко 2-му). И вот думаю, хватит ли базы для того, чтобы переходить к каким-то фреймворкам?.. По каким критериям можно оценить свою базовую подготовку? Слышал мнение, что на hackerrank более реальные задачи... Что скажете?
@user-pv9ly4pq2j
@user-pv9ly4pq2j Жыл бұрын
давно пора) 3 кью - это уже довольно потно, особенно если получается решать задачи похожим на best practices образом. вообще для работы на фреймворках прокаченные алгоритмы не нужны, достаточно знать базовые вещи, типа big O notation. Полезнее будет прокачать понимание ООП. а вообще, работа программистом - это не столько про само программирование, сколько про инструменты вокруг этого. У бэкендеров, например, это БД, гит, контейнеризация, сети, архитектура приложений в целом.
@Kosty1024Bit
@Kosty1024Bit Жыл бұрын
Классно, круто. Но на всякий случай, в питоне уже есть операция целочисленного деления - //
@siberianwolf777
@siberianwolf777 Жыл бұрын
На code wars есть похожие задачи. Реализация только на лямбда функциях. Т.е реализация только в алгебре черча. Вот это сложно, по сравнению с этой задачей.
@masson6359
@masson6359 Жыл бұрын
ну конечно решение не лучшее) Хардкод + повторение. мне кажется здесь неплохо можно использовать map + lambda.
@t0digital
@t0digital Жыл бұрын
Можно, да. Не стал рефачить усложнять код. Помимо DRY не стоит забывать про KISS. DRY он про то, что в случае изменений придется изменить что-то в нескольких местах. В данном случае эти несколько мест находятся непосредственно рядом друг с другом и изменения не будут проблемой. А вот нагромождения мапов и лямбд понимание кода в значительной степени усложнят. А вместе с тем и увеличится вероятность багов, к слову.
@masson6359
@masson6359 Жыл бұрын
@@t0digital зато красиво) я даже видел решение вида просто импортировать операторы из питоновский библиотеки))) а цифры задать тем же мапом
@damirkayumov6574
@damirkayumov6574 Жыл бұрын
А в Урюпинске разве есть завод булавок? Мне кажется надо тщательней спонсоров подбирать. А то и к основной теме недоверие появляется!
@t0digital
@t0digital Жыл бұрын
Конечно, есть! Специальный Урюпинский завод булавок
@pennypy
@pennypy Жыл бұрын
Ответ - 42
@davidalkamyan2856
@davidalkamyan2856 Жыл бұрын
Хотелось бы ссылку на задание на самом Codewars. Заранее спасибо.
@t0digital
@t0digital Жыл бұрын
Поищите тут в комментах, уже давал
@user-hs6lj9zt4p
@user-hs6lj9zt4p Жыл бұрын
Алексей, скажите, если бы вы стали делать , например, сайт знакомст, то бэкэнд и фронтенд на каком языке начали делать?
@t0digital
@t0digital Жыл бұрын
Фронт на solidjs, бэк на fastapi, но возможно с частями на других языках вроде go или rust
@user-hs6lj9zt4p
@user-hs6lj9zt4p Жыл бұрын
@@t0digital спасибо за ответ!
@dimontusgaming8362
@dimontusgaming8362 Жыл бұрын
@@t0digital Раст на канале ждём. будет круто
@qulinxao
@qulinxao Жыл бұрын
примечательна асимметрия с выносом _digit и без аналогичного выноса _function
@t0digital
@t0digital Жыл бұрын
Не понял, какой _function?
@qulinxao
@qulinxao Жыл бұрын
@@t0digital который подобно _digit действует но не над неизменными а над вызываемыми - об том и речь асимметрия восприятия у реализатора данных которые объект действия и функции которые субъект действия - хотя по задаче разнице нет ваще есть вызываемые имена которые имеют два поведения когда без арга и когда с аргом
@arxxximed
@arxxximed Жыл бұрын
Хм а если я решу задачу без лямбда, и вообще без возврата функций? Интересно, а вообще часто используют возврат функций на практике?
@ArquitectoR
@ArquitectoR Жыл бұрын
Да, часто используют. Эту задачу можно решить без них, достаточно из функций-операторов возвращать кортеж из действия и второго операнда, а в _digit его обрабатывать.
@tgakatiger
@tgakatiger Жыл бұрын
kzfaq.info/get/bejne/a6lmptloksu4e5s.html - прекрасное руководство по функциональщине
@geri_freki
@geri_freki Жыл бұрын
Спасибо за ссылку! Смотрю сейчас - реально крутая лекция.
@sergeyhets3395
@sergeyhets3395 Жыл бұрын
Зочем лямбды, когда можно сделать на partial более элегантное решение?
@t0digital
@t0digital Жыл бұрын
Зачем partial, когда можно сделать на лямбдах)? Есть тонна разных вариантов, на любой извращенческий вкус и цвет)
@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 непонимание обусловленно кривизной истории не будь ответвления Алголов с их строгой вложенностью не было бы Схемы какой она стала
@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 Жыл бұрын
@@geri_freki , можно, конечно, так и надо делать, но я сделал, чтоб больше на то, что в видео было похоже: const [one, two, three] = [1, 2, 3].map(number)
@geri_freki
@geri_freki Жыл бұрын
​@@ne4to777 круто! здесь в комментах рекомендовали видео kzfaq.info/get/bejne/a6lmptloksu4e5s.html уже неделю его частями смотрю - пытаюсь самостоятельно написать лямбда-функции, когда лектор это предлагает. Причем у него какой-то кастомный IDE - можно реально писать код в упрощенной λ-нотации и он выполняется как обычный python-код, типа: AND = λxy.xyx 😀это как lambda x: lambda y: x(y)(x)
@ne4to777
@ne4to777 Жыл бұрын
@@geri_freki , в программировании как таковые лямбды не нужны, это просто гимнастика для ума, и выглядит как новый синтаксис для языка. Просто относись к ним как функции, которые возвращают функции и все, этого достаточно. В js это поняли и сделали новый оператор =>. В питоне, видимо, решили все усложнить и ввели грозное слово lambda, зачем непонятно.
@sikelmon
@sikelmon Жыл бұрын
Склейки мешают моему обучению Виму + нет вывода нажатых клавиш. Прошу учесть ))))))
@nucluster
@nucluster Жыл бұрын
Так, я не понял, а где фраза "ссылка в описании"? 😬😁
@robbarret9568
@robbarret9568 Жыл бұрын
А второй способ где?
@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
@idensas
@idensas Жыл бұрын
Эх, как красиво решили... А я как лошпендель решил через использование eval и exec, ахах.
@user-vx6mj6ul3n
@user-vx6mj6ul3n Жыл бұрын
Было бы ещё интересно реализовать вот такую логику: >>> five 5 >>> five.times.two 10 >>> five.times.two.minus.three 7 Как вам задачка?
@drygdryg2
@drygdryg2 Жыл бұрын
Что-то подобное реализовано в пакете schedule (можно найти в PyPI).
@arxxximed
@arxxximed Жыл бұрын
Эх жаль тут "два плюс два , деленное на два " не сработает ))
@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()
@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 Жыл бұрын
Было бы классно больше решений задачек с код ворса на канале увидеть.
@ArquitectoR
@ArquitectoR Жыл бұрын
А нафига это преобразование в строку и обратно? В Питоне есть кортежи (tuple), заюзай их.
@dimontusgaming8362
@dimontusgaming8362 Жыл бұрын
@@ArquitectoR История это умалчивает.
@testing...9127
@testing...9127 Жыл бұрын
О! Я первый?
@kutyurin
@kutyurin Жыл бұрын
У вас глаза не устают от компьютера? Как с этим бороться?
@t0digital
@t0digital Жыл бұрын
Если устают - то чаще отдыхать. Делать перерывы. У меня тоже, наверное, устают, не знаю
@shurko
@shurko Жыл бұрын
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 в видео, но только красивенько перепиши)
@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 Жыл бұрын
Имеет место быть. На кодварс стоит тег у этой задачи functional programming. Не ООП програминг:)
@av10n91
@av10n91 Жыл бұрын
@@t0digital Да я это уже для себя заметил, когда пересмотрел и переосмыслил видео.
@user-pu6us9kg5r
@user-pu6us9kg5r Жыл бұрын
"five" is not defined какой смысл этого условия?
@t0digital
@t0digital Жыл бұрын
«five не определен». Какое тут условие? О чем речь?
@RabcriN
@RabcriN Жыл бұрын
Как давно Медисон стал айтишником?
@the_king_dusty
@the_king_dusty 2 ай бұрын
Зачем там столько лишнего кода? Декларативность она ни в том, чтобы написать много кода.
@mlavrentev9106
@mlavrentev9106 Жыл бұрын
Чот мне кажется, что это линух
@creativesolution4827
@creativesolution4827 Жыл бұрын
я второй
@mike_SSS
@mike_SSS Жыл бұрын
Опять клавиатуру используешь!(( А как же мышь?
@silkcode3178
@silkcode3178 Жыл бұрын
А где вы пишите код? Что за редактор ?
@t0digital
@t0digital Жыл бұрын
nvim. Есть на канале видео о настройках
@misatokatsuragi9122
@misatokatsuragi9122 Жыл бұрын
@@t0digital нужно теперь видео про настройку Alacritty) особенно на маке)
@daninspace9009
@daninspace9009 Жыл бұрын
@@misatokatsuragi9122 там настраивать то нечего, открыл example конфиг, там всё подписано что за что отвечает - выставляешь как душа просит
@misatokatsuragi9122
@misatokatsuragi9122 Жыл бұрын
@@daninspace9009 на маке оно как-то через одно место работает) Кривые размеры окна и странность с дубликацией символов при вводе)
@daninspace9009
@daninspace9009 Жыл бұрын
@@misatokatsuragi9122 в конфиге всего 6 значений касательно мака, и не похоже чтобы они могли такое вызывать. Попробуйте use_thin_strokes=false и поставить и разные startup_mode. Но думаю не в конфиге дело
@masynchin
@masynchin Жыл бұрын
Вместо убогого None и его проверки, нужно использовать функцию identity (= lambda x: x)
@Markisi0
@Markisi0 Жыл бұрын
А откуда взялся print в вызове? Если без него, то я бы "в лоб" решил решил так def one(*args): return 1 if not args else eval("1"+args[0]) def two(*args): return 2 if not args else eval("2"+args[0]) def three(*args): return 3 if not args else eval("3"+args[0]) def four(*args): return 4 if not args else eval("4"+args[0]) def five(*args): return 5 if not args else eval("5"+args[0]) def six(*args): return 6 if not args else eval("6"+args[0]) def seven(*args): return 7 if not args else eval("7"+args[0]) def eight(*args): return 8 if not args else eval("8"+args[0]) def nine(*args): return 9 if not args else eval("9"+args[0]) def zero(*args): return 0 if not args else eval("0"+args[0]) def plus(arg): return f'+{str(arg)}' def minus(arg): return f'-{str(arg)}' def times(arg): return f'*{str(arg)}' def divided_by(arg): return f'//{str(arg)}' seven(times(five())) four(plus(nine())) eight(minus(three())) six(divided_by(two()))
@ythosa2467
@ythosa2467 Жыл бұрын
Перемудрил в конце с объяснением. Уже после того, как ты код написал + из твоих мыслей, пока ты его писал, стало ясно, как это работает. Объяснение вышло нудным и запутывающим имхо
⚡Python 3.11 - СКОРОСТНОЙ горячий пирожочек!
21:42
Диджитализируй!
Рет қаралды 87 М.
#1. Читаем исходники open source Python библиотек. Loguru!
58:19
Диджитализируй!
Рет қаралды 89 М.
Look at two different videos 😁 @karina-kola
00:11
Andrey Grechka
Рет қаралды 8 МЛН
WORLD'S SHORTEST WOMAN
00:58
Stokes Twins
Рет қаралды 169 МЛН
小宇宙竟然尿裤子!#小丑#家庭#搞笑
00:26
家庭搞笑日记
Рет қаралды 30 МЛН
Kids' Guide to Fire Safety: Essential Lessons #shorts
00:34
Fabiosa Animated
Рет қаралды 11 МЛН
Иностранцы обсуждают русскую классику 🤯 Гоголь, Достоевский, Чехов | Skyeng 📚
27:42
Skyeng: онлайн-школа английского языка
Рет қаралды 113 М.
Задача из Собеседования на 160,000 Евро в Год
13:27
Саша Лукин
Рет қаралды 1,1 МЛН
How To Learn Algorithms? Why? #codonaft
19:22
codonaft
Рет қаралды 568 М.
Look at two different videos 😁 @karina-kola
00:11
Andrey Grechka
Рет қаралды 8 МЛН