文系でも分かるPython「for文のネスト構造」

目次

for文のネスト構造とは?

for文のネスト構造=for文の多重ループ

まずは、for文のネスト構造のテンプレートを確認してみよう

for 要素1 in 繰り返すオブジェクト1:
    for 要素2 in 繰り返すオブジェクト2:
        処理(print等)

今度は上記のテンプレートを元に数字を繰り返し出力する処理の例を見てみよう。

要素1= i
要素2= j
繰り返すオブジェクト1= range(2)
繰り返すオブジェクト2= range(3)
処理= print(i , j)

for i in range(2):
   for j in range(3):
      print(i,j)
0 0
0 1
0 2
1 0
1 1
1 2

この処理では、外側のfor文がrange(2)回ループしその外側の1ループごとに内側のfor文がrange(3)回ループしている。

つまり、

・外側1回目のループ“i=0”の最中に内側は3回ループ“j=0″,”j=1″,”j=2”し、それがprint(i,j)に代入され表示(0,0…)。
・外側2回目のループ“i=1”の最中も同じく内側は3回ループ“j=0″,”j=1″,”j=2”し、それがprint(i,j)に代入され表示(1.0…)。

という処理がなされたというわけ。

rangeを使わずに書く場合は以下参照。

for i in [0,1,2]:
    for j in [0,1,2,3]:
        print(i,j)
for i in ["ぜろ","いち","に"]:
    for j in ["ぜろ","いち","に","さん"]:
        print(i,j)

For文のネストの解説

for文のネストは時計に置き換えると理解がしやすいと思う。

for文のネスト構造=時計

1時間は60分。これは1時間の中で分は60回繰り返されるということでもある。

つまり

・外側1回目のループ”時間=0″の最中に内側は60回ループ”分=0″,”分=1″,”分=2″…され、59分の次は
・外側2回目のループ”時間=1″の最中に内側は60回ループ”分=0″,”分=1″,”分=2″…され、59分の次は…etc

ということ。これをコードに当てはめると以下のようになる

for h in range(24):
   for m in range(60):
      print(f"{h}時{m}分")
0時0分
0時1分
・
・
・
23時58分
23時59分
print(f”{h}時{m}分”

f-stringsで文字列の挿入をしている。{}の中を指定することによって{}の中に特定の文字列を挿入することが出来る。

name = "佐藤"
print(f"私の名前は{name}です。") #私の名前は佐藤です
name = "佐藤"
age = 21
print(f"私の名前は{name}です。年齢は{age}歳です。") #私の名前は佐藤です。年齢は21歳です。

分の内側に秒をつけてみても良いかもしれない

for h in range(24):
   for m in range(60):
    for s in range(60):
        print(f"{h}時{m}分{s}秒")
0時0分1秒
0時0分2秒
・
・
・
23時59分58秒
23時59分59秒

まとめと問題

一見複雑そうに見えるforのネスト構造だが、外側の1ループ=内側のxループのようにシンプルに考えると混乱せずに済むと思う。

だからといってforの重ねすぎは禁物。

問題1

九九の計算表を出力してみてください。

ヒント
range(開始値,終了値)

print(range(1,6))
>>>1,2,3,4,5

期待する出力

1×0=0
1×1=1
1×2=2
1×3=3
・
・
・
9×9=81
答え
for i in range(1,10):
    for j in range(1,10):
        a = i*j
        print(f"{i}×{j}={a}")

問題2

あなたの一日のルーティンを考え出力してください

期待する出力(例)

月曜日もくう
月曜日もねる
月曜日もあそぶ
月曜日もまなぶ
答え(例)
for dow in ["月","火","水","木","金","土","日"]:
    for action in ["くう","ねる","あそぶ","まなぶ"]:
        print(f"{dow}曜日も{action}")

リストを活用すると見やすいです。

dows = ["月","火","水","木","金","土","日"]
actions = ["くう","ねる","あそぶ","まなぶ"]

for dow in dows:
    for action in actions:
        print(f"{dow}曜日も{action}")
目次