Pythonにおけるfor文の使い方を紹介する。
- 標準的な使い方
- 特殊な使い方
- 標準的な使い方と特殊な使い方の書き換え方法
- 標準的な使い方と特殊な使い方の違い
1. 標準的な使い方
0や1から1ずつカウントアップして指定回数(整数値)でループを終了する方法。
下記の例は0から9までカウントアップするループ。
ループの中身は最も素朴なコードであるprint()を使用している。
# コード
for i in range(0, 10):
print(f"i={i}")
print(r"done!")
標準的な使い方におけるfor文の実行結果は下記の通り。
i=0
i=1
i=2
i=3
i=4
i=5
i=6
i=7
i=8
i=9
2. 特殊な使い方
Pythonのfor文は、下記のように配列(行列)やリストといったデータの集合から、データの要素がなくなるまで取り出し続けるという操作が可能である。
# コード
import numpy as np
this_is_a_matrix = (
(11,12,13),
(21,22,23),
(31,32,33),
)
print(r"行列(配列)の要素は次のように取得できる")
for a_line in this_is_a_matrix:
for i in a_line:
print(f"i={i} in a_line(row) in matrix")
print(r"done!")
特殊な使い方におけるfor文の実行結果は下記の通り。
行列(配列)の要素は次のように取得できる
i=11 in a_line(row) in matrix
i=12 in a_line(row) in matrix
i=13 in a_line(row) in matrix
i=21 in a_line(row) in matrix
i=22 in a_line(row) in matrix
i=23 in a_line(row) in matrix
i=31 in a_line(row) in matrix
i=32 in a_line(row) in matrix
i=33 in a_line(row) in matrix
done!
なお、この例でループを2回行っているのは、1回目で取り出したデータもまたデータの集合になっているからである。
このような使い方では、下記のステップが行われる。
- for a_line in this_is_a_matrix: では、行列(配列)this_is_a_matrixから1行のデータ(1行3列の一まとまりのデータ)を取り出している。
- for i in a_line: では、上記のステップ1で取り出した1行のデータから更に1列目の要素を取り出している。
- for i in a_line: で、3列目まで取り出した後、外側のfor文に戻り、2行目…,3行目… と、取り出せる要素がなくなるまでループする。
また、上記の例で、単に1行目の要素のみ取り出したい場合、下記のようにして取り出すことができる。
# コード
import numpy as np
this_is_a_matrix = (
(11,12,13),
(21,22,23),
(31,32,33)
)
print(r"") # 改行
print(r"ループを使用せずに1行目のみを取り出す")
a_first_line = this_is_a_matrix[0]
print(f"a_first_line={a_first_line}")
print(r"") # 改行
print(r"ループを使用せずに1番目要素のみを取り出す")
an_first_element = this_is_a_matrix[0][0]
print(f"an_first_element={an_first_element}")
print(r"done!")
上記のコードの実行結果は下記の通りである。
ループを使用せずに1行目のみを取り出す
a_first_line=(11, 12, 13)
ループを使用せずに1番目要素のみを取り出す
an_first_element=11
done!
3. 標準的な使い方と特殊な使い方の書き換え方法
特殊な使い方のfor文は下記のように書き換えられる。
# コード
import numpy as np
# numpy配列として定義
this_is_a_matrix_np = np.array(
((11,12,13),
(21,22,23),
(31,32,33))
)
print(r"") # 改行
# shape関数を使用して何行何列の行列か把握する
# 戻り値は2次元の行列の場合は1行2列の行列
print(f"this_is_a_matrix_np.shape ={this_is_a_matrix_np.shape }")
print(f"this_is_a_matrix_np.shape[0]={this_is_a_matrix_np.shape[0]}")
print(f"this_is_a_matrix_np.shape[1]={this_is_a_matrix_np.shape[1]}")
print(r"") # 改行
row_line_element_size = this_is_a_matrix_np.shape[0]
column_line_element_size = this_is_a_matrix_np.shape[1]
for ii in range(0, row_line_element_size):
for i in range(0, column_line_element_size):
print(f"this_is_a_matrix_np[{ii}][{i}]={this_is_a_matrix_np[ii][i]}")
print(r"done!")
上記のfor文のコードの実行結果は下記の通りである。
this_is_a_matrix_np.shape =(3, 3)
this_is_a_matrix_np.shape[0]=3
this_is_a_matrix_np.shape[1]=3
this_is_a_matrix_np[0][0]=11
this_is_a_matrix_np[0][1]=12
this_is_a_matrix_np[0][2]=13
this_is_a_matrix_np[1][0]=21
this_is_a_matrix_np[1][1]=22
this_is_a_matrix_np[1][2]=23
this_is_a_matrix_np[2][0]=31
this_is_a_matrix_np[2][1]=32
this_is_a_matrix_np[2][2]=33
done!
4. 標準的な使い方と特殊な使い方の違い
標準的な使い方と特殊な使い方に、実は違いはない。
実は標準的な使い方で使用されているrange(0, n+1)は 0からnまでの整数を要素とするリストを生成する関数 であり、そのリスト(データの集合)の中から要素がなくなるまで、1番目の要素から順に取り出すことで、見かけ上のカウントアップを行っている。実際に下記のコードによって、range()の中身を見てみるとよく分かる。
import numpy as np
data_range_function = np.array(range(0, 10))
print(data_range_function)
実行結果:
[0 1 2 3 4 5 6 7 8 9]
EOF