【发布时间】:2019-01-17 07:37:19
【问题描述】:
我是 python 新手,我的程序是一个简单的加法程序,它可以添加用户输入的任何数字(int 或 float),并且循环在输入 q 时停止。现在我的问题是我每次输入一些数字然后输入 q 停止时都会收到"ValueError"。
我已经使用eval() 函数来确定输入数据的数据类型。我在一个无限循环中添加了我的添加,该循环在输入 q 时中断。
这是我的代码:
sum,sum_i,c=0,0,0
sum_f=0.0
print("Enter q/Q to stop entering numbers.")
while True:
a=input("Enter number: ")
try:
t= eval(a)
print(type(t))
except (NameError, ValueError):
pass
if(type(t)==int):
sum_i=sum_i+int(a)
c=c+1
elif(type(t)==float):
sum_f=sum_f+float(a)
c=c+1
elif (type(t)==str):
if (a=='q'or a=='Q'):
break
else:
print("Invalid data entered. Please enter a number to add or q/Q to quit. ")
sum= sum_i+ sum_f
print("You have entered ",c," numbers and their sum is: ",sum)
我的输出应该提供输入 q 时输入的数字的总和,但这是我得到的:
Enter q/Q to stop entering numbers.
Enter number: 3
<class 'int'>
Enter number: 5.5
<class 'float'>
Enter number: 12
<class 'int'>
Enter number: q
Traceback (most recent call last):
File "/home/netvarth/py test/sum.py", line 14, in <module>
sum_i=sum_i+int(a)
ValueError: invalid literal for int() with base 10: 'q'
【问题讨论】:
-
出于安全原因,一般的良好做法是使用
import ast、ast.literal_eval()而不是eval() -
@Archie 我知道这不是真正的生产代码,但永远不要在用户的原始输入上使用
eval()。用户只需输入sys.exit(0)之类的内容并关闭您的系统 -
eval('q')->NameError;t仍然是以前的样子。如果是int,您将尝试int('q'),它会产生您的ValueError。
标签: python python-3.x