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分
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}")