HOWTO · Python

Python でユーザー入力を整数として読み取る方法

Python 3 でユーザー入力を整数として読み取る方法:int(input()) で単一の値を変換し、split() と map() で 1 行から複数の整数を読み取り、try-except で無効な入力を処理します。

このページの内容

Python 3 では、input() 関数は常に入力を文字列として返します。入力された値を数値として扱うには、その文字列を int() で変換します。この記事では、整数を 1 つ読み取る方法、整数として無効な入力を処理する方法、そして 1 行から複数の整数を読み取る方法を説明します。

この記事では Python 3 を対象とします。Python 2 では同じ用途に raw_input() が使われていましたが、2020 年にサポートが終了したため、以下の例ではすべて input() を使用します。

int(input()) で整数を 1 つ読み取る

まず入力を文字列として読み取り、それから変換します:

user_input = input("Please enter an integer: ")
integer_value = int(user_input)

print("You entered:", integer_value)
print(type(integer_value))

出力:

Please enter an integer: 42
You entered: 42
<class 'int'>

変換と読み取りは 1 行にまとめることも多く、動作はまったく同じです:

integer_value = int(input("Please enter an integer: "))

ユーザーが hello や 3.5 のような整数ではない値を入力すると、int() は ValueError を発生させ、プログラムは停止します。次のセクションでは、その場合の処理方法を説明します。

try-except で無効な入力を処理する

変換を try-except ブロックで囲むことで、ValueError を捕捉し、プログラムをクラッシュさせる代わりに再入力を求めることができます:

while True:
    user_input = input("Please enter an integer: ")
    try:
        integer_value = int(user_input)
        print("You entered:", integer_value)
        break
    except ValueError:
        print("That's not a valid integer. Please try again.")

ループは変換が成功するまで入力を求め続けます。break がループを終了させるのは、そのときだけです。

出力:

Please enter an integer: hello
That's not a valid integer. Please try again.
Please enter an integer: 10
You entered: 10

このように入力を検証することは、対話型プログラムのベストプラクティスです。入力ミスをしたユーザーが支払う代償は、プログラム全体の終了ではなく、もう一度入力を求められることだけで済むはずです。

1 行から複数の整数を読み取る

プログラムが一度に複数の数値を必要とする場合は、ユーザーにスペースで区切って 1 行に入力してもらいます。split() は行を文字列の断片に分割し、map() は各断片を int() で変換します:

numbers = list(map(int, input("Enter numbers separated by spaces: ").split()))

print(numbers)
print("Sum:", sum(numbers))

出力:

Enter numbers separated by spaces: 4 8 15 16 23 42
[4, 8, 15, 16, 23, 42]
Sum: 108

リスト内包表記でも同じことができ、こちらもよく使われます:

numbers = [int(piece) for piece in input("Enter numbers separated by spaces: ").split()]

必要な値の数が決まっている場合は、結果を直接アンパックできます。ここでは、ユーザーはちょうど 2 つの整数を入力しなければなりません:

a, b = map(int, input("Enter two numbers: ").split())

print("a =", a)
print("b =", b)

出力:

Enter two numbers: 3 17
a = 3
b = 17

想定より多い値や少ない値を入力すると ValueError が発生します。そのため、個数が重要になる場合は、このパターンを前のセクションの try-except ループと組み合わせてください。

int() が受け付けるものと拒否するもの

int() は多くの人が思うよりも寛容です。前後の空白を無視し、+ や - の符号を任意で受け付け、数字の間にアンダースコアを入れることもできます:

print(int(" 42 "))
print(int("+7"))
print(int("1_000"))

出力:

42
7
1000

文字列形式の整数リテラルでないものはすべて拒否します。これには "3.5"、"12a"、空文字列 "" が含まれ、いずれも ValueError を発生させます。入力に小数値が含まれる可能性がある場合は、代わりに float() で変換するか、小数部分を切り捨ててもよい場合は int(float(text)) を使ってください。

結論

Python 3 で整数を読み取る方法は、1 つのパターンに集約されます。input() は文字列を返し、int() がそれを整数に変換します。無効な入力でプログラムがクラッシュする代わりに再入力を求めるよう try-except ループを使い、1 行から複数の整数が必要な場合は split() と map()、またはリスト内包表記を使ってください。

FAQ

  1. Python 3 でユーザー入力を整数として読み取るにはどうすればよいですか?
    int(input()) を使います。input() は 1 行を文字列として読み取り、int() がそれを整数に変換します。

  2. 1 行から複数の整数を読み取るにはどうすればよいですか?
    行を分割して各断片を変換します。たとえば list(map(int, input().split())) や [int(x) for x in input().split()] です。

  3. ユーザーが整数ではない値を入力するとどうなりますか?
    int() が ValueError を発生させます。try-except ブロックで捕捉し、再度入力を求めてください。

  4. input() の結果に対して直接算術演算ができないのはなぜですか?
    input() が返すのは数値ではなく文字列だからです。文字列と整数を加算すると、文字列を int() で変換するまでは TypeError が発生します。

  5. 入力の読み取りにおける Python 2 と Python 3 の違いは何ですか?
    Python 2 ではテキスト入力の読み取りに raw_input() を使っていましたが、Python 3 では input() を使います。int() による変換はどちらでも同じように機能しますが、Python 2 はすでにメンテナンスされていないため、新しいコードでは Python 3 を使うべきです。