Python 3 - 过滤数字输入的问题

时间:2012-09-28 06:54:53

标签: input python-3.x numerical

我正在尝试控制输入以仅允许大于0的数字,但在测试此文本块时,如果我首先输入非法字符(字符串,0或负数),则接收错误输出然后输入一个有效的值,它返回我输入的第一个值而不是刚输入的有效值(由于类型不匹配或不合逻辑的值,这会导致我的其余脚本失败)。我试过移动“返回x”,但在任何一种方式都做同样的事情。在第二种情况下说“在赋值之前引用的变量x”。

def getPrice():
    try:
        x = float(input("What is the before-tax price of the item?\n"))
        if x <= 0:
            print("Price cannot be less than or equal to zero.")
            getPrice()
        return x
    except ValueError:
        print("Price must be numeric.")
        getPrice()

def getPrice():
    try:
        x = float(input("What is the before-tax price of the item?\n"))
        if x <= 0:
            print("Price cannot be less than or equal to zero.")
            getPrice()
    except ValueError:
        print("Price must be numeric.")
        getPrice()
    return x

我该如何解决这个问题?

另外,如果你很好奇,这是一个学校作业,我已经完成了我自己的整个程序,但我无法弄清楚如何调试它。

编辑:

我现在有了一个工作方法:

def getPrice():
    while True:
        try:
            x = float(input("What is the before-tax price of the item?\n"))
        except ValueError:
            print("Price must be numeric.")
            continue
        if x <= 0:
            print("Price cannot be less than or equal to zero.")
        else:
            return x
            break

并修复了原始代码块(但它仍然使用递归):

def getPrice():
        try:
            x = float(input("What is the before-tax price of the item?\n"))
            if x <= 0:
                print("Price cannot be less than or equal to zero.")
                x = getPrice()
        except ValueError:
            print("Price must be numeric.")
            x = getPrice()
        return x

1 个答案:

答案 0 :(得分:0)

我不会拼出答案,因为它是作业,但我会指出你正确的方向。首先,我建议使用while循环而不是递归。

代码可能类似于:

while True:
    try:
        x = <get input>
        if input is good:
            break
        else:
            <print error>
    except badstuff:
        <Print error>
        next #redundant in this case as we'd do this anyways

其次,您现在遇到的问题与变量范围有关。当输入错误时,再次调用该函数,但不对输出执行任何操作。

请记住,第一个函数调用中的x与第二个函数调用中的x完全分开。

因此,如果您打算使用递归,则需要弄清楚如何传递x值“备份链”。