2016-03-26 14 views
0

ユーザが選択肢に基づいて数値を入力できるようにするには、関数 'メニュー'を定義する必要があります。ここで私はこれまで持っているものです。Python:メニュー入力を終了できません

def menu(preamble, choices) : 
    choose_one = " Choose one of the following and enter its number:" 
    print(preamble + choose_one) 

    for number in range(len(choices)): 
     all = "%g: %s" % (number + 1, choices[number]) 
     print(all) 

    prompt = ("\n") 
    warning = "\n"  
    while warning: 
     choose = int(input(warning + prompt)) 
     warning = '' 
     if choose not in range(1,len(choices)): 
      warning = "Invalid response '%s': try again" % choose 
      for number in range(len(choices)): 
       all = "%g: %s" % (number + 1, choices[number]) 
       print(all)    
     else: 
      break 
    return choose 

はのは選択肢があることを、たとえば、言ってみましょう:

1. I have brown hair 
2. I have red hair 
3. Quit 

私はコードを実行しようとしたと== 1を選択し、選択したときに、それが正常に動作します== 2しかし、== 3を選択すると、ユーザーは再度選択するように求められます。 「終了」オプションを使用するには何をする必要がありますか?

+0

終了オプション番号が範囲外です。だから、あなたのコードは再び選択を求めます。範囲+ 1(終了オプション)のテストを追加するか、メニューオプションに範囲+ 1をブレークまたはインクルードします。 –

答えて

1

あなたは1を追加する必要があります。

len(choices) + 1 

範囲は長さが3

In [12]: l = [1,2,3] 

In [13]: list(range(1, len(l))) 
Out[13]: [1, 2] 

In [14]: list(range(1, len(l) + 1)) 
Out[14]: [1, 2, 3] 

ある場合が含まれていませんので、上限ので、3が範囲内にない半分開いています私はあなたのロジックも少し変更するでしょう:

st = set(range(1, len(choices))+ 1) 
while True: 
    choose = int(input(warning + prompt)) 
    if choose in st: 
     return choose 
    print("Invalid response '%s': try again" % choose) 
    for number in range(1, len(choices) + 1): 
     msg = "%g: %s" % (number, choices[number]) 
     print(msg)  

選択肢と番号を格納するにはdictを使用してください。

from collections import OrderedDict 
choices = OrderedDict(zip(range(1, len(choices)+ 1),choices)) 
for k,v in choices.items(): 
     msg = "%g: %s" % (k, v) 
     print(msg) 

while True: 
    choose = int(input(warning + prompt)) 
    if choose in choices: 
     return choose 
    print("Invalid response '%s': try again" % choose) 
    for k,v in choices.items(): 
     msg = "%g: %s" % (k, v) 
     print(msg) 
+0

うわー、私はこれに気付かなかったとは信じられません。ありがとうございました – tupitupa

+0

心配する必要はありません、あなたは最初ではなく、最後になることはありません、それは簡単な間違いです。 –

関連する問題