基本代码误解

Posted

技术标签:

【中文标题】基本代码误解【英文标题】:fundamental code misunderstanding 【发布时间】:2017-05-14 07:31:29 【问题描述】:

前几天我买了一本书叫《Python for Kids (For Dummies)》。 在第 47 页有一个简单代码块的示例:

a = 2
while a < 10:
    a = a + 1
    print (a)

这导致序列:

3 4 5 6 7 8 9 10

我认为这个结果是不正确的,因为:

尽管在代码的第一行声明了'2',但没有打印出来。 '10' 被打印出来,即使 10 等于它自己(违反条件a &lt; 10)。

即使我设置了“while”条件a &lt;= 10,它也会打印出数字 3 到 11,这又是不正确的。

我认为应该是正确的代码如下:

a = 2
while a < 10:
    print (a)
    a = a + 1

导致:

2 3 4 5 6 7 8 9

这是我对代码的期望。我对代码进行了一些尝试,有趣的是,Python 允许一些奇怪的安排,这些安排可以在没有错误的情况下执行,但完全不正确!例如:

a = 2
while a < 30:
    a = a + 5
print (a)

这导致只有数字“32”,这似乎是不正确的。

如果我将 print (a) 缩进 4 个空格,我会得到:

7 12 17 22 27 32

这似乎也不正确。你能解释一下为什么我会得到这些输出吗?

【问题讨论】:

代码逐行执行。打开 while 循环,你会很容易看到在检查下一个条件之前增量和打印已经完成 你真的不应该认为除了你以外的所有人都错了。 欢迎来到奇异的计算机编程世界:) 计算机程序完全按照您的指示去做。所以它所犯的任何错误完全是你自己的责任。 【参考方案1】:

在第一个代码中,请注意print 语句之前的行:它在任何打印完成之前将a 加1。当然,如果更改代码,结果可能会有所不同。所以除非你的书声称应该产生的输出与实际产生的不同,否则这本书没有错。

与其假设 Python 错误,不如考虑一下您可能误解了 Python 的工作原理。

【讨论】:

【参考方案2】:

这正是应该发生的事情。 whilefor 循环的条件在循环顶部进行测试;在循环操作期间没有测试。因此,您可以在循环主体中随意更改循环控制变量(本例中为 a),并且 while 子句在您返回之前不会做出反应循环的顶部。您上一个示例的等效代码如下所示:

a = 2
while True:
    if not a < 30:
        break
    a = a + 5

print (a)

a 收到一个违反 while 条件的值之前,循环不会退出。如果您在 a 更新后打印,您保证 a 的最后一个值将违反该条件。

【讨论】:

【参考方案3】:

我将逐步执行此示例,一次执行一条语句,以便您查看:

(1) a = 2
(2) while a < 10:
(3)     a = a + 1
(4)     print (a)
第 1 行:将 a 设置为 2。 第 2 行:测试a 是否小于 10。是!于是我们进入while循环体: 第 3 行:将 a 增加 1。a 现在是 3。 第 4 行:打印 a(即 3)。 第2行:返回循环顶部测试循环条件:测试a是否小于10。是!第二次输入while循环体。 第 3 行:将 a 增加 1。a 现在是 4。 第 4 行:打印 a(即 4)。 第 2 行:测试循环条件:a 仍小于 10。继续执行循环体。 第 3 行:将 a 增加 1。a 现在是 5。 第 4 行:打印 a(即 5)。 第 2 行:测试循环条件:a 仍小于 10。继续执行循环体。 第 3 行:将 a 增加 1。a 现在是 6。 第 4 行:打印 a(即 6)。 第 2 行:测试循环条件:a 仍小于 10。继续执行循环体。 第 3 行:将 a 增加 1。a 现在是 7。 第 4 行:打印 a(即 7)。 第 2 行:测试循环条件:a 仍小于 10。继续执行循环体。 第 3 行:将 a 增加 1。a 现在是 8。 第 4 行:打印 a(即 8)。 第 2 行:测试循环条件:a 仍小于 10。继续执行循环体。 第 3 行:将 a 增加 1。a 现在是 9。 第 4 行:打印 a(即 9)。 第 2 行:测试循环条件:a 仍小于 10。继续执行循环体。 第 3 行:将 a 增加 1。a 现在是 10。 第 4 行:打印 a(即 10)。 第2行:测试循环条件:a不小于10,循环结束。循环后的下一条语句继续执行。如果没有更多内容,则程序结束。

希望你能从中看出Python运行正常,输出也不奇怪。

如果您将 print (a) 移动到 a = a + 1 上方,那么它将在增加它之前打印该值,因此它给出的输出是 2 到 9 而不是 3 到 10。

Python 允许一些奇怪的安排,这些安排可以在没有错误的情况下执行,但完全不正确!例如:

  a = 2
  while a < 30:
      a = a + 5
  print (a)

这导致只有数字“32”,这似乎是不正确的。

计算机完全按照您的指示行事,这是它们的强项和弱点。在您修改后的代码中,a 在小于 30 时增加了 5。因此它从 2 → 7 → 12 → 17 → 22 → 27 → 32 增加。然后退出该循环,因为 32 不小于 30 . 然后打印a,也就是32。因为print语句没有缩进,所以在循环之外,所以直到循环结束才执行。

【讨论】:

以上是关于基本代码误解的主要内容,如果未能解决你的问题,请参考以下文章

FPGA开发处理器代码中误解

非常基本的 MySQL 代码不起作用

对OpenStack的三大误解你是否也有?

编写安全代码:小心volatile的原子性误解

对模式的十大误解&代码味道及重构手段

Python范围/静态误解