この記事は、Python学習の中で理解に時間がかかった「素数判定のコード」と「for...else構文」について、自分なりに整理したものです。
Pythonのforループにelse
が付くことに最初は違和感があり、何をしているのかが分かりにくかったのですが、ようやく少し腑に落ちたので備忘録としてまとめておきます。
実装したいこと
2から9までの数字に対して、以下のような結果を出したいです。
- 割り切れる数がある場合 → 「○ equals × * △」
- 素数の場合 → 「○ 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
コード全体
for n in range(2, 10):
for x in range(2, n):
if n % x == 0:
print(n, 'equals', x, '*', n // x)
break
else:
print(n, 'is a prime number')
各部分の解説
for n in range(2, 10):
2〜9までの数字(10は含まない)をひとつずつ取り出して調べていきます。
この n
が調べたい対象の数になります。
for x in range(2, n):
n
を 2〜n-1
のすべての数で割ってみるループです。
割り切れる相手がいれば、その時点で「素数ではない」と判断できます。
if n % x == 0:
割り算の余りが 0 になる場合、つまり n
が x
で割り切れる場合です。
割り切れた時は print(...)
して、break
で内側のループを抜けます。
break
割り切れる数が見つかったら、それ以上調べる必要はないのでループを抜けます。
else:
この else:
は、for x in range(2, n)
のループが break
されなかったときに実行されます。
つまり、どの x
でも割り切れなかった場合=n
は素数と判断され、「is a prime number」と表示されます。
処理の流れの例(n = 9 の場合)
-
x = 2
→9 % 2 = 1
→ 割り切れない -
x = 3
→9 % 3 = 0
→ 割り切れた! →print(...)
してbreak
-
else:
は実行されない
おわりに
最初は「なぜ2からn-1まで何回も割るのか」「elseがfor文についているのはどういう意味か」が分からず混乱しましたが、処理の順番を一つずつ丁寧に追うことで理解できるようになりました。
同じように悩んでいる方の参考になれば幸いです。
今後も学習したことを少しずつ整理して投稿していきたいと思います。