PR
【教育Python入門】for文をリストやrangeで制御する
パソコンは同じことを繰り返すことが得意です。繰り返しの操作は、まずパソコンにさせるべき作業です。
今回は繰り返しの操作をするfor文について説明します。
基本的にどの言語でも、繰り返しの操作を行う構文が備わっています。
実用レベルでもよく使う「繰り返し操作」をマスターしていきましょう!
- for文についての基本を知りたい!
- Pythonではfor文をどのように書くの?
for文に入る前に…Pythonのブロックについて
for文の説明の前に、Pythonにおけるブロックの扱い方について説明します。
プログラミング言語では、for文やif文、その他関数やクラスの定義(用語はとりあえず今はわからなくても大丈夫です)は「ここからここまでがその処理を行う内容だよ」という区切りを明記します。
この塊をブロック、と言います。
ブロックは普通、{}などで「この中がその処理を行う内容だよ」というのですが、Pythonはここがちょっと変わっていて、インデント(字下げ)が揃っている部分を同じブロックと見なします。
このルールはかなり重要です。
例えば他言語で、
for(条件){
処理A;
処理B;
}
という書き方をしたとしましょう。for文についてはこのあと説明するので「とりあえず処理Aと処理Bを繰り返すんだな」と認識してくれればOKです。このとき、
for(条件){
処理A;
処理B;
}
と書いても、
for(条件){処理A;
処理B;
}
と書いても問題なく動きます。統一感がなく見栄えが悪いだけです。
一方Pythonはインデント(字下げ)が一致している部分を一つのブロックとみなします。つまり、先ほどのfor文をPythonで書こうとすると、
for 条件:
処理A #行頭が処理Bと揃っている
処理B #行頭が処理Aと揃っている
と書けばよいことになります。このとき、
for 条件:
処理A
処理B #行頭が処理Aと揃っていない→このfor文とは別のブロックの処理と見なされる。
このような書き方はできない、ということですね。
インデントはしっかり揃えることを意識しましょう。
補足1.「インデントの字数」
Pythonのインデントの字数に決まりはありません。揃っていれば同じブロックと見なされます。ただし、Pythonのコーディング規約(PEP8という)によると半角スペース4つが基本、とされています。「それだとすぐ右端に達して見にくくなっちゃう」という場合は半角スペース2つとすることが多いようです。
補足2.「なぜこのようなルールなのか?」
先ほど「統一感がなく見栄えが悪いけど動く」と言いましたが、実はプログラミングにおいてこれが結構な問題になってきます。ただでさえプログラミングはパソコンが理解する言語=人間はわかりにくい言語なのに、書き方がぐちゃぐちゃだと、どこからどこまでどんな処理が行われているか、がわからなくなります。そして、それを読み解くことに結構な時間が費やされます。プログラミングを進めていたらわかりますが、このコストは馬鹿になりません。そこで、他言語でもインデントを揃えて可読性を上げる、という工夫をしますが、Pythonはこの「可読性を上げる」ことをルールとして課しているのです。しかも{}などの余計な記号で囲む必要がなくなるので、よりシンプルなコードになります。
for文の書き方と考え方
それでは本題に入っていきましょう。
for文は中のブロックの処理を繰り返し行っていくもので、次のような文法になります。
for 変数 in 反復可能オブジェクト:
処理
わかりにくいので具体例を見てみましょう。例えば、次のようなコードがあったとしましょう。
name_list = ["たろう", "花子", "先生"]
for name in name_list:
print(name)
#(出力)
# たろう
# 花子
# 先生
name_listにある名前が順番に出力されました。では、少し詳しく様子を見ていきましょう。
反復可能(イテラブル、iterable)オブジェクトとは
まず、「for 変数 in 反復可能(イテラブル)オブジェクト」の反復可能(イテラブル)オブジェクトについて説明していきます。(以下イテラブルオブジェクト、とします。)
簡単なイメージで説明すると、「先頭から順に要素を持ってくることができるもの」です。
具体例で言うと、先ほどのlist型、tuple(タプル)型、辞書型、文字列、range関数で作ったモノ、などがイテラブルオブジェクトに当たります。
これらの型での例をあげながら、for文について詳しく説明していきます。
for文の構造について詳しく説明
それでは、もう一度先ほどの具体例を見てみましょう。
name_list = ["たろう", "花子", "先生"]
for name in name_list: # ※
print(name)
#(出力)
# たろう
# 花子
# 先生
特にわかりにくいのは※の部分ですね。この部分は「for 変数 in イテラブルオブジェクト」と説明しましたが、実際には次のような動きになります。
- 変数(今回はname)にイテラブルオブジェクトの先頭の要素(今回は”たろう”)を代入。
- その変数に対しての処理(今回はprint(name))を行う。
- 変数に次のイテラブルオブジェクト(”花子”)を代入。
- その変数に対しての処理を行う。
- 以下、イテラブオブジェクトの要素の最後まで繰り返し処理を行う。
①が※に当たります。変数にイテラブルオブジェクトを代入して、その変数に対して処理を行う、という操作を繰り返します。
もっとfor文に慣れよう!
「イテラブルオブジェクトとは」で説明したタプル型、文字列、range関数での具体例を見ながら、for文に慣れていきましょう。
tuple(タプル)型とfor文
まずはタプル型です。
int_tuple = (0, 1, 2) # タプル型。追加や変更ができないリスト、と思ってもらえればOKです。
for int in int_tuple: # intにint_tupleの要素を代入しながら処理
print(int)
#(出力)
# 0
# 1
# 2
文字列とfor文
ちょっと意外ですが、文字列も反復可能です。
str = "おかずは塩鮭"
for s in str:
print(s)
#(出力)
# お
# か
# ず
# は
# 塩
# 鮭 ←こんな感じで、文字列を頭から1文字ずつとってきて処理します。
range関数とfor文
range関数はfor文と合わせてよく使う関数ですね。多言語でforを使うときの「何回繰り返す」という指定の仕方をするときに使います。
for文とrange関数はかなりよく使う組み合わせです。
まず、range関数の説明をしていきます。range関数は、簡単に言うと「連続した整数のイテラブルオブジェクトを作成する」関数です。以下のように指定して連続した整数のイテラブルオブジェクトを作成します。
- range(stop)
- range(start, stop[, step])
ただし、stop、start、stepは整数値です。
まずはrange(stop)の書き方ですが、0からstop未満の連続した整数のイテラブルオブジェクトを作成します。0からstop個の数字、と言ってもいいでしょう。
例えばrange(3)とすれば「0、1、2」となり、0から3未満、または0から3個の整数の数字のイテラブルオブジェクトを作成します。
for i in range(3):
print(i)
print("ダーッ!!")
#(出力)
# 0
# 1
# 2
# ダーッ!!
イマイチ雰囲気でませんね。
次は、range(start, stop)です。こちらは、startからstop未満の連続した整数のイテラブルオブジェクトを作成します。こちらの指定方法では、startを指定することで好きな整数から始めることができます。このときはstop未満まで、と認識した方がいいでしょう。
例えば、先ほどのコードのrange(3)をrange(1, 4)にすると、次のようになります。
for i in range(1, 4):
print(i)
print("ダーッ!!")
#(出力)
# 1
# 2
# 3
# ダーッ!!
ちなみに、range(start, stop, step)と指定すると、stepの刻みでイテラブルオブジェクトを作成します。
わかりにくいので、具体例を見てみましょう。
例えば、ちょっと高校数学っぽいですが、
100以上200未満の3の倍数の整数リストを作りたい!
と思ったとしましょう。100以上の整数で最初の3の倍数は102なので、
int_list = []
for i in range(102, 200, 3):
int_list.append(i) # リスト型.append(○)で、リストに○を追加する。
print(int_list)
#(出力)
#[102, 105, 108, 111, …(中略)…, 195, 198]
このように、step(今回は3)の値を指定することで、startからstop未満のstepごとの整数をとってきます。ちなみに、stepに負の値を代入すると降順になります。
int_list = []
for i in range(100, 0, -2): # 100から-2刻みで0まで(0は含まない)繰り返す。
int_list.append(i)
print(int_list)
#(出力)
#[100, 98, 96, 94, …(中略)…, 4, 2]
参考までに、100以上200未満の3の倍数の整数リストを作るだけなら、
int_list = list(range(102, 200, 3))
だけでできます。
list(イテラブルオブジェクト)でイテラブルオブジェクトを要素としたリストを作ります。
まとめ
今回はプログラミングの基本、for文についてまとめてみました。
Pythonのfor文は若干クセがありますが、Pythonの柔軟性がある特徴をよく表しているのかな、とも思います。
次はif文あたりを解説したいですね。