[英]Why does this dict.get() throw this error?
我有以下代码(可能不言自明):
def main():
print("Please input 2 numbers to operate on: ")
value1 = int(input())
value2 = int(input())
print("Please input an operator: ")
operator = str(input())
result ={
'+': lambda x, y: x+y,
'-': lambda x, y: x-y,
'*': lambda x, y: x*y,
'/': lambda x, y: x/y
}.get(operator(value1, value2), "Error")
print(result)
if __name__ == "__main__":
main()
但我收到错误:
Please input 2 numbers to operate on:
4
4
Please input an operator:
*
Traceback (most recent call last):
File "C:\Users\Megapoort\source\repos\Python switch function\Python_switch_function.py", line 17, in <module>
main()
File "C:\Users\Megapoort\source\repos\Python switch function\Python_switch_function.py", line 13, in main
}.get(operator(value1, value2), "Error")
TypeError: 'str' object is not callable
我真的不明白我在这里做错了什么。
您将括号放在错误的位置 - .get(operator(value1, value2), "Error")
使用value1
和value2
调用operator
。
您可能的意思是.get(operator, "Error")(value1, value2)
使用指定的参数正确调用.get
的结果。
这不是您应该使用get
,因为实际上没有要使用的默认函数。 如果用户输入未定义的运算符,您应该引发异常(不一定是KeyError
)或退出。
def main():
print("Please input 2 numbers to operate on: ")
value1 = int(input())
value2 = int(input())
print("Please input an operator: ")
operator = str(input())
try:
op = {
'+': lambda x, y: x+y,
'-': lambda x, y: x-y,
'*': lambda x, y: x*y,
'/': lambda x, y: x/y
}[operator]
except KeyError:
sys.exit(f"Invalid operator {operator}")
result = op(value1, value2)
print(result)
如果你使用get
,它也应该返回的功能。 例如,
result = {...}.get(operator, lambda x, y: None)(value1, value2)
您已接近想要实现的目标。 如果您在单独的步骤中拆分结果赋值语句可能会有所帮助:
首先,在运算符符号(a str
)和 lambda 之间进行映射,完全等于您的示例:
operator_map = {
'+': lambda x, y: x+y,
'-': lambda x, y: x-y,
'*': lambda x, y: x*y,
'/': lambda x, y: x/y,
}
接下来,获取您的运算符符号映射到的 lambda(一个函数对象),并让解释器在输入未知运算符时生成异常:
func = operator_map[operator]
接下来,使用您之前阅读的两个操作数调用该函数:
result = func(value1, value2)
如果您真的想将所有内容组合在一个语句中:
result = {
'+': lambda x, y: x+y,
'-': lambda x, y: x-y,
'*': lambda x, y: x*y,
'/': lambda x, y: x/y,
}[operator](value1, value2)
提示:您提供的 lambda 表达式已在标准库operator
模块中提供。 lambda x, y: x+y
等价于operator.add
, xy
--> operator.sub
, x*y
--> operator.mul
, x/y
lambda 等价于operator.truediv
。
您的operator = str(input())
是一个字符串值。 但是稍后您需要从中获取 2 个值: operator(value1, value2)
那时 operator 也是字符串而不是函数,因此 operator() 除了错误之外不会产生任何结果。
像这样修复它:
print("Please input 2 numbers to operate on: ")
value1 = 1
value2 = 2
print("Please input an operator: ")
operator = str("+")
result ={
'+': lambda x, y: x+y,
'-': lambda x, y: x-y,
'*': lambda x, y: x*y,
'/': lambda x, y: x/y
}.get(operator, "Error")
print(result(value1, value2))
result ={
'+': lambda x, y: x+y,
'-': lambda x, y: x-y,
'*': lambda x, y: x*y,
'/': lambda x, y: x/y
}.get(operator(value1, value2), "Error")
你在一个语句中做了太多的事情。 把它分成更小的部分:
operations = {
'+': lambda x, y: x+y,
'-': lambda x, y: x-y,
'*': lambda x, y: x*y,
'/': lambda x, y: x/y
}
foo = operator(value1, value2)
result = operations.get(foo, "Error")
现在我们可以看到operator(value1, value2)
导致错误,因为operator
的值是一个字符串,我们不能在字符串后使用括号。 相反,我们需要在函数后加上括号。 该函数在字典中,您可以使用字符串查找:
operation = operations.get(operator)
result = operation(value1, value2)
这个故事的寓意是把一个复杂的陈述分解成更小的部分,这样你就可以对每一个小步骤进行推理,而不是把一大步搞混。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.