質問

私は彼らのサイトで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を学び始めたばかりです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top