2

我是 python 新手,我仍然在努力了解 sytnax 的工作原理,你需要如何对齐你的 If 和 else 以使其正常工作。我怎么真的知道哪个 if 与哪个 else 相配?特别是在使用嵌套代码块时。

在下面的代码中,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,你正在使用for-else

这个结构的意思是“执行else,除非循环已经通过break”终止。

请参阅Python 中的 for ... else进行讨论。

于 2013-03-07T15:55:17.687 回答
0

只要在它们之间的较低缩进处没有其他东西, Anif就与anelse在同一个缩进中。它们必须在同一个“块”中。但是,在您的情况下,后面的 that实际上并没有加入到 a中,而是加入到它之前的循环中!else# prime!iffor div in range(3, n, 2):

于 2013-03-07T15:54:06.867 回答
0

else附加到for循环意味着“如果循环完成而没有命中语句,则执行此代码”。有时它可能很有用,但对于以前没有遇到过它的人来说往往会感到困惑!forbreak

于 2013-03-07T15:56:00.170 回答
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!

此外,您上面的缩进意味着进行了 for...else循环(如果使用 退出 for 循环,则执行 else 子句break),而不是if..else

于 2013-03-07T16:09:54.300 回答