Pythonで標準入力からデータを受け取るためのinput関数について解説します。実用的なプログラムでは外部ファイルからデータを読み込んだり、ユーザーに入力してもらってそれをプログラムで処理して結果を出力する、という流れになるため押さえておきましょう。
目次
input関数の基本的な使い方
input関数はPythonにあらかじめ用意されている組み込み関数の1つで、標準入力からデータを受け取る際に使います。入力されたデータは文字列として扱われるため、整数型や浮動小数点数として扱いたい場合は他の関数やメソッドと組み合わせて使用します。
文字列型として受け取る
まずは最も基本的な文字列の入力値を受け取ってみましょう。
pythonのinput関数で入力値を文字列として受け取るには次のように記述します。
input("入力待ち画面に出力するメッセージ")
“入力待ち画面に出力するメッセージ” は空にしておいても処理上の問題はありませんが、入力待ちであることがわかりにくいため何かしら入れておくと良いでしょう。
ただしinput関数は入力値を受け取るための関数なのでこのまま実行しても入力値を受け取るだけでプログラムの実行結果に影響を与えません。試しに上記の1文だけでプログラムを実行すると入力値を受け取りし次第プログラムの実行が終了します。
そこで実際には次のように受け取った入力値を変数に格納して使用します。
s = input("入力待ち画面に出力するメッセージ") # 入力値を文字列として受け取りs変数に代入 print(s) # s変数の中身を出力
実際に試してみましょう。
# 入力値:あいうえお # 実行結果:あいうえお
ここでは変数に代入した後そのまま出力しているだけですが、受け取った値を他の文字列と連結したり、特定の文字のみを出力するといった処理を加えることももちろん可能です。
数値として受け取る
input関数は入力されたデータを文字列型として受け取るため、数値として扱いたい場合は受け取ったデータを整数型や浮動小数点に変換してあげる必要があります。例えば整数型として受け取りたい場合はint関数を使って次のように記述します。
i = int(input("入力待ち画面に出力するメッセージ")) # 入力値を整数型として受け取りi変数に代入 print(i) # i変数の中身を出力
こうすることでinput関数で受け取った文字列データをint関数で整数型に変換してからi変数に代入することができます。
こちらも実際に試してみましょう。整数型として扱えることを確認するため受け取った数値に10を足して出力してみます。
i = int(input("入力待ち画面に出力するメッセージ")) # 入力値を整数型として受け取りi変数に代入 print(i + 10) # i変数の中身に10を足して出力 # 入力値:10 # 実行結果:20
入力値が文字列型として扱われた場合は連結処理となり1010と表示されるはずですので、20と表示されているということは整数型として扱えていることがわかります。
1行に複数の入力値の取得
複数の入力値が記号や空白で区切られた1行データをリストとして受け取るにはsplitメソッドを使います。splitメソッドは引数に指定した記号でデータを分割してリストとして返してくれる文字列メソッドです。
1行に複数の文字列を取得
まずは文字列型として扱ってみましょう。次のように記述します。
l = input("入力待ち画面に出力するメッセージ").split(",") # 入力値をカンマで区切って要素に分割しリストとして取得 print(l) # l変数の中身を出力
こうすることで引数で指定した記号で入力値を分割し、それらを要素としたリストとしてl変数に代入することができます。実際に試してみましょう。
# 入力値:リンゴ, ゴリラ, ラッパ # 実行結果:['リンゴ', ' ゴリラ', ' ラッパ']
全体が角括弧で囲まれ、各要素がシングルクォーテーションで囲まれカンマで区切られたリストになっていることがわかります。
1行に複数の整数を取得
次は受け取った値を数値型として扱いたい場合です。文字列の場合はsplitメソッドで要素を分割したリストにすることができましたが、splitメソッドはあくまで文字列型のメソッドなので、この方法で作成したリストの要素は文字列型です。
l = input("入力待ち画面に出力するメッセージ").split(",") # 入力値をカンマで区切って要素に分割しリストとして取得 print(l) # l変数の中身を出力 # 入力値:1,2,3 # 実行結果:['1', '2', '3']
数値型として扱うためにはこのリストの要素を数値型に変換してあげる必要があります。そこでmap関数でこのリストの要素を順番に取り出し、int関数で整数型に変換し、list関数でそれらの要素を再びリスト化してから変数に代入します。
i = list(map(int, input("入力待ち画面に出力するメッセージ").split(","))) #入力値をカンマで区切って要素に分割しリスト化、その後map関数で要素を順に取り出しint関数で整数型に変換、最後にlist関数で再びリスト化してi変数に代入 print(i) # i変数の中身を出力 # 入力値:1,2,3 # 実行結果:[1, 2, 3]
実行結果をみると各要素がシングルクォーテーションで囲まれていないため数値型になっていることがわかります。
複数行の入力値の取得
input関数は1行につき1行のデータ入力を受け付けます。そのため複数行の入力値を、各行を要素とするリストとして取得するにはループ処理を使うのが楽です。
予めリストを用意して必要な行数分ループを回し、input関数で受け取った値を要素としてリストに追加していってもいいのですが、「リスト内包表記」という記法を使えば簡単に記述することができます。
複数行の文字列の取得
まずは値をそのまま文字列型として扱い、各行を要素とするリストとして変数に格納してみましょう。
members = [input("入力待ち画面に出力するメッセージ") for i in range(3)] # input関数を3回実行し、その各回で受け取った値を要素とするリストを作成し、members変数に代入 print(members) # members変数の中身を出力 # 入力値1:アキハラ # 入力値2:イマイ # 入力値3:ウエダ # 実行結果:['アキハラ', 'イマイ', 'ウエダ']
実行結果を見ると、ちゃんと各行を要素とする1つのリストとなっていることがわかります。
複数行の整数の取得
受け取った値を整数型として扱いたい場合はint関数で整数型に変換して変数に代入してあげましょう。
numbers = [int(input("入力待ち画面に出力するメッセージ")) for i in range(3)] # input関数を実行して受け取った値をint関数で整数型に変換、それを3回繰り返し各回で受け取った値を要素とするリストを作成、numbers変数に代入 print(numbers) # numbers変数の中身を出力 # 入力値1:10 # 入力値2:20 # 入力値3:30 # 実行結果:[10, 20, 30]
数値型としてリストに格納されているため、各要素がシングルクォーテーションで囲まれていないのがわかります。
行数不明の入力値を取得
最後に何行入力されるか不明なデータを受け取ってリストに格納する方法をみていきましょう。
この場合はPythonの基本機能だけでは難しいので標準ライブラリからsysモジュールをインポートし、readlinesメソッドをつかいます。
import sys # sys モジュールをインポート members = [] # members リストを定義 for i in sys.stdin.readlines(): # データの読み込み members.append(i.rstrip()) # リストの末尾にデータを追加 print(members) # リストの中身を出力
実際に実行してみたいところなのですが、このままコマンドプロンプトで実行しても永遠に入力待ちが繰り返されるだけになってしまいます。
入力回数をあらかじめユーザーに入力してもらうのであれば、次のように記述することができます。
N = int(input("入力行数を教えて下さい")) # 入力回数をNとして受け取る s = [input("入力待ち画面に出力するメッセージ") for i in range(N)] # 複数行の数値の入力を取得 print(s) # s変数の中身を出力 # 入力値1:3 # 入力値2:アキハラ # 入力値3:イマイ # 入力値4:ウエダ # 実行結果:['アキハラ', 'イマイ', 'ウエダ']
最初に入力行数(今回は3行)を入力してもらい、それから各要素を入力してもらってリストにしています。