2010-11-22 12 views
-2

私は、ユーザがオプションの1つを選択するように求めるメニューを持っています。このメニューは1から10までですので、私はraw_input以外のinputを使用しています。Pythonの入力文字列エラー(raw_inputを使用したくない)

私のコードは、ユーザーが入力する数字が1から10までの場合、オプションを実行するifステートメントです。ユーザーがそれ以外の数字を入力した場合、elseステートメントはユーザーに1から10までの数字を選択します。

問題はユーザーが文字列を入力した場合です。たとえばqwertとします。文字列なのでエラーになります。私は理由を理解しています。raw_inputを使いたくありません。

私は、ユーザーの種類の文字列、それは私else文に行き、例えば印刷「だけ番号が有効である。1から10までの番号を選んで、」私は使いたくない

WENために何ができますかこの

よろしく、

Favolas

EDIT すべてのあなたの答えてくれてありがとうと後期応答のため申し訳ありませんを行うための任意の高度なプログラミングが、私はそうでした私の健康問題。

私の先生が許可しなかったので、試してみるか、または使用できませんでした。 最後に、私はraw_inputを使用しました。なぜなら、これは最も簡単な方法でしたが、この問題を解決する方法はたくさんありました。あなたが本当に後は何

よろしく、

Favolas

+0

試してみましたか? – crodjer

+0

私は、高度なプログラミングを除いて試してみるつもりだと言っています。可能なすべてのタイプの入力をテストして個別に処理する必要がない場合は、実際には唯一の論理的選択です。 – snarkyname77

+9

-1 'try ... except'ブロックを使いたくないと言ったとき、これは有効な質問ではなくなりました。これは、ループを使わずに1から10までの数字をどのように印刷するかを尋ねるようなものです。例外処理の_point_は、プログラマが_handle exceptions_を実行できるようにすることです。あなたは彼らに対して何を持っていますか? – katrielalex

答えて

5

文字列を数字に変換しようとすると例外がスローされます。 例:

try: 
    int(myres) 
except: 
    print "Only numbers are valid" 
3

何かが整数として渡すことができれば把握する方法です。 - それを行うための簡単な方法は、このようなものになり

try: 
    i = int(string_from_input) 
ecxept ValueError: 
    # actions in case the input is anything other than int, like continuing the loop 
+0

答えに感謝しますが、試してみるか使用したくないですか? – Favolas

+1

本当ですか?それが最善の解決策です。別のオプションは、文字列オブジェクトに対して 'isdigit()'関数を使うことです。文字列に数字だけが含まれている場合、つまり。いいえ '、'または '。'それは真実を返すでしょう。 – knutin

4

イムないあなたは、高度な考えるものを確認してください。以下は、仕事をするだろう。

def getUserInput(): 
    while True: 
     a = raw_input("Enter a number between 1 and 10: ") 
     try: 
      number = int(a) 
      if (0 < number <= 10): 
       return number 
      else: 
       print "Between 1 and 10 please" 
     except: 
      print "Im sorry, please enter a number between 1 and 10" 

ここでは、try/except文を使用して、入力された文字列を整数に変換できるようにしています。そして入力された数字が1から10の間になるまでループを続けます(0 <数字< = 10)

+0

答えに感謝しますが、私は試してみたい、または除外したくありません – Favolas

4

あなたあなたがこれは常にあなたの文字列を与えるだろう:)にしたくない場合でも、raw_input()を使用する必要があります。

s = raw_input() 
try: 
    choice = int(s) 
except ValueError: 
    # choice is invalid... 

などのコードをintに変換しようとすると、コードを使用できます。

+0

答えに感謝しますが、試してみるか使用したくないですか? – Favolas

+3

@Favolas:それを乗り越えてください。 – martineau

0

この関数をPython 3.1で使用することをお勧めしますか? 2つの引数は予想される数値範囲です。

