Developer

【Python独学】for文のネスト構造
2020.11.02
Lv1

【Python独学】for文のネスト構造

for文のネスト構造について

今回は、for文での「ネスト構造」について紹介します。
for文での繰り返し処理の中で更に別の繰り返し処理を行うのに「ネスト構造」と呼ばれる構文を使用することが出来ます。


前回の記事で紹介したfor文の基本的な使い方は、以下の通りでした。

for 変数 in 繰り返すオブジェクト :
    実行する処理1
    実行する処理2
       ・・・

上記の ” 実行する処理1 ” として更にfor文を記述し、ネスト構造を作成してみます。

for 変数1 in 繰り返すオブジェクト :      #1つ目のfor文
    for 変数2 in 繰り返すオブジェクト :  #2つ目のfor文 
        実行する処理                     #2つ目のfor文の中で実行する処理
           ・・・

ここで、2つ目のfor文にはさらにインデントを入れていることに注意しましょう。
これは、1つ目のfor文とのブロックを区切るためです。

それでは、「ネスト構造」を使用した処理の例を見ていきましょう。

ネスト構造を用いたfor文の具体例

range関数を使用して数字を繰り返し取り出す処理の例を見てみましょう。
x,yがそれぞれ0~2までの範囲の二次元座標を出力します。

for x in range(3) :
    for y in range(3) :
        print(x,y)
C:\Python>python 4-2-1.py
0 0
0 1
0 2
1 0
1 1
1 2
2 0
2 1
2 2

まず、1つ目のfor文で変数xには0が入り、その状態で2つ目のfor文で変数yに0,1,2が順番に入ります。
次に、1つ目のfor文で変数xには1が入り、同様に2つ目のfor文が実行されます。
あとは、1つ目のfor文の繰り返しが終了するまで、同様の処理が実行されます。

結果が見づらいので、少し工夫してみましょう。
座標を括弧で囲み、xとyの間に点を入れます。

for x in range(3) :
    for y in range(3) :
        P=f"({x},{y})"
        print(P)
C:\Python>python 4-2-2.py
(0,0)
(0,1)
(0,2)
(1,0)
(1,1)
(1,2)
(2,0)
(2,1)
(2,2)

座標らしく表現しました。
なお、プログラム3行目のP=f”({x},{y})” の部分は、『f”任意の文字列{変数名}任意の文字列”』という書式を使用しています。
ダブルクォーテーションで囲まれた文字列の中で、{}を使用することで好きな場所に変数の値を埋め込むが出来ます。

ちなみに、各for文の繰り返しを抜けた後、変数x,yはどの値を引き継いでいると思いますか。

for x in range(3) :
    for y in range(3):
        print(x,y)
print(x,y)                       #for文のブロック抜け後の出力
C:\Python>python 4-2-3.py
0 0
0 1
0 2
1 0
1 1
1 2
2 0
2 1
2 2
2 2                                               #for文のブロック抜け後の出力

x、yは共に2という値が出てきます。
つまり、ネスト構造での繰り返しが抜けた後は、最後の値がそのまま引き継がれます。

次に、文字の組み合わせを取り出してみましょう。

colors = ["red" , "blue" , "yellow"]
shapes = ["triangle" , "square" , "circle"]
for color in colors :
    for shape in shapes :
        print(f"色は{color}、形は{shape}")
C:\Python>python 4-2-4.py
色はred、形はtriangle
色はred、形はsquare
色はred、形はcircle
色はblue、形はtriangle
色はblue、形はsquare
色はblue、形はcircle
色はyellow、形はtriangle
色はyellow、形はsquare
色はyellow、形はcircle

『色』と『形』の組み合わせを、ネスト構造のfor文を用いて出力します。
なお、1行目と2行目の[]は、リストと呼ばれるものです。

インデントの入れ忘れ

2つ目のfor文のブロックを記述する際に、インデントを入れ忘れたらどうなってしまうかを見てみましょう。

for x in range(3) :
    for y in range(3) :
    P=f"({x},{y})"            #2つ目のfor文のブロックにインデントを入れていない
    print(P)
C:\Python>python 4-2-5.py
File “C:\Python\python 4-2-5.py”, line 3
P=f”({x},{y})”
^
IndentationError: expected an indented block

このように、実行時にインデントエラーが発生しますので、ネスト構造を用いる際にはインデントを気にして記述しましょう。

以上がネスト構造についての説明でした。

※ネスト構造は、繰り返しが一つのブロックに3回以上あるとプログラミングが見づらくなるので、注意して使用しましょう。(for文の中のfor文の中のfor文・・・のように)


まとめ

ネスト構造でfor文を繰り返し使用することが出来ます。
ブロックを意識して、インデントを入れ忘れないようにしましょう。


確認問題

ネスト構造になっているfor文で、二次元座標を出力させてみましょう。

for x in range(n) :
    for y in range(n):
        print(x,y)

連載目次

独学で学ぶ Pythonプログラミング 連載目次