質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

2回答

3320閲覧

if n%xの条件の出力の結果がなぜそうなるのかがわからない

GuMasi

総合スコア73

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/02/11 09:18

編集2020/02/11 09:20

if n%x ==0:についてなのですが、nは一行目の数値2としxは2行目のfor文の数値2を比較していて余り0なので、0==0:なのでtrueとなり、print(n, 'equals', x, '*', n//x)の結果が出力されると思っていましたのですが、どうしてelseの方の出力結果(一行目と2行目)がされたのでしょうか?

python

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

出力結果:
lw:python-izm wl$ python3 list3.py
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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2020/02/11 09:25

インデント合ってますか?
GuMasi

2020/02/11 09:34

コメントいただきましてありがとうございます。 最後の行のインデントの事ですよね?
GuMasi

2020/02/11 09:38

すみません、見間違えました。 elseの事ですよね。
guest

回答2

0

Python の range(a, b) ですが、「a から始めて、b の手前まで」です。特に、a == b なら range は空っぽなので、

python

1for i in range(2, 2): 2 print(i)

は一度もループを回らず、何も表示されません。(Java などの for (int i = 2; i < 2; i++) ... と同じ。)

ご質問の素数を求めるプログラムですが、外側のループ for n in range(2, 10): は 2 〜 9 の整数 n が素数かどうか調べる対象となり、内側のループ for x in range(2, n): では 2 〜 n-1 の整数 x で n が割り切れるか調べて、どれでも割り切れなければ素数ということになります。

また、else のインデントですが、Python には for 文に対する else というものが存在しますので、

python

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

この else は if ではなく for x に対するもので、break で抜けずにループをすべて回りきった場合(つまり、n がどの x でも割り切れなかった場合)に実行される処理になります。(あえて言えば else の後ろの print のインデントは微妙ですね。)

投稿2020/02/11 09:51

編集2020/02/11 10:00
hoshi-takanori

総合スコア7895

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GuMasi

2020/02/11 12:23

回答くださりましてありがとうございます。 for x in range(2, n): では 2 〜 n-1 についてなのですが、 n-1は一行目のfor n in range(2, 10):の変数nのことですよね? >>この else は if ではなく for x に対するもので、break で抜けずにループをすべて回りきった場合(つまり、n がどの x でも割り切れなかった場合)に実行される処理になります。(あえて言えば else の後ろの print のインデントは微妙ですね。) そうなのですね。 もろもろ教えてくださりありがとうございます。
hoshi-takanori

2020/02/11 20:40

> for x in range(2, n): では 2 〜 n-1 についてなのですが、 > n-1は一行目のfor n in range(2, 10):の変数nのことですよね? はい。 n = 2 の時、x は空(break せずにループを回りきったことになるので、素数と判定される) n = 3 の時、x は 2 〜 3-1 つまり 2 だけ(2 で割り切れないので、ループを回りきって、素数) n = 4 の時、x は 2 〜 4-1 つまり 2 と 3 だが、n は 2 で割り切れるので break(非素数) n = 5 の時、x は 2 〜 5-1 つまり 2 と 3 と 4(ループを回りきって、素数) という感じになります。
GuMasi

2020/02/12 12:05

ありがとうございます。 助かりました。
guest

0

python

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

結果
3 is a prime number
4 equals 2 * 2
5 is a prime number
5 is a prime number
5 is a prime number
6 equals 2 * 3
7 is a prime number
7 is a prime number
7 is a prime number
7 is a prime number
7 is a prime number
8 equals 2 * 4
9 is a prime number
9 equals 3 * 3

投稿2020/02/11 09:26

cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2020/02/11 09:28 編集

なんか変だけど?・・・インデント変えてみました。
GuMasi

2020/02/11 09:57

回答いただきましてありがとうございます。 if n % x == 0:の事なのですが、nとxはどちらの値と比較してますということなのでしょうか?
GuMasi

2020/02/15 09:39

お返事が遅くなりまして申し訳ありません。 hayataka2049さんコメントいただきましてありがとうございます。 >pythonのfor文はelse節を取ります。これはbreakせずにループが回りきれば実行されます。 >>そうなのですね。 教えてくださりまして助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問