前回はif文の解説をしました。
今回はPythonのfor文の解説をします。
Contents
for文とは?
リストなどのシーケンスから1つずつ要素を取り出して処理したい場合や、同じ処理を一定の回数実行するループを組みたい場合にfor文を使います。
for文もif文の場合と同じように繰り返し実行したいコードの部分をインデントします。
Pythonではインデントが非常に重要な意味を持っていますので、注意してください。また、多くの場合インデントは半角スペース4つですので、それに統一してコードを記述すると分かりやすいです。
試しにもっとも簡単で分かりやすいコードを実行してみましょう。
#!/usr/bin/env python
#-*- coding: utf-8 -*-
def main():
l = [1, 2, 3, 4, 5]
for e in l:
print(e)
if __name__ == '__main__':
main()
これを実行すると以下のように出力されます。
1
2
3
4
5
リストなどのシーケンスから1つずつ要素を取り出して、それを実行しているだけですね。
range関数
for文の詳しい解説に入る前に、for文とセットで使うことが多いrange関数の解説から始めます。
1つの引数
range関数に1つだけ整数を与えると、0から引数の1つ前まで値が増える数値を要素とするリストを返します。
言葉で説明しても分かりにくいと思うので、実際に動かして見ましょう。
#!/usr/bin/env python
#-*- coding: utf-8 -*-
def main():
l = list(range(10))
print(l)
if __name__ == '__main__':
main()
これを実行すると以下のように出力されます。リスト方に変換してやることで0から9までの数値が入ったリストができているのが分かります。
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2つの引数
range関数に2つの引数を与えると、1つ目の引数から2つ目の引数の1つ前までの数値を持ったリストを作ることができます。
例えば、5から19までのリストを作りたければ以下のようにすれば出力できます。
#!/usr/bin/env python
#-*- coding: utf-8 -*-
def main():
l = list(range(5, 20))
print(l)
if __name__ == '__main__':
main()
これを実行すると以下のように出力されます。
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
3つの引数
range関数に3つの引数を与えると、1番の引数から2番目の引数の1つ前までの数値の中で、3番目の数をステップしたリストの数値を作ることができます。
例えば以下のコードを実行して見ましょう。
#!/usr/bin/env python
#-*- coding: utf-8 -*-
def main():
l = list(range(10, 30, 3))
print(l)
if __name__ == '__main__':
main()
すると以下のような出力が得られるはずです。
[10, 13, 16, 19, 22, 25, 28]
さらに、3番目の引数にマイナスの数字を与えると、リストの数値が順番に減っていきます。
例えば、以下のコードを実行してみましょう。
#!/usr/bin/env python
#-*- coding: utf-8 -*-
def main():
l = list(range(20, 10, -2))
print(l)
if __name__ == '__main__':
main()
これを実行すると以下のような出力が得られます。-2ずつ減っていってるのが分かりますよね。
[20, 18, 16, 14, 12]
このrrange関数はよく使いますので、しっかりと理解して使えるようにしておきましょう。
for文
for文はループを回す関数なのですが、シーケンスから要素を一つずつ取り出します。
初心者にも分かりやすい書き方
実際にコードを書いて動かした方が分かりやすいと思いますので、以下のコードを書いて実行してみましょう。
#!/usr/bin/env python
#-*- coding: utf-8 -*-
def main():
numbers = ['one', 'two', 'three']
c = 0
for num in numbers:
print (c, num)
c += 1
if __name__ == '__main__':
main()
これを実行すると以下のように出力されます。
0 one
1 two
2 three
for文を使うと、リストの中から1つずつ要素を抜き出してループを回すことができます。
この書き方はどういう処理をしているのか分かりやすいのですが、あまりスマートな書き方ではありません。
range()を使う
そこでrange関数を使います。先ほどと同じ処理をrange関数を使うと以下のように書くことができます。
#!/usr/bin/env python
#-*- coding: utf-8 -*-
def main():
numbers = ['one', 'two', 'three']
for i in range(len(numbers)):
print (i, numbers[i])
if __name__ == '__main__':
main()
これを実行すると先ほどと全く同じ出力が得られます。
len()という関数が出てきていますが、これはそのリストの中に入っている要素の数を返してくれる関数です。
コードはできるだけシンプルに行数が少ない方が読みやすいしバグが発生しにくくなりますので、シンプルに分かりやすく書くように心がけましょう。
enumerate()を使う
enumerate()という組み込み関数を使えばもっとシンプルに書くことができます。
enumerate()は2つの要素をタプルにして順番に返してきます。
最初の要素はループカウンタの数値で0から順番に1つずつ増えていきます。
2番目の要素はシーケンスの中に入っている要素です。
例えば、以下のコードを実行してみましょう。
#!/usr/bin/env python
#-*- coding: utf-8 -*-
def main():
numbers = ['one', 'two', 'three']
for c, e in enumerate(numbers):
print (c, e)
if __name__ == '__main__':
main()
すると以下のように表示されるはずです。
0 one
1 two
2 three
カウンターの数値とシーケンスの中の要素を順番に表示したい場合には、enumerate()関数を使うと非常にスマートに書くことができます。
zip関数を使う
要素数が同じ2つのシーケンスを同時に回すループを書きたい場合には、zip関数が使えます。
for文を使っても同じことはできるのですが、zip関数を使った方が短くスマートに書くことができるので、余裕があれば覚えておきましょう。
zip()関数は、2つのシーケンスから要素を順番に取り出して、2つの要素を持つタプルを作ります。
例えば以下のコードを実行しましょう。
#!/usr/bin/env python
#-*- coding: utf-8 -*-
def main():
n1 = [1, 2, 3, 4, 5]
n2 = ['one', 'two', 'three', 'four', 'five']
for c, e in zip(n1, n2):
print(c, e)
if __name__ == '__main__':
main()
すると、以下のように表示されます。
1 one
2 two
3 three
4 four
5 five
break文とcontinue文
for文はループを回す命令なのですが、ループを回している途中で、ある条件を満たした場合に、ループを途中で終了させたい場合があります。
その時に使うのがbreak文です。breakを使うとループをその時点で終了させます。
breakとよく似たcontinue文というのもあります。
continue文は、実行するとその後のブロックを飛ばして、ループの先頭まで戻ってループ処理を継続します。
break文の例
実際に以下のコードを動かしてみましょう。
#!/usr/bin/env python
#-*- coding: utf-8 -*-
def main():
l = [1, 2, 3, 4, 5]
for e in l:
if e == 4:
break
print(e)
if __name__ == '__main__':
main()
これを実行すると以下のように出力されます。
1
2
3
リストの中から要素を1つずつ取り出して処理していくのですが、4が出てきた時点でif文に引っかかりますので、その時点でループが終了します。
continue
次に以下のコードを実行してcontinue文を理解しましょう。
#!/usr/bin/env python
#-*- coding: utf-8 -*-
def main():
l = [1, 2, 3, 4, 5]
for e in l:
if e == 4:
continue
print(e)
if __name__ == '__main__':
main()
これを実行すると以下のように出力されます。
1
2
3
5
for文ですので、リストから要素を1つずつ取り出していきますが、4を取り出した時にはそれ以降のブロックを実行せずに、先頭に戻ってそこからループを再開します。
なので4の時だけprintが実行されず出力されていませんよね。
これがbreak文とcontinue文です。
最後に
このようにfor文を使うとリスト、タプル、辞書などから順番にループを回して要素を取り出すという処理をすることができます。
今はまだ具体的にどのように使うのかというイメージが湧かないと思いますが、色々なプログラムを作っていくうちに頻繁に出てくるので、少しずつ理解が深まると思います。
今は、ここで紹介したことだけでも理解しておけば十分でしょう。