2

私はPythonが初めてで、sytnaxがどのように機能するか、Ifとelseを正しく機能させるためにどのように調整する必要があるかを理解するのにまだ苦労しています。他にどれがどのifに当てはまるかを本当に知るにはどうすればよいですか? 特にネストされたコード ブロックを使用する場合。

以下のコードでは、else の後にコメント Prime! が続きます。私が理解していることから、elseはifステートメント(n % div == 0):と一致しますが、代わりにFORステートメントと一致するのはなぜですか?

私が思う最後のelseステートメントは一緒だと思いますif n == 2:が、elseはそれと一致しておらず、代わりに後にあります。同じステートメントのif n == 2:理由は、その後ではなくn += 1前に配置pime_count +=1されます。

Else と if の配置が非常に重要であることは理解しています。それらのいずれかを移動するとコードが機能しなくなるからです。私が理解できないように見えるのは、整列が一貫していないように見える場合、pythonが他にどの場合にどのようになるかをどのように知るかです。

#!/usr/bin/env python
#
# Problem Set 1a
#
# A program that computes and prints the 1000th prime number.
# Finds primes using trial division (least efficient method)
#------------------------------------------------------------

prime_count = 0
n = 2 

while (prime_count <= 1000):
  #if even, check for 2, the only even prime
  if (n % 2 == 0):
    if n == 2:
      prime_count += 1
    n += 1
  else:
    # number is odd, possible prime
    for div in range(3, n, 2):
      if (n % div == 0):
        # not a prime
        n += 1
        break
    else:
      # prime!
      prime_count += 1
      if prime_count == 1000:
        print "The 1000 prime is", n
      else:
        n += 1
4

5 に答える 5

10

ルールは非常に単純です。else節は、それが参照するステートメント (最も一般的にはステートメント) と同じインデントを持つ必要がありifます。

さて、ここに:

for div in range(3, n, 2):
  if (n % div == 0):
    # not a prime
    n += 1
    break
else:
  ...

if-を使用していません。 -elseを使用しています。forelse

この構文は、「ループが a で終了しない限りelse、ブロックを実行する」ことを意味します。break

議論については for ... else in Pythonを参照してください。

于 2013-03-07T15:55:17.687 に答える
0

elseループに付けられた は、「ステートメントにヒットせずにループが完了した場合forこのコードを実行する」ことを意味します。便利な場合もありますが、これまでに遭遇したことがない人にとっては混乱を招くことがよくあります。forbreak

于 2013-03-07T15:56:00.170 に答える
0

Anifelse、同じインデントで、それらの間に下のインデントに他のものがない限り、一緒に使用されます。それらは同じ「ブロック」にある必要があります。ただし、あなたの場合、elseその後に続くthe# prime!は実際にはまったく結合されていませんがif、その前のfor div in range(3, n, 2):ループに結合されています!

于 2013-03-07T15:54:06.867 に答える
0

これは、Pythonのインデントがどのように機能するかを理解するのに役立つと思いますhttp://psung.blogspot.com/2007/12/for-else-in-python.html

このような構成では:

for i in foo:
  if bar(i):
    break
else:
  baz()

else スイートは for の後に実行されますが、for が正常に (ブレークによってではなく) 終了した場合にのみ実行されます。

他の状況では、else は if の後に続きます

于 2013-03-07T16:00:27.940 に答える
0

かなり単純な2つのルールがあります。

  1. とのインデントは同じifでなければなりませんelse

    for x in range(15):
        if x > 10:
            print 'x is more than 10'
        else:
            print 'x is less than or equal to 10'
    
  2. と のインデント以下のインデントを持つものはそれらの間に来るべきではifありません。elseしたがって、これは無効です/ SyntaxError.

    for x in range(15):
        if x > 10:
            print 'x is more than 10'
        print x
        else:
            print 'x is less than or equal to 10'
    

また、PEP 8に記載されているように

インデント レベルごとに 4 つのスペースを使用します。

for div in range(3, n, 2):
  if (n % div == 0):
    # not a prime
    n += 1
    break
else: # at same indent as for
  # prime!

また、上記のインデントは、 if..else ではなく、 for...elseループが作成されることを意味します (ここでは、 if..elsebreakではなく、 for ループが終了した場合に else 句が実行されます) 。

于 2013-03-07T16:09:54.300 に答える