機械学習などで現在流行っているpythonですが、そのfor文(ループ)の使い方を3種紹介します。
今回紹介するのは、基本形、複数変数ループ(zip)、インデックス同時取得(enumerate)です。
基本形: for文
まずは基本形
1 2 3 4 5 6 7 8 9 10 |
# 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の配列でも同じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 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文を使えば抜けられる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# 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文です。
早速、例えを。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# 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文を使います。
1 2 3 4 5 6 7 8 9 10 11 12 |
#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文を紹介します。
これは、リスト(配列)の中身(値)とともに、そのインデックスも取得するコマンドになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#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に代入されます。
これでインデックスも同時に取得ができます。
コメント