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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

1553閲覧

python for 文の中にif文があるときのelseの位置でどのような処理が行われているのか

phamko

総合スコア7

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

2クリップ

投稿2020/05/02 07:58

100までの素数の列挙を行おうと、様々なサイトで調べてコードを書いたのですが

prime_number = [2] for T in range(3,101,2): for Ts in prime_number: if T % Ts == 0: break else: prime_number.append(T) print(prime_number)

このコードを実行するとすごい勢いで大量の数字が無限に出てきたのですが、上のコードだとどういった処理が行われているのでしょうか。

elseの位置が間違えていること、内側のfor文と同じ位置にelseを書くことで内側のfor文の処理が終わった後にelseの処理が行われるというのは知っているのですがif文と同じ位置からelseを書いても変わらないのではと思い実行したら上のような有様となりました。

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

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

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

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

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

guest

回答3

0

ベストアンサー

このプログラムで、例えば1つ目のfor文のTが5だった場合には

  1. 5%2=2あまり1
  2. 1の結果から、prime_numberに5が追加される。
  3. 5%3=1あまり2
  4. 1の結果から、prime_numberに5が追加される。

という処理が行われています。
つまり、T÷Tsが割り切れなかった場合にはfor Ts in prime_number:を何回も繰り返してしまい、同じ数字がいくつもprime_numberに追加される、ということが原因だと思います。

これは一つ上の回答者さんの、http://pythontutor.comを参考にさせていただきました。

投稿2020/05/02 08:29

glyzinieh

総合スコア208

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

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

teamikl

2020/05/02 09:22 編集

for文の説明に少しだけ注釈がある用法ですね。 https://docs.python.org/ja/3/reference/compound_stmts.html#for > コレクションオブジェクトの値を反復処理をしているときに、そのコレクションオブジェクトを変更するコードは理解するのが面倒になり得ます。 ---- 誤解の原因は、「if文と同じ位置からelseを書いても変わらないのではと思い」 for/else では if 条件により break が *一度も* 実行されなかった場合 for if/else では if 条件が真でなかった場合に *毎回* 実行されている
phamko

2020/05/03 10:46

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

0

小さなプログラムなら、以下のようなサイトを使用するのも良いかと。
http://pythontutor.com

1000 step までしか追えないので、途中で終わりますが、やってることは理解できると思います。

投稿2020/05/02 08:12

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

phamko

2020/05/03 10:44

このようなサイトがあるのですね。とても分かりやすいです。ありがとうございます。
guest

0

if T % Ts == 0: の所で既に見つかった素数で割り切れるかを確かめているのですよね。

ただ、ほかの素数で割り切れるかを確かめていない段階でリストに追加しているのと、それを何回も繰り返しているのでおかしくなっています。

たとえば、以下のように修正してみました。

python

1prime_number = [2] 2 3for T in range(3,101,2): 4 isPrim = True 5 for Ts in prime_number: 6 if T % Ts == 0: 7 isPrim = False 8 break 9 if isPrim == True: 10 prime_number.append(T) 11print(prime_number) 12

修正の意味が分かるでしょうか?

投稿2020/05/02 08:05

編集2020/05/02 08:24
Yasumichi

総合スコア1773

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

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

glyzinieh

2020/05/02 08:10

本人ではなくて申し訳ないですが、質問者さんは実行結果が [2, 3, 5, 5, 7, 7, 7, 7, 9, 11, 11, 11, 11, 11, 11, 11, 11, 11, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 15, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, …] このようになってしまう原因が知りたいのではないでしょうか?
Yasumichi

2020/05/02 08:14 編集

ご教示、ありがとうございます。意図が分かったので修正しました。
phamko

2020/05/03 10:43

修正ありがとうございます。分かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問