2012-02-25 19 views
0

Python 3でコードを作成しようとしています。これにより、ユーザーはいくつかのオプションを選択できます。私はこれをいくつかの方法で試しましたが、どれも正しい方法ではないようです。Python 3:ユーザーの選択肢のための関数を作成する

例の試み:

usr_input = input("Input: ") 
while (usr_input != '1') | (usr_input != '2'): 
    if usr_input == '1': 
     search() 
    elif usr_input == '2': 
     sys.exit() 

これに伴う問題は、スクリプトが誤ったコマンドを入力した後にハングアップということです。

誰でも私にこれを行う正しい方法を教えてもらえますか?

+0

あなたは 'どう思いますか|'演算子はいますか?あなたは '>>>'プロンプトでそれを試しましたか? '(usr_input!= '1')|という表現がどのように使われているか説明してください。 (usr_input!= '2') 'が動作するはずです。この背後にあるあなたの推論を説明することは重要です。 –

答えて

2

ここにはいくつかの問題があります。

まず、ループ外でusr_inputを1回だけ取得します。それが正しい選択でない場合、ユーザーは選択を修正するための変更をユーザーに与えません。単にループします。ループ内でinputを実行する必要があります。

第2に、ブール条件が間違っています。 「xはORではない」と言うのと同等です。常にとなります。aでも、まだbではないからです。それをより良い表現方法はnot in ['1', '2']です。

これらは一緒に置く:

usr_input = '' 
while usr_input not in ['1', '2']: 
    usr_input = input("Input: ") 
    ... etc... 
+0

「not in list」モードも好きです。 –

+0

@orangeoctopusによって提案されたものとは対照的に 'not in list'メソッドを使用する理由はありますか、それとも単に個人的な好みですか? –

+0

usr_inputを複数回入力する必要がなく、 '['1'、 '2'、 '3'、 '4']'のような多くのオプションに比例するため、これはうれしいことです。私はそれがより簡潔であるように感じる。 –

1

whileループを使用して、ユーザーが何かを正しく入力しなかったときに入力を要求し続けたいとします。 whileループの中では、usr_inputは決して変更されないので、ループを維持するだけです。

また、usr_inputが1でなく、2になっていない場合にのみループ処理を続ける必要があります。1または2でない場合は常に2です.2の場合は1、1の場合は1 2)ではありません。

usr_input = input("Input: ") 
while (usr_input != '1') and (usr_input != '2'): 
    usr_input = input("Input: ") 

if usr_input == '1': 
    search() 
elif usr_input == '2': 
    sys.exit() 
+0

初めて入力を求めるときは実際には何もしませんので、whileループはまだ値がないものを参照しないように、それを省略して 'usr_input = 0'と置き換えてはいけませんか? –

+1

(usr_input!= '1')または(usr_input!= '2')は常にtrueで、 'and'にする必要があります。 –

+0

最初に "1"を入力すると、whileループには入りません。キャッチエイドリアン、ありがとう、ありがとう。 –

-1

input()ユーザーが構文的に間違った何かを入力した場合、それはSyntaxError例外がスローされますので、eval(raw_input())と同等のものを実行します。ドキュメントを参照してください:http://docs.python.org/library/functions.html#input

あなたは、SyntaxErrorをキャッチして処理することでコードを改善することができますので、プログラムがクラッシュすることはありません。

+0

これはPython 3ですが、それは真ではありません。 –

+0

@DanielRoseman私の経験はPython 3以前のものだと認めます。 'eval()'の動​​作や例外をキャッチしますか? –

+3

@karlBarker in 3.x 'input'は文字列を読み込み、改行を取り除きます。 'eval()'は実行されません。 – soulcheck

関連する問題