基本代码误解
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 < 10
)。
即使我设置了“while”条件a <= 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】:这正是应该发生的事情。 while 或 for 循环的条件仅在循环顶部进行测试;在循环操作期间没有测试。因此,您可以在循环主体中随意更改循环控制变量(本例中为 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语句没有缩进,所以在循环之外,所以直到循环结束才执行。
【讨论】:
以上是关于基本代码误解的主要内容,如果未能解决你的问题,请参考以下文章