繁体   English   中英

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

[英]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")使用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)

您已接近想要实现的目标。 如果您在单独的步骤中拆分结果赋值语句可能会有所帮助:

首先,在运算符符号(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.mulx/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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM