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

时间:2017-12-10 12:28:43

标签: python valueerror

我正在尝试编写一个非常简单的代码,我将为它提供两个数字(使用输入函数),它会根据这些数字给我一个结果。当数字只是数字(例如,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'

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

谢谢。

1 个答案:

答案 0 :(得分:1)

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

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

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

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

您还可以考虑numexpr库(安装numpy作为要求并返回numpy数组):

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