Featured Enum вместо Switch ... с использованием лямбда, перечисления, функции закрытия
Извините, я думаю, что немного понял это после просмотра учебника по:
Условия программирования: Замыкания - как их использовать и почему они полезны https://www.youtube.com/watch?v=swU3c34d2NQ
У меня есть некоторые проблемы, вопросы, чтобы попытаться лучше понять код здесь.
в 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()
}
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
при замене в функции ' двенадцать '
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