Pythonのinput()関数でキーボード入力を受け取る

Modified: | Tags: Python

Pythonプログラムの中でキーボード入力を受け付けて値を取得するには、組み込み関数input()を使う。キーボード入力に限らず、パイプなどからの標準入力を受け取る際にも使われる。

なお、最後に説明するように、Python2系とPython3系でinput()の挙動が異なるので注意。以下のサンプルコードはすべてPython3。

キー入力ではなく、python(またはpython3)コマンドによるスクリプトファイルの実行時にコマンドライン引数を受け取る方法は以下の記事を参照。

また、ファイルの入出力については以下の記事を参照。

input()の基本的な使い方

以下のようにinput()でキーボード入力から取得した値を変数に格納できる。

val = input()

この行が実行されると入力待ちの状態になり、ターミナルやコマンドプロンプト(cmd.exe)などでキーボード入力が可能になる。例えばabcと入力した場合、文字列'abc'として値が取得できる。

val = input()
# abc

print(val)
# abc

print(type(val))
# <class 'str'>

input()の引数に文字列を指定すると、入力待ち時にその文字列が表示される。省略すると何も表示されず入力待ちなのか分からないので、入力を促すような文言を指定して表示させると親切。

val = input('Enter your name: ')
# Enter your name: Alice

print(val)
# Alice

print(type(val))
# <class 'str'>

便宜上、ここまでのサンプルコードはprint()の出力をコメントで示している。実際にスクリプトファイルをターミナルなどで実行したときの結果を以下に示す。

スクリプトファイルの中身。

val = input('Enter your name: ')

print('You are', val)

これを実行した結果は以下の通り。Enter your name:のところで入力待ちになり、例ではAliceと入力している。

$ python3 input_usage_script.py
Enter your name: Alice
You are Alice

キー入力を数値として受け取る: int(), float()

input()はキー入力を常に文字列strとして受け取る。数値が入力されても整数intや浮動小数点数floatではなく文字列strなので注意。

val = input('Enter an integer: ')
# Enter an integer: 100

print(val)
# 100

print(type(val))
# <class 'str'>

文字列strを整数intや浮動小数点数floatに変換するにはint(), float()を使う。

以下の例ではint()を使うが、float()でも同様。

i = int(input('Enter an integer: '))
# Enter an integer: 100

print(i)
# 100

print(type(i))
# <class 'int'>

当然ながらint()float()で変換できない文字列に対してはエラーが発生する。

# i = int(input('Enter an integer: '))
# Enter an integer: abc
# ValueError: invalid literal for int() with base 10: 'abc'

ユーザーからの入力を制限することは出来ないので何らかの例外処理が必要。

例えば、変換できない入力を特定のデフォルト値(ここでは0)として扱う場合は以下のようにする。

try:
    i = int(input('Enter an integer: '))
except ValueError:
    i = 0
# Enter an integer: abc

print(i)
# 0

while文による無限ループを使って、有効な値が入力されるまでinput()を繰り返すこともできる。

while True:
    try:
        i = int(input('Enter an integer: '))
        break
    except ValueError:
        print('Invalid input!')
# Enter an integer: abc
# Invalid input!
# Enter an integer: 100

print(i)
# 100

複数の値の入力を受け取りリスト化

キーボード入力から複数の値を受け取る方法について説明する。

決まった個数: input()を繰り返し

決まった個数の値を受け取りたい場合、単純にinput()を繰り返せばよい。

l = []

l.append(input('Enter the first value: '))
l.append(input('Enter the second value: '))
l.append(input('Enter the third value: '))
# Enter the first value: x
# Enter the second value: y
# Enter the third value: z

print(l)
# ['x', 'y', 'z']

任意の個数: while, iter(), split()

任意の個数の値を受け取りたい場合、while文または組み込み関数iter()を使う。区切り文字を指定して入力させてsplit()でリストに分割する方法もある。

文字列のリストを数値のリストに変換する方法は以下の記事を参照。

while文

while文による無限ループを使う例は以下の通り。overと入力されるまでinput()を繰り返し、入力された値をリストに追加している。

l = []

print('Enter "over" then finish')
while True:
    val = input('Enter a value: ')
    if val == 'over':
        print('FINISH')
        break
    l.append(val)
# Enter "over" then finish
# Enter a value: x
# Enter a value: y
# Enter a value: z
# Enter a value: over
# FINISH

print(l)
# ['x', 'y', 'z']

iter()

組み込み関数iter()を使うとよりシンプルに書ける。while文の例と同じくoverと入力されるまでinput()を繰り返す例は以下の通り。

l = list(iter(input, 'over'))
# x
# y
# z
# over

print(l)
# ['x', 'y', 'z']

iter()は第一引数に指定した呼び出し可能オブジェクト(ここではinput)が第二引数(ここでは'over')を返すまで繰り返され、それまでの返り値を要素とするイテレータを生成する。それをlist()でリスト化している。

input()に引数を指定したい場合はラムダ式(無名関数)を使う。ラムダ式自体の引数は無し。

l = list(iter(lambda: input('Enter a value: '), 'over'))
# Enter a value: x
# Enter a value: y
# Enter a value: z
# Enter a value: over

print(l)
# ['x', 'y', 'z']

split()

何らかの区切り文字を指定して入力させ、文字列strsplit()メソッドでリストに分割する方法もある。

val = input('Enter values separated by commas: ')
# Enter values separated by commas: x,y,z

print(val)
# x,y,z

l = val.split(',')
print(l)
# ['x', 'y', 'z']

上の例はカンマだが、もちろんスペースなどを区切り文字として使ってもよい。カンマの場合、余計な空白があったりすると追加の処理が必要なので注意。

改行を含む値の入力を受け取る

input()での入力はEnterキーやReturnキーの改行で決定されるため、改行を含む値を一度に入力・取得できない。

上の例のようにwhile文やiter()を使ってリストとして取得してからjoin()で要素ごとに改行された文字列に変換することで、見かけ上、改行を含む値を入力し取得できる。

iter()を使う場合はlist()でリスト化せずにそのままjoin()の引数に指定できる。以下の例ではiter()の第二引数が空文字列''なので、EnterキーやReturnキーが2回連続して押された時点で入力が終了する。

s = '\n'.join(iter(input, ''))
# Line1
# Line2
# Line3
# 

print(s)
# Line1
# Line2
# Line3

print(type(s))
# <class 'str'>

なお、この場合、input()の引数に文字列を指定すると改行のたびにその文字列が表示されてしまうので注意。

Python2とPython3の違い: raw_input()とinput()

Python2にはraw_input()input()関数が存在し、Python2のraw_input()がPython3のinput()に相当する。

Python2のraw_input(), Python3のinput()

Python2のraw_input(), Python3のinput()はキーボードからの入力を文字列strとして取得する関数。

Python2のinput()

Python2のinput()は入力された文字列をeval()で式として評価する関数。eval(raw_input()) と同じ。

例えば、Python2のinput()1 + 2と入力すると、文字列'1 + 2'ではなく1 + 2を式として評価した結果である3として値が取得される。

Python3にはPython2のinput()のように式として評価する関数は存在しない。

エラーが発生する場合

input()関連でエラーが発生する場合、Python2とPython3が混同されていることが多い。

インストールされているPythonのバージョンではなく、エラーが発生するコード中でsys.versionなどを用いて実際にそのコードが実行されているバージョンを確認してみることを推奨する。

関連カテゴリー

関連記事