【问题标题】:Python indentation, allignment of IFs and ELSEsPython 缩进,IF 和 ELSE 对齐
【发布时间】:2013-03-07 15:51:32
【问题描述】:

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

在下面的代码中,else 后跟注释 Prime!据我了解, else 与 if (n % div == 0): 语句一致,但为什么它与 FOR 语句对齐?

我认为最后一个 else 语句与 if n == 2: 一起使用,但 else 与它没有对齐,而是在它之后。对于相同的声明 if n == 2: 为什么是 n += 1pime_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

【问题讨论】:

  • 缩进应该是一致的,我会质疑该代码sn-p的有效性。
  • 你也可以在 python 中 else for 循环,所以这里可能会让你感到困惑。
  • 我同意 @AnthonyGrist 的观点,看起来最后 7 行应该加标签。
  • 使用 4 个空格的缩进会使这变得更具可读性。
  • 感谢@MartijnPieters - python 的“规则”是 4 个空格缩进。见python.org/dev/peps/pep-0008。如果您想被认真对待,请这样做

标签: python syntax python-2.7 indentation


【解决方案1】:

规则非常简单: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终止”。

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

【讨论】:

  • 那么如果那个 else 被加入到那个 for 中,是什么触发了 else 呢?据我了解,false 会触发 else,但这里的 for 看起来像是在为变量 div 赋值。还是如果 for 的条件失败,则 for 语句为假?代码底部的最后一个 else 似乎与 if prime_count == 1000: 一致:但我认为它与 if n == 2: 一致。如果它到达数字 4 并通过了奇数或偶数测试但未能通过测试来检查它是否为 2,如果最后一个 else 不是为了那个,它在代码中的哪个位置?
  • 谢谢,我现在理解了那部分,但是在该代码中我还有一件事我无法理解,当 n 的值达到 4 时,如果 n == 2:它会去哪里出假?此处对齐的 else 是 else:# number 是奇数,可能是素数但 4 不是奇数?之后的下一个 else 是 for 语句,它将最后一个 else 留在底部,它不与 if n == 2 语句对齐,而是与 if prime_count == 1000: 语句对齐。因此,我一直在查看该代码,无法弄清楚当 n 变为 4 或任何其他偶数时会发生什么。
  • @AdrianSultu:如果您不确定代码的流程,我建议您使用调试器 (stackoverflow.com/questions/4929251/…) 或在战略位置插入 print 语句。
  • 我做到了,我几乎在任何地方都插入了打印,无法弄清楚它对 4 的作用,就好像它跳过偶数但我看不出代码的哪一部分告诉它跳过偶数除了最后一个 else 之外的数字,甚至没有正确对齐来做到这一点
  • 我找到了我的答案,它是 if n == 2: 语句的 prime_count += 1 之后的 n += 1。 n += 1 在 prime_count += 1 之前对齐,这就是排除偶数的地方, prime_count += 1 只有在 n 的值为 2 时才生效,这就是为什么它在 n += 1 语句之后..
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我认为这可以帮助您了解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 之后发生

      【讨论】:

        【解决方案5】:

        有两条规则相当简单,

        1. ifelse 的缩进必须相同

          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. 缩进小于或等于ifelse 的内容不应出现在它们之间 所以,这是无效的/会引发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 循环被创建(如果使用 break 退出 for 循环,则执行 else 子句),而不是 if..else

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-08-20
          • 2015-01-06
          • 2017-05-03
          • 2016-09-08
          • 1970-01-01
          • 2021-09-18
          • 2020-04-02
          • 1970-01-01
          相关资源
          最近更新 更多