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文は動作可能でした。