2017-12-02 7 views
0

作成したWhileループは終了しません。私はそれを何度も試してみて、理由を理解することはできません。 "0764526413"のISBNコードを入力すると "All Numbers"が返され、ループが終了します。しかし、コード内の手紙でそれをテストすると(それが周りにループしていることを確認して)、それは先頭に戻り、コードを再度入力するように頼んでいます。私は、すべての数値コードを入力します。この時点で、私は無限ループに入っています。 2度目にすべての数値コードを入力しても、終了しません。私はすべての数値コードを最初のゴーラウンドで入力すると正しくルーピングされているように見えますが、間違ったコードを入力して正しいコードを入力したのではないのは分かりません。Python - "While"ループがスタックされました

コードは以下の通りです:

# Variable to start loop 
Digits = 'N' 
ISBN_temp = '' 

# The loop asks for the ISBN, removes the dashes, removes check digit, 
# And checks to see if the info entered is numeric or not. 
while Digits == 'N': 
    print('Please enter the ISBN code with or without the check digit.') 
    temp_ISBN = input('You may enter it with dashes if you like: ') 

    ISBN_no_dash = temp_ISBN.replace('-','') 

    no_dash_list = list(ISBN_no_dash) 

    # If the user entered a check digit, remove it. 
    if len(no_dash_list) == 10: 
     del no_dash_list[9] 
     ISBN_no_check = no_dash_list 
    elif len(no_dash_list) == 13: 
     del no_dash_list[12] 
     ISBN_no_check = no_dash_list 
    else: 
     ISBN_no_check = no_dash_list 

    # Turn list back into a string and then make sure all characters are 
    # Numeric. 
    for num in ISBN_no_check: 
     ISBN_temp = ISBN_temp + str(num) 

    if ISBN_temp.isnumeric(): 
     print('All numbers') 
     Digits = 'Y' 
    else: 
     print() 
     print('Please verify and reenter the ISBN number.') 
     print() 
     Digits = 'N' 

私は、コードの一部が奇妙に見えるかもしれません知っているが、これは実際に私は宿題のために書いている大きなプログラムのほんの一部です。これは私に問題を与えている唯一の部分です。どんな助けでも大歓迎です。私は数日間プログラム全体を作業していたので、私が見ていない小さなものであることを本当に望んでいます。大変ありがとうございました! 「すべての番号」を返すか、またはISBNが正しく入力されたときにループを終了するか、数値以外が入力されたときにループバックする必要があることを覚えておいてください。前へ空の文字列に

+0

@MartijnPietersは必要ありません - それを指摘してくれてありがとう。実際にはすべてのコードが正しくインデントされていますが、すべてをペーストした後はここでタブを忘れてしまいました。インデントを修正しました。 – Rogue

+1

@Rogue:すべて手でインデントしないでください。コードを貼り付け、エディタでこれらのコード行をすべて選択し、ツールバーの '{}'ボタンを使用してインデントを追加します。 –

+1

もう一つのアドバイスは、より良い変数名を考えることです。 'ISBN_temp'と' temp_ISBN'は異なるものを意味しています。それは混乱している。 'withoutCheckDigit'と' originalUserInput'はどうでしょうか? –

答えて

3

あなたは再設定する必要がありISBN_temp

for num in ISBN_no_check: 
    ISBN_temp = ISBN_temp + str(num) 

そうしないと、反復ごとに非常に同じ文字列を追加することを続けます。

+0

Grzegorzありがとう!私はそれが私が見落としていたシンプルなものでなければならないことを知っていた。 – Rogue

2

ISBN_tempはwhileループの繰り返しの間に保持されます。

ISBN_temp = ''.join(str(num) for num in ISBN_no_check) 

ます。またwhile Trueを使用することができますwhileループ

for num in ISBN_no_check: 
    ISBN_temp = ISBN_temp + str(num) 

が数字から新しい文字列を生成することです。このループの代わりの外にそれを維持するための明確な理由はありません数値チェックが成功するとbreakとなります。次に、digits変数

関連する問題