質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

2718閲覧

Pythonで特定の範囲内の数字が選ばれるまで質問を繰り返す

evo6tm

総合スコア15

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/01/13 16:09

Pythonで特定の範囲内の数字が選ばれるまで質問を繰り返す

Python3.7です。
以下のようにしたいのですが、うまくいきません。ご教示願えますか。

・特定の範囲内(-100から100まで)の数字が選ばれるまで質問を繰り返す
・数字以外のキー入力が1つでも含まれていたら、警告表示をして、再度、質問
・数字キーだけの入力でも範囲外であれば、警告表示をして、再度、質問

自分なり作成しましたが、以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

・マイナス(-)の数字がエラーになる ・自分の表示したい警告表示が出ない

該当のソースコード

def readint(prompt,min,max): while True: num = input("数字を入力してください。(範囲:-100から100まで):") if num.isdecimal() != True: continue print ("エラー: 数字ではない文字を含んでいます。") elif int(num) > 100 or int(num) < -100: print("エラー: 範囲外の数字を入力しています。 (範囲:-100から100まで)") continue else: break return num x = readint("数字を入力してください。(範囲:-100から100まで):", -100, 100) print(x)

試したこと

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

例外を使わずに書いてみました。

input.py

python3

1def readint(prompt, lower, upper): 2 num_range = "(範囲:{0}から{1}まで):".format(lower, upper) 3 prompt = prompt + num_range 4 5 while True: 6 str = input(prompt) 7 if len(str) == 0: 8 continue 9 10 sign = 1 11 if str[0] == '-' or str[0] == '+': 12 sign = -1 if str[0] == '-' else 1 13 str = str[1::] 14 15 if not str.isdecimal(): 16 print ("エラー: 数字ではない文字を含んでいます。") 17 continue 18 19 num = int(str) * sign 20 if num < lower or upper < num: 21 print("エラー: 範囲外の数字を入力しています。" + num_range) 22 continue 23 return num 24 25 26while True: 27 x = readint("数字を入力してください。", -100, 100) 28 print(x)

-101, -100, 100, 101, 空行 などを入力して動作を試してみました。
ctrl−c で終了させています。
イメージ説明

投稿2019/01/14 01:33

編集2019/01/14 04:28
katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

evo6tm

2019/01/14 04:15

現在の私のレベルに合わせていただき、 ありがとうございます。 このように2つのプログラムを並べてみると 多くのコマンドを覚えることが、 簡素化するコツであることがよくわかりますね。 例外処理を行わない場合には ctr+c で終了させなければならないのですね。
guest

0

ベストアンサー

if num.isdecimal() != True:

マイナス記号は確かに数値を示すときには使いますが、数字ではありません。
これは + や e、また . が数字ではないのと同じです。

・ 数字以外のキー入力が1つでも含まれていたら、警告表示をして、再度、質問

『整数値に変換できなかったら』という仕様に変更すべきです。
その場合、例外処理を用いると簡潔に実装できます。

Python

1while True: 2 ... 3 try: 4 num = int(num) 5 except ValueError: 6 print ("エラー: 数値化することができません。") 7 continue 8 9 ...

なお、『数値numの値がaより大きくbより小さい』という条件は、次のように書くことができます。

Python

1if a < num < b: 2 ...

このように複合的な条件を記載できる言語は稀で、Pythonの特長の一つです。

書いてみた

私なら、こう書きます。

Python

1import sys 2 3 4def read_int(prompt, lower, upper): 5 prompt += f' [{lower}, {upper}]' 6 7 while True: 8 num = input(prompt) 9 try: 10 num = int(num) 11 except ValueError: 12 print(f'{num}は数値化できません。', file=sys.stderr) 13 continue 14 15 if lower <= num <= upper: 16 return num 17 18 print(f'範囲外の数字を入力しています。 [{lower}, {upper}]', file=sys.stderr)

#####ポイント

  • 関数名を、単語の区切りが分かるように変更
  • min及びmaxという命名は、組み込み関数と重複するので避ける
  • 下限と上限をせっかく受け取っているので、プロンプトの一部を関数内で生成
  • プロンプトの活用
  • f-string記法の積極的な利用
  • アーリーリターンを駆使し、コードを簡潔に
  • エラーは標準エラー出力に

投稿2019/01/13 16:37

編集2019/01/13 16:48
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

evo6tm

2019/01/13 18:08

早々のご回答をありがとうございます。 当方、本当に初心者で、まだ例外処理の学習前でした。 例外処理を学習していなければ難しいのですね。 改めて学習後に、いただいた回答をみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問