Упрощаем if/elif/else используя функции и словари в python
HTML-код
- Опубликовано: 28 сен 2024
- В прошлом видео я показал несколько способов, как избавиться от сложных ветвлений. В этот раз давайте посмотрим как быть в еще более сложных случаях - когда нам надо делать разный набор действий в зависимости от разных условий. Будем использовать словари, функции и labmda-ы вместо if/elif/else.
Предыдущее видео: • Упрощаем конструкции i...
Я в Telegram - t.me/tricky_py...
Канал создан при поддержке сообщества Moscow Python.
Наш RUclips-канал - / @moscowdjangoru
Курсы Learn Python - learn.python.ru/
Благодарю за идею. По отдельности словари, лямбды вроде очевидны. Но подобное их совмещение даже в голову не приходило.
И снова вспомнились слова из одной из книг по языку. В Python все есть объект.
Ждём новых интересных идей и роликов!
Есть еще стандартный модуль operator, в котором функции для всех операторов определены, так что можно его импортировать и писать, например, operator.add вместо lambda x, y: x+y
Еще можно кидать словарь операций в функцию invalid_operation для формирования up-to-date сообщения о поддерживаемых операциях. А то при каждом новом добавлении нужно переписывать exception.
В порядке любопытного развития темы:
Такая комбинация лямбд и словарей - это очень удобно. Но т.к. у нас интерпретируемый язык, а встроенный оптимизатор CPython не умеет (пока) выносить инварианты (да и вообще, по правде говоря, мало чего умеет), то эта штука хоть и выглядит красиво, но при этом во время работы получается примерно следующее:
При каждом вызове функции `do_math4` у нас будут: опять заново создаваться лямбды, опять заново создаваться словарь с ними, и только потом находиться нужная ветка/нужное значение этого словаря. Затем вычисляется сама операция. И потом garbage collection всё убивает в обратном порядке. Очищает ненужный больше словарь, пригодившийся только один раз. Убивает лямбды.
.... а реально, если мы собираемся использовать эту функцию часто - достаточно один раз создать этот словарь (с лямбдами; как уже подсказали в комментариях, можно вообще с функциями из модуля `operator`, но они подойдут только в нашем случае, а в каких-то более сложных задачах могут быть и лямбды). Сделать его глобальной переменной (но как-нибудь «спрятать» её ото всех, кроме этой функции). В результате чего словарь запомнится на всё время выполнения программы, не будет убиваться garbage collector-ом (и память не будет фрагментироваться лишний раз), и каждый вызов функции `do_math4` будет просто находить нужную функцию напрямую, без лишних действий. Эффективно. Хоть и чуточку менее красиво (из-за глобальной переменной).
... но думать о подобных оптимизациях во многих случаях будет преждевременно, и иногда полезно сделать код чуточку более читабельным, пусть и чуточку менее эффективным.
Спасибо за такой развернутый комментарий. Подскажите пожалуйста, как можно спрятать глобальную переменную от всех, кроме этой функции?
А если через класс реализовать? Или я совсем на ООП поехал?
@@flikos Никак. @amyodov перемудрил сам себя. Дело в том, что если переменную спрятать от чего-то, то она перестанет быть глобальной, и сборщик мусора тоже её удалит, как только не останется на неё ссылок. А не удаляет он только глобальную, независимо от ссылок. Замкнутый круг)))
Спасибо. Ваши советы помогают!
Спасибо за видео! Лаконично и по делу
динамический вызов функций через переменную только ухудшают чтение кода и отладку
Канал очень полезный! Хотел уточнить, будут ли видео по паттернам проектирования? В данном случае как раз хорошей практикой ооп будет сделать несколько отдельных функций для каждой операции и скрыть их под «фасадом». Поправьте если я не прав.
Годный контент. С меня подписка.
👍👍👍👍
А зачем вам писать свои функции add, divide, и т.д., не отличающихся логикой от магических __add__, __div__ и т.д.можно же использовать их.
Это показалось простым и понятным примером
Это очень красивое решение !!!
Но лучше бы в Питон добавили switch оператор.
агонь !
Спасибо большое=)
Самой приятное в программирование это то что прогресс своего навыка наглядно видив в упрощающемся коде
Спасибо ! Хороший материал и подача, что большая редкость сегодня ...