def get_number(a, z): 
    if a > z: 
     a, z = z, a 
    while True: 
     try: 
      line = input('Please enter a number: ') 
     except EOFError: 
      raise SystemExit() 
     else: 
      if line: 
       try: 
        number = int(line) 
        assert a <= number <= z 
       except ValueError: 
        print('You must enter base 10 digits.') 
       except AssertionError: 
        print('Your number must be in this range:', a, '-', z) 
       else: 
        return number 
      else: 
       print('You must enter a number.') 
+0

答えがありがたいですが、試してみるか使用したくないですか – Favolas

+2

@favolas:なぜこのような必要条件はありませんか? try-exceptの何が問題なの? – SilentGhost

2

あなたは明らかに例外処理に対して何かを持っています。私は理由を理解していません - それは(Pythonだけではなく)プログラミングの基本的な部分であり、あなたが快適でなければならないものです。エラーコードを処理するよりも「高度な」ものではなく、まったく別の考え方です。

ここにドキュメントがあります。それはかなり簡単です:

が選択した例外を処理するプログラムを書くことは可能です。 が入力された有効な整数まで入力用 ユーザに要求が、ユーザ がプログラムを中断することを可能にする次の例を見て( コントロール-Cを使用して、またはオペレーティング システムがサポートしているものは何でも)。 ユーザー生成の中断は、 KeyboardInterrupt例外を発生させることによって通知された であることに注意してください。

>>> while True: 
...  try: 
...   x = int(raw_input("Please enter a number: ")) 
...   break 
...  except ValueError: 
...   print "Oops! That was no valid number. Try again..." 
... 

tryステートメントは次のように動作します。

まず、try節とキーワード以外の との間の文( )が実行されます。 例外が発生しない場合、except節は がスキップされ、try ステートメントの実行が終了します。 try 句の実行中に例外 が発生した場合、残りの句はスキップされます( )。次に、型が キーワードの後に​​指定された 例外に一致する場合、except句は が実行され、tryステートメントの後に実行されてから になります。 例外が発生して、 と一致しない場合は、 句以外の名前が付けられた例外が外部試行 ステートメントに渡されます。ハンドラが見つからない場合は は処理されない例外であり、 の実行が上記の というメッセージで終了します。 tryステートメントには の複数のexcept句があり、 には異なる 例外のハンドラを指定できます。最大で1つのハンドラが実行されます 。ハンドラは、対応するtry節にある ハンドラでのみ発生する例外を処理します。同じtryステートメントの他のハンドラでは発生しません。

... except (RuntimeError, TypeError, NameError): 
...  pass 

例外名(複数可)を省略してもよい句を除いて最後は、 ワイルドカードとして機能する。句以外 は括弧タプルとして複数 例外、例えば に名前を付けることができます。この方法で 実際のプログラミングエラーをマスクするのは簡単ですので、これを極端に 注意して使用してください!それ も(呼び出し側が同様 例外を処理することができます) 例外を-上げる再度、エラー メッセージを出力するために使用することができます。

2

個人的に、私はより良い私の最初の答えを言っています。しかし、これはあなたの要件をより多くのコードで満たす必要があります。

import sys 

def get_number(a, z): 
    if a > z: 
     a, z = z, a 
    while True: 
     line = get_line('Please enter a number: ') 
     if line is None: 
      sys.exit() 
     if line: 
      number = str_to_int(line) 
      if number is None: 
       print('You must enter base 10 digits.') 
      elif a <= number <= z: 
       return number 
      else: 
       print('Your number must be in this range:', a, '-', z) 
     else: 
      print('You must enter a number.') 

def get_line(prompt): 
    sys.stdout.write(prompt) 
    sys.stdout.flush() 
    line = sys.stdin.readline() 
    if line: 
     return line[:-1] 

def str_to_int(string): 
    zero = ord('0') 
    integer = 0 
    for character in string: 
     if '0' <= character <= '9': 
      integer *= 10 
      integer += ord(character) - zero 
     else: 
      return 
    return integer 
+3

このコードを1つの関数に変換する必要がありますか、それとも関数を使用しないようにしますか? –

関連する問題