こんにちは、今回はPythonの標準入力についてみていきたいと思います。
paizaで問題を解いてレベルアップをするには避けては通れない標準入力ですが、私は何も知らずに突っ込んでさっぱりわからず撃沈した記憶があります。(笑)
そんなことにならないように(ならないと思いますが笑)この記事で標準入力を理解していきましょう。
標準入力とは
この時、入力されたデータとは、一つとは限りません。複数入力されつこともあります。ですから、そんな複数個のデータにも対応できるようにしていきましょう。
標準入力ではsys.stdinやinput、fileinputなどがありますが今回はinput関数のみの紹介です。
なんとなくinput()を避けてsys.stdinを使ってきたけど実際どっちがいいのか?を速度とコード量的に比較してみま…
標準入力で使うinput関数
以下のようなプログラムを実行したときを考えてみましょう
1 2 3 4 5 6 7 8 |
line = input() #inputで取得したデータをline変数に代入 print(line) #確認のためにline変数のデータを表示 #入力データ Hello world #出力データ Hello world |
1行目で入力されたデータを受け取り、そのデータをline変数に格納しています。2行目はおまけです。ちゃんとinput関数で入力データを取得できている確認します。
もし、「Hello world」と入力されたら、「Hello world」と表示されますし、「123」と入力したらもちろん「123」と表示されます。
もし、入力されたデータを表示したいだけなら、わざわざline変数に格納しなくても以下のように書いてもOKです。
1 2 3 4 5 6 7 |
print(input()) #いきなりinputの内容を表示する #入力データ Hello world #出力データ Hello world |
このように入力することで1行減らすことができます。もちろん、先ほどのプログラムと出力結果は変わりません。
標準入力input関数の注意点
先ほど紹介したinput関数の注意点はデータ型です。
プログラミングをするうえでデータ型の話は避けては通れないくらい大切ですし、このデータ型の話を理解するだけで大きくレベルアップできます。
プログラミングをする上でデータ型の話を避けて通ることはできません。 データ型を理解していないとエラーが大量発生してしまうかも。 今回はそんな超重要なデータ型を初心者向けにやさしく解説していきます。 データ型って何?データ[…]
データ型の種類
データ型を細かく分けるとたくさんあるのですが、今回は簡単のために代表的な2つのデータ型を紹介しましょう。
- 文字列(string)
- 整数(integer)
この二つをまずは覚えておきましょう。
データ型の違いがある理由
なせ、このようにデータ型が分かれているのかというと、「データ型によって役割が異なるから」です。
整数なら四則計算(加減乗除)をすることができますが、文字列で計算することはできないというように、データに対してできる処理が異なるのです。
これは非常に重要なことです。もし、文字列に対して割り算をするとエラーになってしまいます。
1 2 3 4 |
line = 'aaa' / 3 #エラー発生 TypeError: unsupported operand type(s) for /: 'str' and 'int' |
上のエラーメッセージに出てきている’str’が文字列を、’int’が整数のデータ型を表しています。
つまり、「文字列は整数で割り算できません」という意味ですね。
もう一つ紹介すると
1 2 3 4 |
line = 'aaa' / 'aa' #エラー発生 TypeError: unsupported operand type(s) for /: 'str' and 'str' |
これも同じエラーが出ていますが、今度は「文字列同士の割り算はできません」ということが書かれています。
このように、データ型を間違えるとエラーが出てくるわけです。ですが、エラーが出てきてもあせらずデータ型を確認して直せば問題ありません。
input関数のデータ型
つまり、str型のデータになります。
たとえ、「123」というデータを受け取ったとしてもプログラム側では文字列として処理されてしまいます。
なので、入力データを整数として処理したければ
1 2 3 4 5 6 7 8 9 10 11 |
#整数として受け取るとき line = int(input()) #int関数で整数に変換 print(line) print(type(line)) #データ型の表示 #入力データ 123 #出力データ 123 <class 'int'> #int型になってる! |
このように、int関数で整数に変換する必要があります。このようにすることで、整数として処理できるので取得した入力データをもとに四則計算ができることになります。
1 2 3 4 5 6 7 8 |
line = int(input()) #整数としてデータを受け取る print(line + 3) #受け取ったデータに3を足して表示する #入力データ 123 #出力データ 126 |
上のように、入力したデータに3が足されて出力されています。intをつけないとこれまで見てきたようにTypeErrorが出てきてしまいます。
もし、エラーが出てきた場合は、データ型をチェックしてましょう!
複数行の標準入力
これまでは、1行のデータを読み込んでいましたが、次に複数行のデータを読み込んでみましょう。データの数は増えますが、input関数を使うことに変わりありません。
input関数を書き連ねる方法
読み込みたいデータの行数だけinput関数を書けばそれでOKです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
line1 = input() #1行目のデータを読み込む line2 = input() #2行目のデータを読み込む line3 = input() #3行目のデータを読み込む print(line1) #1行目のデータを表示 print(line2) #2行目のデータを表示 print(line3) #3行目のデータを表示 #入力データ 123 456 789 #出力データ 123 456 789 |
これは入力データが3行ある場合を想定しているので、input関数を3行書いているわけです。
その下に書かれているprint関数はおまけです。ちゃんと3行分読み込まれているかを確認するために書いています。
forループを使う方法
入力データの行数だけinput関数を書くにしても限界があります。100行ものデータを読み込むときに100行分input関数を書いていると、とても見にくいプログラムになります。
その時に使うのがforループです。もし、10行分のデータを読み込むとわかっている場合、
1 2 3 4 5 6 7 8 9 |
for i in range(10): line = input() print(line) #入力データ 10行分のデータ #出力データ 10行分のデータ |
このように書くことでコンパクトにまとまります。このプログラムでは、input関数で読み取ったデータをprint関数で表示する作業を10回繰り返すという意味になっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
line = [] #データを格納するカラのリスト for i in range(10): line.append(input()) print(line) #入力データ 10行分のデータ 1~10の数字を入力した場合 #出力データ 10個のデータが格納されたリスト ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'] |
空っぽのリストに読み込んだデータが次々に格納されています。
リストにデータを追加するのはappendですね。詳しい使い方は以下の記事で紹介しています。
Pythonのコンテナの一つであるリストに関して詳しく見ていきましょう。リストを自由に操作するためのメソッド11個の使い方を解説します。 メソッドとは? メソッドとはあるデータ型専用の関数のことです。なので、以下で紹介してるメ[…]
ちなみに、こんな書き方もあります。
1 2 3 4 5 6 7 8 9 10 |
line = [input() for i in range(10)] print(line) #入力データ 10行分のデータ 1~10の数字を入力した場合 #出力データ 10個のデータが格納されたリスト ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'] |
先ほどはカラのリストを用意しましたが、今回はその中にinput関数とforループを使って一気にリストを作っています。
リストとfor文を組み合わせて一行で書く方法は以下の記事でまとめています。
Pythonのループ処理に使われるfor文は基本的に複数行でコロン(:)とインデントを使って書かれますが、ときには1行で書くこともできちゃいます。 今回はその一行で書く方法と、複数行で書いた時との違いを紹介していきましょう。この記事[…]
よくあるinpu関数の使い方
これまで紹介した内容を組み合わせると、いろんな標準入力に対応することができます。新しい関数も出てくるので必見です!
任意の行数の入力データを読み込む
毎回あらかじめ決まった行数のデータを読み込むとは限りません。例えばあるクラスのテストの得点を読み込むとき、データの個数は各クラスの人数によって変わります。
そんな時には、最初の行でデータの個数を書いておき、その数の分だけforループ文を繰り返すことになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
num = int(input()) #データの個数を取得 line = [] #データを格納するカラのリスト for i in range(num): line.append(input()) #リストに追加していく print(line) #入力データ 4 #以下に続くデータの個数 123 456 789 Hello World #出力データ ['123', '456', '789', 'Hello World'] #4個のデータが格納される |
上の例では、入力データの1行目に4とあるので、その続きに4つのデータがあるということが分かります。
このようにするとデータの個数が分からなくても入力データごとに対応できますね♪
スペース区切りの入力データはsplitメソッド
これまでは1行に一つのデータを読み込んでいましたが、次は1行に複数個のデータがスペースで区切られている場合を考えましょう。
スペース区切りのデータとは以下のようなことを言います。
1 2 |
#入力データ 1 2 3 4 5 |
このデータをinput関数で読み込むときは
1 2 3 4 5 6 7 8 9 |
line = input().split() #splitメソッドでスペースを分割できる print(line) #入力データ 1 2 3 4 5 #出力データ ['1', '2', '3', '4', '5'] |
上のようにsplitメソッドを使うと勝手にスペースで区切ってくれて、さらにリストに要素を格納してくれます。
もし、この各要素を整数として扱いたい場合はというとmap関数を使います。
文字列リストを整数リストに変換map関数
1 2 3 4 5 6 7 8 9 10 11 |
#map関数の書き方 map(int, リスト) ''' リストの要素をすべてintにする mapオブジェクトが返される 注意! リストが返されるわけではない ''' #リストにしたければlist関数を使う list(map(int, リスト)) |
map関数の使い方は整数に変換することがすべてではありませんが、今回は脱線しないようにmap関数の説明はこの程度にしておきましょう。
以下のように書くことで整数のリストを作ることができます。
1 2 3 4 5 6 7 8 9 |
line = list(map(int, input().split())) print(line) #入力データ 1 2 3 4 5 #スペース区切りのデータ #出力データ [1, 2, 3, 4, 5] |
1行目の「input().split()」は先ほども見たように文字列のリストを返します。それをmap関数で整数に変換してlist関数でリストに戻すことになります。
リストではなく各変数に格納する
先ほどはスペース区切りの入力データをリストに格納しましたが、次は一つ一つの変数に代入しましょう。
1 2 3 4 5 6 7 8 9 |
X, Y, Z = input().split() #X,Y,Zの各変数に代入する print(X, Y, Z) #入力データ 1 2 3 #出力データ 1 2 3 #X,Y,Zの順 すべて文字列 |
一行目で3つの変数を用意しています。今回はデータの個数が3つであることわかっているので、このように書けます。
もし、入力データを整数として扱いたい場合は
1 2 3 4 5 6 7 8 9 |
X, Y, Z = map(int, input().split()) #X,Y,Zの各変数に代入する print(X, Y, Z) #入力データ 1 2 3 #出力データ 1 2 3 #整数 |
1行目でmap関数を使っているので整数として各変数に代入することができます。
まとめ
今回は標準入力でつかうinput関数を紹介していきました。わたしは、始めたての頃、標準入力で苦労した記憶があります。
paizaではこの標準入力ができないとスキルチェック問題が解けないのでぜひマスターしていきましょう。
また、今回紹介した関数たちを組み合わせることでいろんな入力に対応できるので試行錯誤しながら試してみてください。
この度、paiza(プログラミング学習サイト)で有料会員として受講してみたのでそのとき感じたメリット・デメリットを紹介します。無料会員に関係する話も出てきます。 この記事の情報は2020年6月のものです。 今回、受講した講座 […]
プログラミング言語のなかでも人気の高いPythonを学習する教材を紹介します。 最近ではプログラミングスククールがたくさんあるので迷うと思います。 ですが、まずは無料教材から始めてみましょう。苦労した分だけ力がつきます。 […]