入力エラーの仕組みをつくろう!フラグやlen関数の使い方も覚えるよ

入力エラーの仕組みをつくろう!フラグやlen関数の使い方も覚えるよ

入力エラーの仕組みをつくろう!

前につくった1桁の数字当てゲームでも、ユーザーに数字を入力してもらうことはできたよね。でもあのままだと数字以外の文字を入れたときなんかも「ハズレ」って出ちゃう。そういうときはエラーメッセージが出てやり直せると親切だ。今回はその仕組みをつくっていくよ!

文字列はlistの要素としても使える!

4桁のランダムな数字を作ったときは、1文字ずつをlistの要素として作ったよね。実は文字列はそのままでlistの要素として使えるんだ!実際に書いてみるとこんな感じ。

# codeing=utf-8

b = input("数字を入れてね→")
print(b[0])
print(b[1])
print(b[2])
print(b[3])

▽ 実行結果

数字を入れてね→6491
6
4
9
1
>>> 

実行結果の1行目の数字は、自分で入力した適当な数字だ。入力してEnterをおすと数字を1つずつ表示してくれる。ポイントは、print(b[0])って書き方でちゃんと入力した最初の数字を取得できてるってこと。「6491」って文字列の0番目って書き方でOKってことだ!

入力が4桁かどうか判定しよう!

それじゃあ入力エラーの仕組みをつくっていこう。まずは4桁かどうかをチェックする仕組みだ。3桁の数字や5桁の数字を入れたときにエラーを出すよ。

何桁かっていうのは、入力した文字列が何文字あるかチェックすればいい。Pythonにはそのための機能として「len関数」というのが用意されてるんだ。例えば、len(b)と書くと変数bが何文字かが取得できる。ということは「if len(b) != 4:」という条件を指定すると、4桁じゃないときだけの命令を書けるんだね。実際に書いてみるとこんな感じ。

# codeing=utf-8

b = input("数字を入れてね→")
if len(b) != 4:
    print("4桁の数字を入れてね")
else:
    print("入力したのは:" + b)

▽ 実行して3桁の数字を入力

数字を入れてね→123
4桁の数字を入れてね

▽ 実行して4桁の数字を入力

数字を入れてね→1234
入力したのは:1234

4桁以外で入力したときはきちんとエラーが出るね!でも、このままだとエラーが出るたびにもう一度プログラムを最初から実行しないといけない。ゲームだったら間違えたら電源を切って最初からやり直しみたいな状態だからダメだよねw 実行し直さなくても入力だけやり直せる仕組みに修正していこう!

やりたいことは「正しく4桁で入力するまで、入力の受付を繰り返す」ってことだよね。〜するまでっていう条件つきで繰り返すには「while」を使えばいいって前にもやったね!実際に書くとこんな感じだ。

# codeing=utf-8

input_ok = False

while input_ok == False:
    b = input("数字を入れてね→")
    if len(b) != 4:
        print("4桁の数字を入れてね")
    else:
        input_ok = True

print(b[0])
print(b[1])
print(b[2])
print(b[3])
<p>
▽ 実行結果
</p>

数字を入れてね→123
4桁の数字を入れてね
数字を入れてね→1234
1
2
3
4
>>> 

今度はエラーが出た時にそのまま入力だけやり直せるようになった!それじゃあプログラムの解説をしていくよ。

解説

まず3行目に注目。

input_ok = False

input_okという名前で変数を作った。そして初期値は「False」を入れたよ。今回みたいに正しいか間違いかを判定するときは「True」と「False」を使うと便利だから覚えておこう!Trueは「○」で、Falseは「×」って感じで覚えておけば大丈夫。入力エラーのときは×、ちゃんと入力したら○みたいな感じで使うよ。

実際にそれをやってるのが5行目からの部分。

while input_ok == False:
    b = input("数字を入れてね→")
    if len(b) != 4:
        print("4桁の数字を入れてね")
    else:
        input_ok = True

初期値で「input_ok = False」って設定したから、最初は「while input_ok == False」が成り立つ。だからwhileの中身が実行されて入力欄が出て来るんだね。そしてもし4桁じゃなかったらさっきと同じようにエラーが出て来る。入力欄を出すのもwhileの中に書いてあるからエラーがなくなるまでずっと出し続けるってことができるんだ!

