我是python的新手,我的程序是一个简单的加法程序,它可以添加用户输入的任何数字(int或float),并且循环在输入q时停止。现在的问题是,每次输入一些数字然后输入q停止时,我都会不断得到"ValueError"
。
我已经使用eval()
函数来确定输入的输入数据的数据类型。而且我在无限的while循环中添加了加法,该循环在输入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'
答案 0 :(得分:2)
这是使用嵌套#!/usr/bin/env python3
nums = list()
while True:
# Usability tweak: Trim surrounding whitespace
a = input("Enter number: ").strip()
try:
t = int(a)
except ValueError:
try:
t = float(a)
except ValueError:
if a in ('q', 'Q'):
break
print("Invalid data entered. Please enter a number or q/Q to quit.")
continue
nums.append(t)
print("You have entered {0} numbers and their sum is {1}".format(
len(nums), sum(nums)))
进行的重构,它可以更简洁,更Python化地解决该问题。
image.file.attach best_photo.file.blob
答案 1 :(得分:1)
两件事:首先要检查某种类型的东西,它更像是pythonian
isinstance(t, int)
但是第二件事是您的代码失败了。
如果您评估文字,则很可能会出现名称错误,因为该变量未在任何地方定义。但是,例如,如果您输入“ c”,您将得到完全奇怪的东西。由于定义了变量c,因此不会出现名称错误,但是在将文字'c'转换为int时仍然会失败。
您可以使用正则表达式检查输入的内容是否为数字
例如这样的
if re.match('(\d+(\.\d+)?)', a):
try:
t = eval(a)
print(type(t))
except (NameError, ValueError):
pass
elif a == 'q' or a == 'Q':
break
else:
continue
if isinstance(t, int):
sum_i = sum_i + int(a)
c = c + 1
elif isinstance(t, float):
sum_f = sum_f + float(a)
c = c + 1
else:
print("Invalid data entered. Please enter a number to add or q/Q to quit. ")
答案 2 :(得分:0)
您的问题是使用eval
。如果它不能将字符串解析为变量,它将失败,但是在您的情况下,名称空间中已经有一个t
浮动。 t
保持它的旧身份为int类型,但随后您尝试将a
(字符串)添加到数字中。
此代码应该有效:
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 = int(a)
sum_i=sum_i+int(a)
c=c+1
print(type(t))
continue
except ValueError:
pass
try:
t = float(a)
sum_f=sum_f+int(a)
c=c+1
print(type(t))
continue
except ValueError:
pass
try:
if (a=='q'or a=='Q'):
break
else:
print("Invalid data entered. Please enter a number to add or q/Q to quit. ")
continue
except ValueError:
pass
sum= sum_i+ sum_f
print("You have entered ",c," numbers and their sum is: ",sum)