python - 有关问题:Featured Enum 而不是 Switch ... 使用 lambda、枚举、闭包函数
问题描述
使用 lambda、枚举、闭包函数来代替 Switch 的精选枚举
对不起,我认为在看了一个关于以下内容的教程后我明白了一点:
编程术语:闭包 - 如何使用它们以及它们为何有用 https://www.youtube.com/watch?v=swU3c34d2NQ
我有一些问题,想在这里更好地理解代码。
在 pycharm 中:
switcher = { # info : dictionary ... 11: eleven, 12: twelve # info : enum def twelve() -> str }
如果我将鼠标悬停在 '
switcher
' --> info 上:dictionary
如果我将鼠标悬停在切换器的“元素”上-
前任。十二个
12: twelve
--> 信息:enum def twelve() -> str
与这里的功能的连接,关系如何?
12: twelve --> info : enum def twelve() -> str
为什么不使用() - 括号?
就像调用一个函数 - by
functionname()
(在字典中)像这样?
switcher = { ... 11: eleven(), 12: twelve() }
在'
switcher.get(argument, lambda: (" ...
',IF true : 返回值 : 参数 [if excist] 否则
ELSE : [无] 默认值
lambda
' ' 在这里的目的或意义是什么?如果我用字符串替换它,它会引发错误。
func = switcher.get(argument, 'Invalid month [1-12]') # TypeError: 'str' object is not callable
我如何体验它,那只是为了创建一个功能。没有它是行不通的。
那么为什么它必须是一个函数(lambda)?
(如果我理解那部分是正确的)
当我在函数“十二”中替换时
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)
Michail Highkhan 的解决方案,谢谢。
从一到十二的每个函数都必须接受参数/参数
...
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
解决方案
python中有一个东西,叫做函数对象。您在声明新功能时创建一个。
def func(arg): print(arg) return arg
所以现在func
- 是对象。您可以将它存储在某个地方,例如在字典中(就像您所做的那样)并稍后使用它。你可以调用它func(1)
并得到一个结果。Pycharm 足够聪明,可以找到您声明方法的位置并向您显示有关它的信息。
您的切换器必须返回函数对象,即稍后调用
print(func()) # << here, see brackets after func
所以默认对象也必须是函数对象。Lambda 只是创建它的另一种方式。看这里https://book.pythontips.com/en/latest/lambdas.html
- 您可以将参数传递给函数,但这不是重点。这里的函数 IS 参数,通过键从 switcher 中获取并传递给
print
.
UPD 您可以在调用它时将参数传递给您之前存储的函数。让我们用我之前的例子来试试:
d = {'func': func} # store function
result = d['func'](1) # get stored function and call it with argument
print(result)
输出:
1
推荐阅读
- java - 从 httpheader JAVA 中获取对象键的数组值
- python - 在基于 Django 类的视图中访问主键
- arrays - 反应数组未正确映射
- sql - 如何从表中获取前一个非 0 值?
- firebase - Flutter 如何将 Image 数据类型转换为 File 数据类型?
- terminal - 错误:运行终端时必须设置 CONDA_BUILD_SYSROOT 或 SDKROOT 以进行交叉编译
- javascript - 我将如何计算每个表格行中出现的唯一单词的频率并显示在同一行的选定单元格中计数?
- r - 如何编写 Bray-Curtis 函数?
- ruby-on-rails - 如何保存授权码和领域 ID 以获得访问和刷新令牌?
- javascript - HTML/JQuery:禁用跨度/按钮单击(将其变灰并禁用单击)