【Python】for ~ else

Pythonのfor ~ else文
イテラブルを使い切ってループが終了する場合、else節が実行されます。
(breakが実行された場合は、イテラブルを使い切ってループが終了する場合にならないため、else節は実行されません)

コード1
for ~ elseのコードと実行結果

>>> for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...             print(n, 'equals', x, '*', n//x)
...             break
...     else:
...         # loop fell through without finding a factor
...         print(n, 'is a prime number')
...
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3

出典:4. その他の制御フローツール — Python 3.10.4 ドキュメント

 

上記コードでは、「for x in range(2, n):」と「else:」がセットになっています。
nが2の時は、「list(range(2,2))」が「[]」となり、(イテラブルを使い切ってループが終了し、)breakが実行されないため、else節が実行されます。
nが3の時は、「3 % 2」が「1」となり(「0」ではなく)、breakが実行されないため、(イテラブルを使い切ってループが終了することになり、)else節が実行されます。
nが4の時は、「4 % 2」が「0」となり、breakが実行されるため、else節は実行されません。
nが5の時は、「5 % 2」、「5 % 3」、「5 % 4」が全て「0」にならず、breakが実行されないため、else節が実行されます。

 

コード2
上記、コード1と同じ動作をするコード(breakあり。for ~ elseなし(if ~ elseあり))。
for n in range(2, 10):
    if n == 2:
        print(n, 'is a prime number')
        continue
    for x in range(2, n):
        if n % x == 0:
            print(n, 'equals', x, '*', n//x)
            break
        else:
            #break未実施の場合(=イテラブルを使い切ってループが終了する場合)
            if x == n-1:
                print(n, 'is a prime number')

実行結果(コード1と同じ)
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3

コード3
上記、コード1と同じ動作をするコード(breakなし。for ~ elseあり)。
for n in range(2, 10):
    flg = 0
    for x in range(2, n):
        if n % x == 0 and flg == 0:
            print(n, 'equals', x, '*', n//x)
            flg = 1
    else:
        # イテラブルを使い切ってループが終了する場合
        if flg == 0:
            print(n, 'is a prime number')

実行結果(コード1と同じ)
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3

イテラブルを使い切ってループが終了する場合にelse節が実行されるため、breakがなくてもfor ~ else文は動作可能でした。