Pythonのinput関数で、正しい入力があるまで何度も再入力させる方法

Python
Sponsored

Pythoninput関数を用いたプログラムをユーザーに使用してもらった時、必ずしもユーザーが製作者の意図した入力を行ってくれるとは限らない。

そうしてエラーが出る度にプログラムが終了していたのではあまりに不便であるため、異常な入力があった際はそれに対する注意を表示し、再び入力をさせる仕組みが必要になる。

この記事では、input関数の再入力の仕組みを、while文を使わずに構築する方法について示す(筆者は大量のデータを扱う作業をする中で、処理速度が非常に遅いwhile文が嫌いになった)。

例として、

六角形マップ(HEX)のプログラミング【実例編】
戦略SLGなどで見られる六角形のマップは、よくある四角形のマップに比べて見た目が格好いいだけではなく、ゲームの戦略性を高めてくれる。しかし、この六角形のマップをプログラミングで実装するとなると、専用のデータ型がないため、かなり頭を悩ます作業...

で提示したプログラムの一部を用い、その動作を解説することによって構築手法を示したい。

def How_many_players():
    player_num = input("How many players? ... ")
    try:
        player_num = int(player_num)
    except:
        print("Please enter 2, 3 or 4.")
        return How_many_players()
    if player_num < 2 or player_num > 4:
        print("This game is for 2 ~ 4 people.")
        return How_many_players()
    else:
        return player_num

player_num = How_many_players()

このコードは、2~4人のプレイヤーを想定したゲームプログラムの一部である。

How_many_players関数は「何人のプレイヤーが参加するか?」を尋ねることを目的とした関数であり、この戻り値がint変数player_numに格納されるが 、この質問に対して「100」、「2.2」、「あいうえお」などが入力されることも考えられ、その場合には当然エラーが生じる。

そのため、How_many_players関数では、3行目のtry文でまず「入力は整数値か?」を判断している。

この時、入力が「2.2」や「あいうえお」であった場合は例外処理(except)となるが、ここで行う処理は

Please enter 2, 3 or 4.

と注意を表示した後に、return How_many_players()、すなわち、How_many_players関数自身をもう一度呼び出して、2回目にHow_many_players関数の戻り値を1回目のものとして返す。

同様に、8行目のif文では「入力された整数は、2~4の範囲にあるか」を判断し、範囲外である場合には

This game is for 2~4 people.

という注意を表示した後、やはりreturn How_many_players()である。

エラーが生じて再度How_many_players関数が呼び出された後も、当然その関数は同様のエラーチェック機能を有しているため、さらにエラーが続いた場合は何度もHow_many_players関数が呼び出されることになる。例えば2回の不正な入力があり、3回目でようやく成功した場合には、

player_num = 戻り値 ← 2回目の戻り値 ← 3回目の戻り値

となり、player_numには正常な値が入ることになる。

以上のように、不正な入力があった際に自分自身を再び呼び出す関数を用いることで、while文を用いずとも、正常な値が得られるまで入力を繰り返させるプログラムを作ることができる。

Comments