Python我希望在循环时使用不同的方法

时间:2014-01-25 00:26:57

标签: python loops while-loop try-catch

我为同一个程序编写了这段代码,但是我想让它以同样的方式工作而不使用try和ValueError

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

谢谢大家。

2 个答案:

答案 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

但是,如果用户输入qiut2..137,则程序将使用ValueError进行拯救。如果没有try,你如何防范呢?

或者,如果您想阻止用户输入,例如inf-infnan,或者某些内容(至少在某些平台上)溢出到一个那些(例如,在大多数系统上尝试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}}慢一些。