for
標準形
for [変数] in [オブジェクト]:
の形で変数がオブジェクトの要素を1つずつ取り出して実行する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
for i in [1, 3, 5]: print(i) # 1 # 3 # 5 for i in range(1, 4): print(i) # 1 # 2 # 3 for s in "string": print(s) # s # t # r # i # n # g |
range関数とfor文
for文でrange関数を使うと、多数回のループを簡易に書ける。このとき、rangeの終了値は指定した値-1になることに注意。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
for i in range(4): print(i) # 0 # 1 # 2 # 3 for i in range(1, 4): print(i) # 1 # 2 # 3 for i in range(0, 10, 2): print(i) # 0 # 2 # 4 # 6 # 8 |
enumerateによるインデックスの取得
Pythonのforループでは、リストなどの要素を直接取り出せるので表現が簡潔だが、逆に引数の値(配列の順序値など)が欲しいときがある。そのような場合は、enumerateを使ってインデックスを取得することができる。
zipによる複数リストの並行処理
複数のリストの要素を同時に並行して取り出したいとき、zip()
関数を使うとよい。
enumerateとzipの複合処理
zip
で複数のコレクションの要素を取り出しつつ、enumerate
で全体の番号も取得したいとき。zip
で取得する要素をタプルにする。
1 2 3 4 5 6 7 8 9 |
a = [10, 11, 12] b = ['A', 'B', 'C'] for n, (x, y) in enumerate(zip(a, b)): print(n, x, y) # 0 10 A # 1 11 B # 2 12 C |
forループの最初と最後だけ処理を変える
forループでは各ループごとに同じ処理内容が繰り返されるが、これを最初と最後だけ変更したい場合の処理を考えてみる。
while
while [条件式]:
で条件式が真である間ループが実行される。
1 2 3 4 5 6 7 8 9 10 |
n = 0 while n < 5: print(n) n += 1 # 0 # 1 # 2 # 3 # 4 |
else~終了時の処理
else:
ブロックを書くと、forやwhileのループ終了時にその内容が実行される。ループの後に実行文を書くのと動作は変わらないが、終了時処理をより明確にできる。
1 2 3 4 5 6 7 8 9 10 |
for i in range(0, 4): print(i) else: print("end") # 0 # 1 # 2 # 3 # end |
continue
continue文は、それ以降の処理を飛ばしてループの先頭に飛ぶ。
次の例では、iが偶数の時はそれ以降のprint文を実行せずに次のステップに移る。
1 2 3 4 5 6 7 8 9 10 |
for i in range(0, 10): if i % 2 == 0: continue print(i) # 1 # 3 # 5 # 7 # 9 |
break
break文は、そのbreak文が含まれている一番内側のループから抜け出す。
次の例では、内側のループでjが3を超えるたびにループを終了し、外側の次のステップへ移る。外側のループはiが1を超えたときにそれ以降の処理をせずループを終了する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
for i in range(0, 5): if i > 1: break for j in range(0, 5): if j > 3: break print(i, j) # 0 0 # 0 1 # 0 2 # 0 3 # 1 0 # 1 1 # 1 2 # 1 3 |