以下のプログラムで最初の出力が2になる理由がわかりません。
最初は2%2 == 0になるから出力されないのではないのでしょうか。
def get_primes(x=2):
while True:
for i in range (2,x):
if x % i == 0:
break
else:
yield x
x += 1
i = get_primes()
for c in range(10):
print(next(i))
2
3
5
7
11
13
17
19
23
29
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
正しくインデントした場合、こうなるのですよね?
Python
1def get_primes(x=2): 2 while True: 3 for i in range (2,x): 4 if x % i == 0: 5 break 6 else: 7 yield x 8 x += 1 9 10i = get_primes() 11for c in range(10): 12 print(next(i))
既にsuyamaさんが指摘されているとおり、Pythonではインデントが重要な意味を持ちます。
インデントが崩れないよう注意して投稿してください。分からなければ聞いてください。
rangeの挙動について勘違いされているのかと思います。
Python
1>>> for i in range(2, 2): 2... print(i) 3... 4>>> for i in range(2, 3): 5... print(i) 6... 72
class range(start, stop[, step])
(中略)
step が正の場合、range r の内容は式 r[i] = start + step*i で決定されます。ここで、 i >= 0 かつ r[i] < stop です。
リファレンスより引用、太字は引用者。
つまり、ご提示のコードは、自分自身による剰余算が発生しないよう工夫されています。
print関数を適宜埋め込んで試してみるといいかと思います。
Python
1def get_primes(x=2): 2 while True: 3 print('-' * 64) 4 print('割られる数:', x) 5 for i in range (2,x): 6 print('割る数:', i) 7 if x % i == 0: 8 print(i, '割り切れた') 9 break 10 else: 11 yield x 12 x += 1 13 14i = get_primes() 15for c in range(10): 16 print(next(i), 'は素数') 17 18"""実行結果 19---------------------------------------------------------------- 20割られる数: 2 212 は素数 22---------------------------------------------------------------- 23割られる数: 3 24割る数: 2 253 は素数 26---------------------------------------------------------------- 27割られる数: 4 28割る数: 2 292 割り切れた 30---------------------------------------------------------------- 31割られる数: 5 32割る数: 2 33割る数: 3 34割る数: 4 355 は素数 36---------------------------------------------------------------- 37割られる数: 6 38割る数: 2 392 割り切れた 40---------------------------------------------------------------- 41割られる数: 7 42割る数: 2 43割る数: 3 44割る数: 4 45割る数: 5 46割る数: 6 477 は素数 48---------------------------------------------------------------- 49 50以下続く 51"""
投稿2017/10/09 02:06
編集2017/10/09 02:10総合スコア35660
0
Pythonのコードはインデントが重要な意味を持ちますので、<code>で挿入される"コードを入力"で必ず囲むようにしてください。
動作を確認し、元のコードは下記であると推測しています。
python
1def get_primes(x=2): 2 while True: 3 for i in range (2,x): 4 if x % i == 0: 5 break 6 else: 7 yield x 8 x += 1 9 10i = get_primes() 11for c in range(10): 12 print(next(i))
最初は2%2 == 0になるから出力されないのではないのでしょうか。
動作としては逆で、割った余りが0であれば素数として判定されてyieldでデータとして渡され出力されます。
xの値は初期値として引数に指定された以降は無限ループで増えていくため、同じ数値が素数として出てくることはありません。
追記:
動作を誤って認識していました。
割った余りが0であれば合成数ということですね。
2が出力される理由は、LouiS0616さんのご回答の通りです。
誤った回答をしてしまい申し訳ありません。
投稿2017/10/09 01:37
編集2017/10/09 02:49退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/10/09 02:25 編集
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。