そして正しく4桁を入力したときの動きが9行目から。次の10行目で「input_ok = True」に書き換えてる。だからちゃんと正しく入力したときはもう「while input_ok == False」の中身は実行されなくなるんだね。そのときはじめて12行目以降に続く。

print(b[0])
print(b[1])
print(b[2])
print(b[3])

ここで入力した文字を1つずつ順番に出してるんだね。こんなふうに条件を満たすかどうかを「input_ok」っていう変数にTrueとFalseのどっちが入ってるかで判定して動きを変えてるんだ。こんな使い方を「Flag(フラグ)」って言うよ。「フラグが立ってたら実行する」みたいな言い方をするから覚えておこう!

ちゃんと数字が入力されたか判定しよう!

ここまでで4桁かどうかは判定できたね。でもこのままだと「abcd」って入れても4文字だからエラーがでない。そこを修正していこう!正しい数字じゃないときの条件の書き方はこんな感じ。

if (b[0]<"0") or (b[0]>"9"):
    print("数字じゃないよ")

まずはb[0]で1桁目だけを判定してるよ。「数字が0よりも小さい時」または「9よりも大きい時」は正しい数字じゃないって意味だ。ユーザーが入力した内容は文字列だから””がいることにも注意しよう!

これだけだと1桁だけだから、残りの桁も同じように書けばいいよ。最初から全部まとめて書くとこんな感じだ。

# codeing=utf-8

input_ok = False

while input_ok == False:
    b = input("数字を入れてね→")
    if len(b) != 4:
        print("4桁の数字を入れてね")
    else:
        if (b[0]<"0") or (b[0]>"9"):
            print("数字じゃないよ")
        elif (b[1]<"0") or (b[1]>"9"):
            print("数字じゃないよ")
        elif (b[2]<"0") or (b[2]>"9"):
            print("数字じゃないよ")
        elif (b[3]<"0") or (b[3]>"9"):
            print("数字じゃないよ")
        else:
            input_ok = True

print(b[0])
print(b[1])
print(b[2])
print(b[3])

実行して入力してみると、ちゃんと動いてるはずだ。いろんな数字や文字を入れて試してみよう!

ループ処理で判定をスッキリ書こう!

ここまででやりたいことはちゃんと出来たね。でももっとスッキリ書く方法も覚えていこう。気になるのはこの部分だ。

        if (b[0]<"0") or (b[0]>"9"):
            print("数字じゃないよ")
        elif (b[1]<"0") or (b[1]>"9"):
            print("数字じゃないよ")
        elif (b[2]<"0") or (b[2]>"9"):
            print("数字じゃないよ")
        elif (b[3]<"0") or (b[3]>"9"):
            print("数字じゃないよ")

b[0]からb[3]までを順番にチェックしてるところだけど、似たような処理を4回書いてて無駄だし見にくい。こんなふうに「〜回くりかえす」っていうのはfor構文でできるって前にもやったよね。早速書き換えてみよう!4回繰り返す書き方はこんな感じだった。

for i in range(4):
    #実行したい命令

これを使って書くとこんな感じだ。

# codeing=utf-8

input_ok = False

while input_ok == False:
    b = input("数字を入れてね→")
    if len(b) != 4:
        print("4桁の数字を入れてね")
    else:
        input_ok = True
        for i in range(4):
            if(b[i]<"0") or (b[i]>"9"):
                input_ok = False
                print("数字じゃないよ")
                break

print(b[0])
print(b[1])
print(b[2])
print(b[3])

解説

まず注目は10行目に追加したこの部分。

input_ok = True

10行目までで4桁かどうかのチェックは終わってるから、いったんinput_okのフラグはTrueにしておく。そのあとで1桁ずつforでチェックしていき、0から9の数字以外があったらFalseに上書きするって仕組みにしてるんだね。

次のポイントは15行目の「break」。

break

forで繰り返してるから、そのままだと数字じゃない桁があっても同じ処理を続けようとする。つまり「aaaa」って入力したら「数字じゃないよ」のメッセージが4回も出ちゃうってことだ。これはウザイし、1個でも数字以外があったらエラーなんだから1回でじゅうぶん。というわけで数字以外が1個でも見つかった時点で「break」で繰り返すのをやめてるってことだね。

今日のまとめ

  • 文字列はlistの要素としても使える!
  • 「len関数」で文字数をチェックしよう!
  • 「フラグ」とif分岐で状態をチェックして動作を分けられる!