Вопросы о: Featured Enum вместо Switch ... с использованием лямбда, перечисления, функции закрытия - PullRequest
0 голосов
/ 07 мая 2020

Featured Enum вместо Switch ... с использованием лямбда, перечисления, функции закрытия

Извините, я думаю, что немного понял это после просмотра учебника по:

Условия программирования: Замыкания - как их использовать и почему они полезны https://www.youtube.com/watch?v=swU3c34d2NQ

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

  1. в pycharm:

    switcher = {                # info : dictionary
                ...
                11: eleven,
                12: twelve      # info : enum def twelve() -> str
     }
    

    при наведении указателя мыши на 'switcher' -> информация: dictionary

    при наведении указателя мыши на 'элемент' переключателя -

    пр. двенадцать из 12: twelve -> информация: enum def twelve() -> str

    Как происходит соединение, отношение к функции здесь?

    12: twelve --> info : enum   def twelve() -> str
    

    Почему НЕ to be with () - скобка?

    Точно так же, как вызов функции - functionname() (в словаре)

    вот так?

    switcher = {  
                ...
                11: eleven(),
                12: twelve()
     }
    
  2. in 'switcher.get(argument, lambda: (" ...',

    • IF true: возвращаемое значение: аргумент [если исключено] в противном случае

      Иначе : [ НЕТ ] значение по умолчанию

    • какова цель или значение 'lambda' здесь?

      Если Я заменяю его строкой, это вызывает ошибку.

      func = switcher.get(argument, 'Invalid month [1-12]') # TypeError: 'str' object is not callable

      Как я это ощущаю, это просто для создания функции. Без него не работает.

      Итак, почему это должна быть функция (лямбда)?

      (если я правильно понимаю эту часть)

      https://docs.python.org/3/library/stdtypes.html#dict .get

  3. при замене в функции ' двенадцать '

    def twelve(): return ("December")

    на

    return ("December : {input}".format(input=argument))

    Чтобы показать аргумент: ' аргумент ', это приводит к

    NameError: name 'argument' is not defined

    Как это Можно ли передать функции аргумент ?

    (Я использовал ту же самую переменную, но это может быть любой другой тип переменной, экземпляр, список, словарь, набор, строка .. .)


код

#!/usr/bin/env python3

def one():
   return "January"


def two():
   return "February"


def three():
   return "March"


def four():
   return "April"


def five():
   return "May"


def six():
   return "June"


def seven():
   return "July"


def eight():
   return "August"


def nine():
   return "September"


def ten():
   return "October"


def eleven():
   return "November"


def twelve():
# def twelve(argument):
   print(' --- in function :  twelve')
#   print(' --- in function :  twelve : {input}'.format(input=argument))    # results in a NameError: name 'argument' is not defined
   return ("December")
#   return ("December  : {input}".format(input=argument))                   # results in a NameError: name 'argument' is not defined

def numbers_to_months(argument):
   # switcher - dictionary with all months
   switcher = {
       1: one,
       2: two,
       3: three,
       4: four,
       5: five,
       6: six,
       7: seven,
       8: eight,
       9: nine,
       10: ten,
       11: eleven,
       12: twelve      # enum def twelve() -> str
       # 12: twelve(argument)

   }
   # get the function from switcher dictionary
   func = switcher.get(argument, lambda: ("Invalid month [1-12] : your input : {input}".format(input=argument)))

   # more information
   print(" - switcher.get : {info}  -  {arg}".format(info=switcher.get(argument), arg=argument))
   print(" - func : {info}  -  {arg}".format(info=func, arg=argument))

   # execute the function
   print(func())
   print()


numbers_to_months(13)

numbers_to_months(3)

numbers_to_months(12)

numbers_to_months(31)


Решение от Михаила Хайхана, и спасибо.

Каждая функция от 1 до 12 должен принимать аргумент (ы) / параметр (ы)

  ...
    def twelve(argument):
        print(' --- in function :  twelve : {input}'.format(input=argument))
        ...


    func = switcher.get(argument, lambda arg : ("Invalid month [1-12] : your input : {input}".format(input=argument)))



...
print(func(78))

Исходный код / ​​руководство: https://jaxenter.com/implement-switch-case-statement-python-138315.html

1 Ответ

1 голос
/ 08 мая 2020
  1. В python есть вещь, которая называется функциональным объектом. Вы создаете его, когда объявляете новую функцию.

    def func(arg):
        print(arg)
        return arg
    

Итак, теперь func - это объект. Вы можете сохранить его где-нибудь, например, в dict (как и вы) и использовать позже. И вы можете назвать его func(1) и получить результат. Pycharm достаточно умен, чтобы найти, где вы объявили методы, и показать вам информацию об этом.

Ваш коммутатор должен возвращать функциональный объект, то есть вызывать позже

print(func()) # << here, see brackets after func

Таким образом, объект по умолчанию также должен быть функциональным объектом. Лямбда - это еще один способ его создания. Смотрите здесь https://book.pythontips.com/en/latest/lambdas.html

Вы можете передавать аргументы функциям, но дело не в этом. Здесь функция IS аргумент, который берется из переключателя ключом и передается в print.

UPD Вы можете передать аргументы функции, которую вы сохранили ранее, при ее вызове. Давайте попробуем это с моим предыдущим примером:

d = {'func': func} # store function
result = d['func'](1) # get stored function and call it with argument
print(result)

Вывод:

1
...