mecobalamin’s diary

人間万事塞翁が馬

https://help.hatenablog.com/entry/developer-option

Pythonで数値のみの入力

以前、選択肢を数字で選ばせる
pythonスクリプトの記事を書いた
mecobalamin.hatenablog.com

該当する部分は以下のコード

print('計算の種類を選んで数字を入力してね')
print('1: 少数のたし算・ひき算')
print('2: 大きな数のかけ算')
print('3: あまりのあるわり算')
print('4: 分数のたし算・ひき算')
while True:
	eq_type = input('数値を入力 (1 - 4): ')
	if eq_type > '0' and eq_type < '5':
		break

動いていたから気にしていなかったが
入力は文字なのに大小の比較ができている

なぜだ?

文字列にも等号記号が使えることは知っていたが
調べてみると比較演算子も使えた
Pythonで文字列を比較(完全一致、部分一致、大小関係など) | note.nkmk.me
比較演算子の使い方 | Python入門

unicodeのコードポイントを比較しているそうだ

pythonではord()でコードポイントを取得できる

>>> ord('0')
48
>>> ord('1')
49
>>> ord('2')
50
>>> ord('9')
57

数字の0から9には
48から57が割り当てられている

なので過去記事で使ったコードでも
問題なく動いたようだ

本来ならint()で数値にして
大小比較するのが筋かも
ただし数値以外の文字・記号を
int()の引数にした場合はエラーになるので
try/except文を使って
エラーを弾きつつ
数値の入力を受け付けるように書き直した

try/excptの使い方は以下のサイトを参考にさせてもらった
Pythonの例外処理(try, except, else, finally) | note.nkmk.me

書き直したコードはこんな感じ
確認のためprint()を追加している

while True:
    eq_type = input('数値を入力 (1 - 4): ')
    try:
        int(eq_type)
    except ValueError as e:
        print('1から4までの数字を入力してね')
    else:
        if int(eq_type) >= 1 and int(eq_type) <= 4:
            break
        else:
            print('1から4までの数字を入力してね')

print(eq_type)

もっと簡潔にかけそうな気がする

あと全角・半角の区別はしていない
出力は半角になる
そのうち区別できるようにしたい