的Python我想这样做,而循环

问题描述:

我写了这个代码同一程序的不同的方式,但我想它的工作与出使用try和ValueError异常的Python我想这样做,而循环

total = 0.0 
while True: 
    try: 
     total =+ float(raw_input("enter a number or quit to finish")) 
    except ValueError: 
     break 
print total 

感谢所有相同的方式。

+1

你真的想要那个'= +'吗? '+ ='你在找什么?另外,'try-except'有什么问题? –

+1

没有理由不在这里使用'try-except'。 –

如果只想处理"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 

但是,如果用户类型,比如说,qiut2..137,程序将挽救一个ValueError。如果没有try,你如何防范?

或者,如果你想防止用户进入,比如,inf-infnan,或东西,将(至少在某些平台上)溢出那些之一(例如,尝试1e309在大多数系统上) ?

那么,你需要一些方法来验证float电话会提前工作。

首先,你必须解析Python 2.7's floating point literal syntax。至少你没有处理Python 3.x,其中,例如,float('١٠٣')是完全有效的,并且意味着103.0。该语言很容易翻译成普通语言,这意味着re或纯字符串方法应该足够了,或者您可以用类似PyParsing或手动滚动递归下降解析器来实现语法,而不是翻译。

接下来,您需要评估该值,以确保在评估为浮点时不会给出错误。 sys.float_info应该有你需要的所有信息...除了Python 2.7实际上并没有定义什么是和不是错误。一般情况下,溢出会自动变为inf-inf,并下溢到0,但是您可能需要一些试验和错误来查看它对所有边界情况的作用(或者查看解释器的源代码)。

你或许可以优化这个部分,首先判断一切明显非法/安全的东西(例如,如果没有指数并且长度足够短,它不可能溢出),但是会有一些范围你将不得不详细检查。

或者,在您评估号码时,您不妨跳过float,只使用您评估的号码。如果你愿意,甚至可以使用不同的规则。,处理波斯数字或1.2x10^3而不是1.2e3,或允许数千个分隔符或...)。

我不会为你编写代码,因为这将是一件疯狂的事情。这需要花费大量的设计,编码,测试和调试,最终它会比为您提供Python tryfloat慢几个数量级。

您必须将输入存储在变量中,然后在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: * 
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'不同的情况。

+0

OP希望不用'try-except'。 :/ –

+0

所以为了做这样的事情,你必须每次尝试一次try-ValueError? – user3015794

+0

为了获得预期的结果,*以相对简单的方式*,是的。 – Christian