无法将字符串转换为浮点数 12 + 13

could not convert string to float 12 + 13

我正在尝试编写一个非常简单的代码,我将向它提供两个数字(使用 input 函数),它会根据这些数字给我一个结果。当数字是 just 数字(例如 12 或 15)时,一切正常,但是当不是数字而是加法(即 6 + 6)时,我得到错误提示“无法将字符串转换为浮点数:'6 + 6'。

请参阅下面的可重现示例:

def calc_sal(number1, number2):
    return number1 * 4.5 + number2

number1 = float(input("Give number1 "))
number2 = float(input("Give number2 "))

print(calc_sal(number1, number2))

这是错误:

Give number1 6 + 6
Traceback (most recent call last):
  File "SalaryCalc.py", line 4, in <module>
    number1 = float(input("Give number1 "))
ValueError: could not convert string to float: '6 + 6'

在我看来,我无法通过 input 函数执行加法,而是认为它是一个字符串“6 + 6”。但是,当我在交互式会话中逐行 运行 相同的代码时,一切正常(即,当输入为 6 + 6 时,输出为 12,而不是“6 + 6”)。 那么你为什么只有当我通过终端而不是交互地 运行 程序时才会发生这种情况?以及如何解决这个问题?

谢谢。

这取决于谁将使用此代码:

  • 如果只有你,你可以使用eval功能:

    >>> eval('6+6')
    12
    
  • 如果你想让别人输入数字,eval 是邪恶的。如果输入恶意代码,它可以格式化您的硬盘! (另见 How harmful is eval

    考虑其他可能性,例如ast.literal_eval(仅适用于+-,即使*也太难了),pyparsing(强大, 但需要为此编写程序) 等

您还可以考虑 numexpr 库(安装 numpy 作为要求,结果安装 returns numpy 数组):

>>> import numexpr as ne
>>> ne.evaluate('6**2')
array(36, dtype=int32)
>>> print(ne.evaluate('6**2'))
36