Упрощаем 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/

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

  • @FaiverBES
    @FaiverBES 3 года назад +7

    Благодарю за идею. По отдельности словари, лямбды вроде очевидны. Но подобное их совмещение даже в голову не приходило.
    И снова вспомнились слова из одной из книг по языку. В Python все есть объект.
    Ждём новых интересных идей и роликов!

  • @insolor
    @insolor 3 года назад +5

    Есть еще стандартный модуль operator, в котором функции для всех операторов определены, так что можно его импортировать и писать, например, operator.add вместо lambda x, y: x+y

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

    Еще можно кидать словарь операций в функцию invalid_operation для формирования up-to-date сообщения о поддерживаемых операциях. А то при каждом новом добавлении нужно переписывать exception.

  • @amyodov
    @amyodov 3 года назад +10

    В порядке любопытного развития темы:
    Такая комбинация лямбд и словарей - это очень удобно. Но т.к. у нас интерпретируемый язык, а встроенный оптимизатор CPython не умеет (пока) выносить инварианты (да и вообще, по правде говоря, мало чего умеет), то эта штука хоть и выглядит красиво, но при этом во время работы получается примерно следующее:
    При каждом вызове функции `do_math4` у нас будут: опять заново создаваться лямбды, опять заново создаваться словарь с ними, и только потом находиться нужная ветка/нужное значение этого словаря. Затем вычисляется сама операция. И потом garbage collection всё убивает в обратном порядке. Очищает ненужный больше словарь, пригодившийся только один раз. Убивает лямбды.
    .... а реально, если мы собираемся использовать эту функцию часто - достаточно один раз создать этот словарь (с лямбдами; как уже подсказали в комментариях, можно вообще с функциями из модуля `operator`, но они подойдут только в нашем случае, а в каких-то более сложных задачах могут быть и лямбды). Сделать его глобальной переменной (но как-нибудь «спрятать» её ото всех, кроме этой функции). В результате чего словарь запомнится на всё время выполнения программы, не будет убиваться garbage collector-ом (и память не будет фрагментироваться лишний раз), и каждый вызов функции `do_math4` будет просто находить нужную функцию напрямую, без лишних действий. Эффективно. Хоть и чуточку менее красиво (из-за глобальной переменной).
    ... но думать о подобных оптимизациях во многих случаях будет преждевременно, и иногда полезно сделать код чуточку более читабельным, пусть и чуточку менее эффективным.

    • @flikos
      @flikos 2 года назад

      Спасибо за такой развернутый комментарий. Подскажите пожалуйста, как можно спрятать глобальную переменную от всех, кроме этой функции?

    • @ЕгорИванов-ю3ж5р
      @ЕгорИванов-ю3ж5р 2 года назад

      А если через класс реализовать? Или я совсем на ООП поехал?

    • @ДенисМедведев-о7д
      @ДенисМедведев-о7д 7 месяцев назад

      @@flikos Никак. @amyodov перемудрил сам себя. Дело в том, что если переменную спрятать от чего-то, то она перестанет быть глобальной, и сборщик мусора тоже её удалит, как только не останется на неё ссылок. А не удаляет он только глобальную, независимо от ссылок. Замкнутый круг)))

  • @ЕвгенийСергеевич-л7с

    Спасибо. Ваши советы помогают!

  • @urf1n
    @urf1n 2 года назад

    Спасибо за видео! Лаконично и по делу

  • @РоРо-ш8ч
    @РоРо-ш8ч 7 месяцев назад

    динамический вызов функций через переменную только ухудшают чтение кода и отладку

  • @sabirshakirov4034
    @sabirshakirov4034 2 года назад

    Канал очень полезный! Хотел уточнить, будут ли видео по паттернам проектирования? В данном случае как раз хорошей практикой ооп будет сделать несколько отдельных функций для каждой операции и скрыть их под «фасадом». Поправьте если я не прав.

  • @АртемийГаврилов-г2р
    @АртемийГаврилов-г2р 3 года назад +3

    Годный контент. С меня подписка.

  • @RockstarAlexander
    @RockstarAlexander 3 года назад

    👍👍👍👍

  • @nikzvonov2614
    @nikzvonov2614 3 года назад +1

    А зачем вам писать свои функции add, divide, и т.д., не отличающихся логикой от магических __add__, __div__ и т.д.можно же использовать их.

    • @Хитрыйпитон
      @Хитрыйпитон  3 года назад +1

      Это показалось простым и понятным примером

  • @mr.senmax6185
    @mr.senmax6185 Год назад

    Это очень красивое решение !!!
    Но лучше бы в Питон добавили switch оператор.

  • @shelupinin
    @shelupinin 3 года назад +1

    агонь !

  • @xlebylllek321
    @xlebylllek321 3 года назад +1

    Спасибо большое=)

  • @Human-de8nf
    @Human-de8nf Год назад

    Самой приятное в программирование это то что прогресс своего навыка наглядно видив в упрощающемся коде

  • @АнтонШнайдер-д7л
    @АнтонШнайдер-д7л 2 года назад

    Спасибо ! Хороший материал и подача, что большая редкость сегодня ...