2017-10-08 12 views
1

私はPythonと他のすべてのプログラミング言語が新しく、私のコードに問題があります。私はあなたには、いくつかの変換オプション(何に小数)の間で選択することができ、メニューを作成しようとしている:内部でメニュー関数を呼び出す

base = ['Binary', 'Octal', 'Hexadecimal'] 

def menu(): 
    choice = int(input('Choose a conversion method: 1-Binary, 2-Octal,3-HexaDecimal. Your choice: ')) 

    if choice > 3 or choice < 1: 
     print('Invalid choice, choose between 1 and 3.') 
     menu() 
    else: 
     print('something...') 
    return choice 

x = menu() 

num = int(input('Decimal number to be converted to {}: '.format(base[x-1]))) 

#This isn't going to be used on my code, its only here so i can see what 
#Python is getting from input 
print('Verifying choice value: {}'.format(x)) 
print('Verifying num value: {}'.format(num)) 

def binary(num): 
    list = [] 
    var = '' 

    while num >= 1: 
     divint = num // 2 
     list.append(num % 2) 
     num = divint 

    list.reverse() 
    size = len(list) 

    for c in range(0, size): 
     var += str(list[c]) 
    intBin = int(var) 

    return intBin 

def opt(choice): 
    if choice == 1: 
     conv = binario(num) 
    elif choice == 2: 
     conv = octal(num) 
    elif choice == 3: 
     conv = hexa(num) 
    else: 
     print('Invalid Option, try again!') 
     menu() 

    return conv 

print('\nYou have chosen {}: {}'.format(base[x-1], binary(num))) 

問題は、私は1と3の間に何かを選択した場合、プログラムが正常に動作し、バイナリがあります計算される。私が何か> 3か< 1を選択した場合、意図したとおりにメッセージが返され、menu()が再び呼び出されますが、新しい入力が1から3の間であればエラーになります。 「選択肢」の変数は、最初の試行ではなく2番目の試行からその値を得ているようです。変数を「リセット」しておらず、新しい入力から新しい値を取得しません。私はPythonに全く新しいです、どんな助けも大いに評価されるでしょう。

+1

'menu()'を 'return menu()'に変更すると、再帰がどのように機能するかを詳しく見ることができます。 – jordanm

答えて

0

if choice > 3 or choice < 1: 
    print('Invalid choice, choose between 1 and 3.') 
    menu() 

であなたは自分自身の内側menu()関数を呼び出しているが、あなたはそれが返す値を保存していません。これを変更する必要があります

if choice > 3 or choice < 1: 
    print('Invalid choice, choose between 1 and 3.') 
    choice = menu() 

ただし、これはコードを整理するための良い方法ではありません。 ではなく、と呼んでください。menu()そのものです。代わりに、単純なwhileループを使用して、ユーザーに有効な選択を依頼してください。

このトピックに関する優れた情報については、KevinのAsking the user for input until they give a valid responseをご覧ください。


ところで、あなたは変数名としてlistを使用してはならないので、その「影」ビルトインlistタイプ。ここでは何も傷つけることはありませんが、コードを混乱させ、listコンストラクタを使用して名前を再定義した後にリストを作成しようとすると、不思議なエラーメッセージが表示される可能性があります。

+0

ありがとう!私は自分のコードを完全に変更しましたが、今は私が提案したwhileループを使用しています。私のコードは完全にポルトガル語で、私はあなたがそれをより良く理解できるように変更しただけです。私は変数としてリストを使用していません。しかし、アドバイスをいただきありがとうございます。 –

関連する問題