メカエンジニアのためのプログラミング #017 Python for文

Pythonにおけるfor文の使い方を紹介する。

  1. 標準的な使い方
  2. 特殊な使い方
  3. 標準的な使い方と特殊な使い方の書き換え方法
  4. 標準的な使い方と特殊な使い方の違い

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回目で取り出したデータもまたデータの集合になっているからである。

このような使い方では、下記のステップが行われる。

  1. for a_line in this_is_a_matrix: では、行列(配列)this_is_a_matrixから1行のデータ(1行3列の一まとまりのデータ)を取り出している。
  2. for i in a_line: では、上記のステップ1で取り出した1行のデータから更に1列目の要素を取り出している。
  3. 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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

トップに戻る