我有以下代码(可能不言自明):
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
我真的不明白我在这里做错了什么。
答案 0 :(得分:2)
您将括号放在错误的位置-.get(operator(value1, value2), "Error")
用operator
和value1
调用value2
。
您可能是指.get(operator, "Error")(value1, value2)
,它使用指定的参数正确调用.get
的结果。
答案 1 :(得分:1)
这不是您应该使用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)
答案 2 :(得分:1)
您接近要实现的目标。如果将结果分配语句拆分为单独的步骤,则可能会有所帮助:
首先,在运算符(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
module中提供。 lambda x, y: x+y
等效于operator.add
,x-y
-> operator.sub
,x*y
-> operator.mul
和x/y
lambda等效于operator.truediv
。
答案 3 :(得分:0)
您的operator = str(input())
是一个字符串值。
但是稍后您需要从中获得2个值:operator(value1, value2)
那时操作符也是字符串而不是函数,因此操作符()不会在错误旁边产生任何结果。
像这样修复它:
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))
答案 4 :(得分:0)
gsub("http.*", " ", TEXTS)
您在一个语句中做了太多事情。分成小块:
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
这个故事的寓意是将一个复杂的陈述分解成较小的部分,以便您可以推理每个小步骤,而不是混淆一个大步骤。