我为同一个程序编写了这段代码,但是我想让它以同样的方式工作而不使用try和ValueError
total = 0.0
while True:
try:
total =+ float(raw_input("enter a number or quit to finish"))
except ValueError:
break
print total
谢谢大家。
答案 0 :(得分:1)
您必须将输入存储在变量中,然后在try
子句中将其转换为float
。如果转换成功,请将其添加到total
,如果没有,请检查它是否已退出'退出'退出程序:
total = 0.0
while True:
a = raw_input("Enter a number or quit to finish: ")
try:
total += float(a)
except ValueError:
if a == 'quit':
break
print total
<强>测试强>
Enter a number or quit to finish: 2
Enter a number or quit to finish: 3
Enter a number or quit to finish: StackOverflow
Enter a number or quit to finish:
Enter a number or quit to finish: 4
Enter a number or quit to finish: quit
9.0
注意:此代码将处理用户输入与'quit'
不同的字符串的情况。
答案 1 :(得分:0)
如果只想处理"quit"
或浮动,那很容易:
total = 0.0
while True:
value = raw_input("enter a number or quit to finish"))
if value == "quit":
break
total += float(value)
print total
但是,如果用户输入qiut
或2..137
,则程序将使用ValueError
进行拯救。如果没有try
,你如何防范呢?
或者,如果您想阻止用户输入,例如inf
或-inf
或nan
,或者某些内容(至少在某些平台上)溢出到一个那些(例如,在大多数系统上尝试1e309
)?
嗯,您需要某种方法来验证float
电话是否会提前发挥作用。
首先,您必须解析Python 2.7's floating point literal syntax。至少你没有处理Python 3.x,例如,float('١٠٣')
完全有效并且意味着103.0
。该语言很容易翻译成常规语言,这意味着re
或普通字符串方法应该足够,或者您可以使用PyParsing
或手动递归下降解析器而不是翻译来实现语法。
接下来,您需要评估该值,以确保在评估为float时不会出错。 sys.float_info
应该包含您需要的所有信息......除了Python 2.7实际上没有定义什么是错误而不是错误。一般情况下,溢出会自动变为inf
或-inf
,并且会下溢到0
,但您可能需要一些试验和错误来查看它对所有边缘情况的作用(或或者,查看翻译的源代码。)
你可以通过首先排除和清除非法/安全的一切(例如,如果没有指数并且长度足够短,它不可能溢出)来优化这部分,但是你会有一些范围将不得不详细检查。
或者,在您评估数字时,您最好也可以跳过float
,然后使用您评估的数字。如果你愿意,甚至允许你使用Python 2.7中的不同的规则(例如,处理波斯数字,或1.2x10^3
之类的形式而不仅仅是1.2e3
,或允许数千个分隔符,或...)。
我不会为你编写代码,因为这将是一件疯狂的事情。它需要进行大量的设计,编码,测试和调试,最终它会比让try
float
为你的{{1}}慢一些。