今日他人にPythonを教えていて、改めてif文とfor文について思ったことがあったので、記事にしていきたいと思います。
if文・for文はプログラミングの大きな関門
プログラミングと言えば、if・for文ですよね。世の中には多くのプログラミング言語がありますが、これがない言語はまずありません。どのプログラミングの参考書を読んでいてもこいつらは出てきます。こいつの意味が分かれば、人手不足のIT業界なら立派なプログラマーという人もいます。
ですが、こいつらがプログラミングを始めた人が一番詰まるところでもあります。参考書を開くと、四則演算とかがまず出てきて足し算引き算割り算の練習をします。ここまでは誰でもわかります。ですが、if・for文で90%が脱落します。そして生き残った10%がプログラマー(PG/SE)となります。
ですが、if・for文はプログラミングの基本、というかプログラミングそのものと言っても過言ではなく、プログラミングはほぼ全て「条件分岐」と「繰り返し」からなります。繰り返しをfor文(while文)で行い、そこにif文で条件分岐を行っていきます。
if文・for文は何のためにあるのか?
こいつらは何のためにあるのかというとデータを処理するためです。当たり前だろ・・・と思うですが、初心者の人が躓くのはこれを意識していないからではないからでは?と最近思い始めました。問題を解くという形でif・for文と向き合っているからその本質を理解できないんじゃないかなと。
プログラミングの本質とは単純な作業をコンピューターにプログラムで命令させて自動化させるという事にあります。そして、このプログラムによる自動化にはfor文が必要不可欠なので、for文はプログラミングの要なのです。
for文とはなにか?
for文は繰り返し処理を行う関数です。Pythonだと「for 変数 ㏌ リスト型などのデータ配列」みたいな宣言方法になります。そして:以下の処理を指定された回数実行するという文です。
つまり、for文の実行している作業は、「for i in~」の後に指定する「データの集まり」から、「データを1つずつ順番に取り出して「i」に代入する」という処理です。この「データの集まり」部分には、リストが一般的ですが、リスト以外の様々なデータを指定することが可能です。
とりあえず実際の例でみていくと、まずプログラミングの教科書の例文でよくあるのは、以下のようなfor文のコードです。これでfor文は繰り返し処理という感じでさらっと流されますが、ここでは丁寧に処理の中身について解説していきます。
#print処理を10回繰り返す
for i ㏌ [1,2,3,4,5,6,7,8,9,10]:
print(i)
ちなみに実行した結果は↓のようになります。
1
2
3
4
5
6
7
8
9
10
この処理がなにを意味するのかというと、「i」という変数を定義し、そこに1から10が数字が入ったリスト(1,2,3,4,5,6,7,8,9,10)から1つずつ値を代入しているという処理を意味しています。「i」は一時的なデータの入れ物なので別に「i」じゃなくても何でもいいです。
なので、この処理を実行する中で行われていることは、まず「i」にデータの最初の「1」という数字が代入され、print(i)処理では、i=1が代入されているので「1」数字がプリントされます。
i=1 print(i) ※結果 1
そして、この処理が終わると最初に戻って次は「i」にリストの2番目にある2が代入されて、i=2となります。そして。print(i)を実行するとi=2なので「2」という数字がプリントされ、また最初に戻って、次は「i」に3が代入されて、i=3となります。
そして。print(i)を実行するとi=3なので「3」という数字がプリントされ~という処理が、今回はfor文に指定したデータが[1,2,3,4,5,6,7,8,9,10]なので、i=10まで繰り返されているのです。for文は「i」が指定したリストの最後のデータを代入すると処理が終了します。
そして、この処理の実行結果は1,2,3,4,5,6,7,8,9,10という風になります。この処理をコードで冗長に書き直すと以下のようになります。
i=1 print(i) ※1 i=2 print(i) ※2 i=3 print(i) ※3 i=4 print(i) ※4 i=5 print(i) ※5 i=6 print(i) ※6 i=7 print(i) ※7 i=8 print(i) ※8 i=9 print(i) ※9 i=10 print(i) ※10
この一連の処理がPCの中で一瞬で実行されて、実行結果として 1,2,3,4,5,6,7,8,9,10というのが返ってきます。
このように、「for文は回数を指定して繰り返すという処理ではなく、データ配列を指定して、その中を最初から最後まで1つずつ順番に代入していくという処理」なのです。指定したデータが10個なので、結果的としてprint(i)を10回繰り返すという処理になるだけです。
ちなみに、ここでの「i」はリストから代入する数値データの入れ物として臨時に定義する変数なので、別に「i」でなくても処理は成立しますが、Pythonの文法マナー的にはiがベストなので、「i」を使いましょう。一応↓みたいな書き方もできます。
練習では単純に1から10の数字を入れたリストですが、実務ではラベルと数値が入ったリスト型をに対してこの処理を行うのが一般的です。for文に使うリストはわざわざ中身を書かなくても変数を指定するだけで大丈夫です。
sample=[1,2,3,4,5,6,7,8,9,10]
for i in sample:
print(i)
※結果
1,2,3,4,5,6,7,8,9,10
他にもfor文はリスト型ならなんでも行けるので、今回の(1~10)みたいな数値データだけではなく、文字列のリストに対しても実行できますし、書き方を少し変えるとPandasのデータフレームでも実行することができます。
for文の理解において大切なのは、for文はただ単に繰り返した処理を実行しているのではなく、データ配列からデータを1つずつ順番に変数「i」に代入して:~の処理(この例ならprint(i))をしているということですね。
そしてここから逆に考えて特定の処理をn回繰り返すfor文を書きたい場合はデータがn個ある数値データを作ってそれをfor文のin~の部分に指定すればいいじゃんという理屈になります。
例えば、Hello Worldをプリントする処理を3回繰り返したいなと思った場合はデータが3個あるリストをfor文に指定すればいいのです。
#hello world を三回繰り返す
sample=[1,2,3]
for i in sample:
print(hello world!)
range関数でfor文で大量の繰り返し処理を実行する
このようにfor文はただ単に繰り返した処理を実行しているのではなく、データ配列からデータを1つずつ順番に変数「i」に代入して:~の処理を行うものなわけですが。
ですが、例えば同じ処理を100回や1000回くらい繰り返したい場合、いちいち[1,2~]みたいな、リスト型のデータ配列を自分で手を動かしてチマチマ作るとなると途方もない時間が掛かってしまいます。
これを自動でできるのがプログラミングの醍醐味なわけです。Pythonでfor文の「for i in データ:」でデータに当たる部分は、連続した数字のオブジェクトを生成する「range()関数」を使うことがよくあります。そして、実際にrange関数を使うにあたっては引数が3つ指定する必要があります。
#0から999までの範囲の数列を1つ飛ばしでprintする for i in range(0,1000,2): print(i) ※実行結果 0,2,4,6,8,10・・・・998
まず第一引数で数列の最初の数字を指定できます。デフォルトは0になっているので、なんも0から始まるオブジェクトを作るのであれば、省略できます。
第二引数には数列の最後の数字の次の数字を指定します。ここでは1000になっているので、0~999の範囲の等差数列を作ります。これは省略出来ません。
最後の第三引数には数列の数と数の間の幅を指定しています。今回は2なので、0,2,4・・・と数列の数字が飛んでいきます。これも何も指定しない場合はデフォルトは1になっています。
#0から999までの数字をprintする for i in range(0,1000): print(i) #0から999までの数字をprintする for i in range(1000): print(i) ※実行結果(2つとも同じ) 0,1,2,3・・・・999
このようにrange関数は「引数=()内の数値」を変えることで色んな数列を作ることができるので、for文で処理において非常に便利です。
まとめ
以上がfor文の処理の中身と意味です。プログラムの大半は「条件分岐」と「繰り返し処理」で成り立っています。これはほぼすべてのプログラミング言語に共通していることで、言語によって細かい書き方の違いはあるものこの考え方が理解できれば、Pythonだけでなく、他のプログラミング言語の習得も簡単にできるようになるでしょう。ですが、裏を返せばこのfor文を理解しないとプログラミングについて何も身に付いていないに等しいと言えます。
htmlやcssがプログラミングではないと言われる由縁はfor文がないという点にあります。そして、次の記事ではif文ついて解説するとともに以下のようなプログラミングの入門書でよくあるような例題の解き方について分かりやすく解説しています。
① 0〜10000までの数値を1つずつ足した合計値を求めてください
② 0〜4000までの範囲で、「偶数」だけを表示してください
③ [12, 46, 61, 81, 37]の数値が入った配列を作り、その中で20以下のものには「未成年です」、20以上「OKです」とprintさせる処理を行ってください。
コメント