Python 如何从数学运算符列表中提取并将其解释为数学运算而不是字符串?
我试图使用此循环压缩现有代码,但将运算符存储在列表中,然后从中进行绘制不起作用,它会引发以下错误:Python 如何从数学运算符列表中提取并将其解释为数学运算而不是字符串?,python,python-3.x,list,loops,Python,Python 3.x,List,Loops,我试图使用此循环压缩现有代码,但将运算符存储在列表中,然后从中进行绘制不起作用,它会引发以下错误:TypeError:不支持+:'float'和'str'的操作数类型。 我知道它不是将运算符变量解释为实际的数学运算,而是将其解读为str,但我不确定如何解决这个问题。这是我构建的完整循环 operators = ["+", "-", "*", "/", "^"] for operator in o
TypeError:不支持+:'float'和'str'的操作数类型。
我知道它不是将运算符
变量解释为实际的数学运算,而是将其解读为str
,但我不确定如何解决这个问题。这是我构建的完整循环
operators = ["+", "-", "*", "/", "^"]
for operator in operators:
math_expression = input("Enter your math expression, or (q)uit: ")
print("Operator found " + operator)
operator_position = math_expression.find(operator) # find operator
print("Found " + operator + "operator at index " + str(operator_position))
first_number = math_expression[:operator_position] # find first number
second_number = math_expression[operator_position + 1:] # find second number
answer = float(first_number) + operator + float(second_number)
操作符
模块具有表示基本操作的函数,例如您正在查找的操作
在这里,我们
- 把那些运算符塞进一个dict
- 循环每个运算符的
符号和
函数
- 如果在用户输入中找到符号,则
函数会将字符串拆分为符号前后的段str.partition()
- 然后我们只调用
函数
您尝试的是类似于
1.5+“*”+0.5
,这只会导致该错误,因为您尝试将浮点数与字符串连接起来。您可能正在使用类似于或exec
,您尝试过这些吗?仅当您不想创建安全的东西时才应使用它们。但不要使用eval
或exec
!它们可以用来执行任意代码。@Davis我还没有试过,我会研究一下的,谢谢!创建从字符串到函数的映射(即dict),该函数执行您想要的任何操作。e、 g.{“+”:lambda x,y:return x+y,“-”:lambda x,y:x-y,…}
,或者使用导入操作符
,您可以使用{“+”:operator.add,“-”:operator.sub,…}
@aidenmychell,因为创建计算器“正确”很复杂。它至少需要为要处理的输入字符串编写解析器。当然,您可以使用使用Python解析器的eval
或exec
,但是如上所述,通常您希望避免eval
从用户输入中删除字符串,这是非常不安全的
import operator
operators = {
"+": operator.add,
"-": operator.sub,
"*": operator.mul,
"/": operator.truediv,
"^": operator.pow,
}
expression = "5 + 3" # elided input to make debugging faster
for symbol, func in operators.items():
if symbol in expression:
a, _, b = expression.partition(symbol)
answer = func(float(a), float(b))
print(answer)
break