为什么这个dict.get()会抛出这个错误?



我有以下代码(可能是不言自明的):

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:UsersMegapoortsourcereposPython switch functionPython_switch_function.py", line 17, in <module>
main()
File "C:UsersMegapoortsourcereposPython switch functionPython_switch_function.py", line 13, in main
}.get(operator(value1, value2), "Error")
TypeError: 'str' object is not callable

我真的不明白我在这里做错了什么。

你把括号放在了错误的地方 -.get(operator(value1, value2), "Error")value1value2调用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)

你接近你想要实现的目标。如果将结果赋值语句拆分为单独的步骤,可能会有所帮助:

首先,在运算符符号 (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.addx-y-->operator.subx*y-->operator.mulx/ylambda相当于operator.truediv

您的operator = str(input())是一个字符串的值。 但稍后您需要从中获取 2 个值:operator(value1, value2)运算符此时也是一个字符串而不是函数,因此 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)

这个故事的寓意是将一个复杂的陈述分解成更小的部分,这样你就可以推理每一个小步骤,而不是混淆一大步。

相关内容

最新更新