0

0より大きい数字のみを許可するように入力を制御しようとしていますが、このテキストブロックをテストするときに、最初に不正な文字(文字列、0または負の数)を入力すると、エラー出力を受け取り、有効な値を入力します、入力したばかりの有効な値ではなく、最初に入力した値を返します(これにより、型の不一致または非論理的な値が原因で、スクリプトの残りの部分が失敗します)。「returnx」を動かしてみましたが、どちらの方法でも同じことをします。2番目のケースでは、「割り当て前に参照される変数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
4

1 に答える 1

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は、2番目の関数呼び出しのxとは完全に分離されていることに注意してください。

したがって、再帰を使用する場合は、「チェーンをバックアップする」x値を渡す方法を理解する必要があります。

于 2012-09-28T07:24:05.780 に答える