Python標準入力についてまとめ

pythonのinput()関数まとめpython

コーディング試験ではよく標準入力(stdin)が必要になる。

そこで今回は、Pythonで標準入力を実装する方法についてみる。

 

具体的にはPythonのinput関数について、その返り値や型がどのようなものなのか?についてまとめる。

 

実験用のPythonコードとして次を利用する:

【stdin.py】

inp = input()
print('input: ', inp)
print('type(inp): ', type(inp))
print('input().split(): ', inp.split())

try:
    print('list(map(int, input().split())):', list(map(int, inp.split())))
except:
    print('invalid literal for int().')

簡単に説明する。

 

まず、このコードを実行するとすぐにinput()により標準入力を待ち受ける。

 

標準入力してやると、上から順に標準入力した内容の表示、input関数の戻り値の型、そしてinput関数の戻り値に対してsplit関数を適用した結果を表示してくれる。

 

さらにtry/except節もある:

try:
    print('list(map(int, input().split())):', list(map(int, inp.split())))
except:
    print('invalid literal for int().')

これは、input関数の戻り値inpsplit()可能ならsplit関数を適用したものを表示し、input関数の戻り値inpsplit()不可能なら‘invalid literal for int().’を表示する仕組みになっている。

 

map(int, inp.split()))

map関数は、inp.split()(これはリストである)の要素一つ一つに対してint関数を適用するという意味。

map関数の返り値もリスト。

 

ちなみにPythonスクリプトの実行方法は、ターミナル上で

$ python3 stdin.py
# 標準入力待ちになる
# (何も表示されない)

のように入力後エンターを押せば(何も表示されないが)標準入力を待っている状態になる。

スポンサーリンク

色々な標準入力

以降では、この実験用スクリプトに色々な値を標準入力として与えてみて、どのようなデータや型が返ってくるかをみる。

(出力結果だけを示している)

整数一つ

7  # <- 標準入力したもの
input:  7
type(inp):  <class 'str'>
input().split():  ['7']
list(map(int, input().split())): [7]

複数の整数(スペース空けて)

1 2 3 4 5
input:  1 2 3 4 5 # <- 標準入力したもの
type(inp):  <class 'str'>
input().split():  ['1', '2', '3', '4', '5']
list(map(int, input().split())): [1, 2, 3, 4, 5]

スペース空けて複数の整数を入力すると、一つの文字列‘1 2 3 4 5’が返ってくる。

‘1 2 3 4 5’splitしてやるとそれぞれがstr型であるようなリストになる。

そのリスト[‘1’, ‘2’, ‘3’, ‘4’, ‘5’]map関数を用いてそれぞれにint関数を適用するとこで整数のリスト[1, 2, 3, 4, 5]を得る。

(スペースは全角でも半角でも同じだった。)

複数の整数(カンマ区切りで)

1,2,3,4,5
input:  1,2,3,4,5
type(inp):  <class 'str'>
input().split():  ['1,2,3,4,5']
invalid literal for int().

スペースを空けてないから1,2,3,4,5が一つの文字列‘1,2,3,4,5’として認識された。

文字列‘1,2,3,4,5’int関数に渡すとエラーだからexceptの文言が出た。

複数の整数(カンマ区切り+スペース)

1, 2, 3, 4, 5
input:  1, 2, 3, 4, 5
type(inp):  <class 'str'>
input().split():  ['1,', '2,', '3,', '4,', '5']
invalid literal for int().

スペースを空けると、‘1,’で一文字と認識された(他の数字についても同様)。

int関数に文字列‘1,’を渡すとエラーだからexceptの文言が出た。

文字を一文字

あ
input:  あ
type(inp):  <class 'str'>
input().split():  ['あ']
invalid literal for int().

一文字以上の文字列を一つ

あいうえお
input:  あいうえお
type(inp):  <class 'str'>
input().split():  ['あいうえお']
invalid literal for int().

複数の文字列(スペースを空けて)

あ い う え お
input:  あ い う え お
type(inp):  <class 'str'>
input().split():  ['あ', 'い', 'う', 'え', 'お']
invalid literal for int().

整数を与えた場合と同じだとわかる。

「あ い う え お」がそれぞれ「python へび プルグラミング 言語」だとしても、結果は同様のリストが返る。

(スペースは半角でも全角でも結果は同じだった。)

まとめ

上記の実験で飽きるほど見たが、input関数の返り値はstr型である!

  • 標準入力に幾つかの整数を(スペース空けて)入力し、その整数のすなわちint型のリストをが欲しい時は
    list(map(int, input().split()))
  • 標準入力に幾つかの単語や文字を(スペース空けて)入力し、その単語のリストが欲しい時は(list関数不必要。input()splitするだけでリストが出来る。)
    input().split()

(補足)小数について

上のコード(stdin.py)で小数を入力してみると次のようになる:

小数を一つ
3.7
input:  3.7
type(inp):  <class 'str'>
input().split():  ['3.7']
invalid literal for int().
小数を複数(スペース空けて)
2.1 4.5 3.7
input:  2.1 4.5 3.7
type(inp):  <class 'str'>
input().split():  ['2.1', '4.5', '3.7']
invalid literal for int().

いずれにせよstr型でない小数のリストを得ることが出来ない。

 

ここまでの実験を踏まえると、float型のリストが欲しいなら

list(map(float, input().split()))

とすればよいことがわかる。

 

【stdin.pyの修正後】

inp = input()
print('input: ', inp)
print('type(inp): ', type(inp))
print('input().split(): ', inp.split())

try:
    print('list(map(float, input().split())): ', list(map(float, inp.split())))
except:
    print('invalid literal for float().')

 

小数を複数入力してみると

2.1 4.5 3.7
input:  2.1 4.5 3.7
type(inp):  <class 'str'>
input().split():  ['2.1', '4.5', '3.7']
list(map(float, input().split())):  [2.1, 4.5, 3.7]

と小数のつまりfloat型のリストを得ることが出来た。

タイトルとURLをコピーしました