Pythonチュートリアルでbreakコマンドを使用する際の問題
質問
私は彼らのサイトでpythonチュートリアルをフォローしており、現在は休憩継続セクションにいます。このサンプルコードを試しました。
>>> 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
そして、上記の内容を吐き出す代わりに、私は得る
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
内部forループを実行し続けているように思えますが、なぜチュートリアルではこれが考慮されないのでしょうか?最新のインタプリタビルドでは古くなっていますか(xubuntu jauntyを実行しています)?
次の行を追加することで修正できました
else:
... if n != y:
... print n, 'is a prime number'
... y = n
しかし、これは悪いコーディング慣行かもしれないと心配しています。ご協力ありがとうございます。
解決
表示する出力には、文字列「 x は素数」の 10 倍が含まれます。ただし、この文字列は内部ループの else
句に出力され、内部ループの実行ごとに最大で1回 実行されます。
外側のループは8回の反復を実行するため、「 x は素数です」 8 回以上は印刷できません。したがって、表示される出力は、示されているコードでは できません。
結論:何かが怪しい。実行したコードを表示できますか?
編集:解決済み!
else節を誤ってインデントしたため、Pythonは if
ステートメントに属していると解釈しました。 Pythonはタブを 8 スペースとして扱います。エディターでは、タブを 4 スペースとして表示する可能性があります。そうすれば、このバグを見逃している可能性があります。 PEP 8 に従って、タブとスペースを混在させないでください。コードをインデントするために4つのスペースを使用することをお勧めします。
>>> 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'
...
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
他のヒント
「else:」ステートメントが適切にインデントされておらず、結果が論理的であることを最もよく推測しています。他のインデントが「for x」でレベルに合っていることを確認してください。
つまり使用します:
for n in range(2,10):
for x in range(2,n):
if n%x == 0:
print(n, '=', x, '*', n/x)
break
else:
print(n, 'is a prime')
代わりに:
for n in range(2,10):
for x in range(2,n):
if n%x == 0:
print(n, '=', x, '*', n/x)
break
else:
print(n, 'is a prime')
Pythonインタープリターを更新する必要がある場合があります。
このコードは私のために正しく実行されます(Pythonのバージョン番号に注意してください):
Python 2.6.1 (r261:67515, Dec 6 2008, 16:42:21)
[GCC 4.0.1 (Apple Computer, Inc. build 5370)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 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
インデントが間違っていると思います。コードを取得し、ifステートメントの下にあるように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'
while
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'
あなたがやりたいことをする。
elseのインデントの違いに注意してください。
else
は常に if
に揃えるべきだと思いました。それが私が読んだことです。しかし、この素数ジェネレータコードでは、素数を1回だけ書き込む唯一の方法は、 else
を for x
に揃えることです。したがって、そのような識別については説明がありません。 Pythonを学び始めたばかりです。