機械学習などで現在流行っているpythonですが、そのfor文(ループ)の使い方を3種紹介します。
今回紹介するのは、基本形、複数変数ループ(zip)、インデックス同時取得(enumerate)です。
基本形: for文
まずは基本形
# loop_py.py
a = [0, 10, 20, 30]
for a_cont in a:
print(a_cont)
#出力
# 0
# 10
# 20
# 30
リストaの中身が、for文でa_contに代入されて、printされます。
numpyの配列でも同じです。
# loop_py.py
import numpy as np
a = np.array([0, 10, 20, 30])
for a_cont in a:
print(a_cont)
#出力
# 0
# 10
# 20
# 30
全く同じようになります。
途中でループを抜ける方法: break文
途中でループを抜けるときはbreak文を使えば抜けられる。
# loop_break_py.py
a = [0, 10, 20, 30]
for a_cont in a:
print(a_cont)
if a_cont == 20:
print("break!!!")
break
#出力
# 0
# 10
# 20
# break!!!
a_contが「20」になった時に、if文で条件が適合して、break文によってループの外に出たのがわかります。
ループが最後まで回った場合: else文
ここで面白い機能を紹介します。else文です。
早速、例えを。
# loop_else_py.py
a = [0, 10, 20, 30]
for a_cont in a:
print(a_cont)
if a_count == 40: # a_contはここを満たすことはなく、break文にはたどり着けない。
print("break!!!")
break
else: #ループが最後まで行った場合にはここが実行される。
print("loop end")
#出力
# 0
# 10
# 20
# 30
# loop end
上記のコードの場合には、for文によるループが最後まで行き、else文内に入りprint文が実行されて終了します。
これの何が良いかというと、ループ内のbreak文によって抜けた場合にはelse文配下が実行されず、最後までループを回った場合にはelse文配下が実行されます。
これを古典言語、例えばfortranで実現するには、ループの最後まで行った時にフラグを立てて、それをロープ文後で検知して、実行することになります。面倒。
複数変数ループ: zip文
次に複数のリストを同時にループさせるやり方です。
インデックスをループさせるのではなく、zip文を使います。
#loop_zip.py
a = [0, 10, 20, 30]
b = [2, 4, 8, 16]
for a_cont, b_cont in zip(a, b):
print(a_cont, b_cont)
#出力
# 0 2
# 10 4
# 20 8
# 30 16
このようにして、2つのリストa, bを同時に回すことができます。
各要素を使った演算などができます。
もちろん2つに限らず、3つでも、4つでもできますし、numpy配列でもできます。
ちなみにもしも要素の数が異なった時には、一番要素数の小さい配列に合わせてfor文が終了します。
インデックス(index)同時取得: enumerate文
最後にenumerate文を紹介します。
これは、リスト(配列)の中身(値)とともに、そのインデックスも取得するコマンドになります。
#loop_enu.py
a=[0, 1, 1, 2, 3, 5, 8]
for i, a_cont in enumerate(a):
print(i, a_cont) # iにはインデックスが代入されて、a_contには値が代入されている。
#出力
# 0 0
# 1 1
# 2 1
# 3 2
# 4 3
# 5 5
# 6 8
このenumerate文を使用すると、2つ情報が取得されます。
第一にインデックスが取得されて、上記の場合にはiに代入されます。
第二に要素値が取得されて、上記の場合にはa_contに代入されます。
これでインデックスも同時に取得ができます。
コメント