类比:函数是一个可克隆的助手,准备好执行一项任务,并给你一个答案。任务由函数的参数(括号内的内容)定义。让我们重写名称以赋予它们语义含义(即说明我们所期望的名称)。
def isXGreaterThanY(.....
这里,任务的名称是“X 是否大于 Y?”。如果你走到你的可克隆助手面前问“X 比 Y 大吗?”,除非你告诉他们 X 和 Y 是什么,否则你的助手将无法完成你想要的。
def isXGreaterThanY(x, y):
.........
现在我可以开始解释你可能出错的地方了。这种编程级别的一个错误是,仅仅因为您在网页上看到的东西几乎可以满足您的需求,人们可能会想从语法上复制它并尝试摆弄语法并希望它能够正常工作。这永远不会奏效。这不是编程的重点。
一些日常的人认为编程是关于解决你的问题的魔术词(不是我暗示你认为的)。不是这种情况。相反,编程(经典)是关于能够制造自动机(这些小助手)来为您操纵信息。对信息进行机械的机械操作是计算机擅长的。不过,我们希望我们的任务是可复制的,因此我们给它们命名,例如“X 是否大于 Y?”,并在已知的情况下将它们指定为 procedures(也称为函数)。 p>
让我们考虑一下你写的内容:
def isXGreaterThanY(x, y):
if x > y:
return True
else:
return False
一个过程就是控制流。过程的每一部分要么是一个语句,要么是一个表达式(在这个级别上,你可以认为它们是相同的东西)。一个过程通常有一个答案:每当控制流遇到“return ANSWER”语句时,整个过程就会停止(任务完成),你的魔法助手会在一张纸上返回给你答案上面写着ANSWER。返回答案的过程称为“函数”,这几乎总是我们想要的(在幕后产生丑陋“副作用”的过程通常不是我们想要的)。
下面,我将说明将我们从语法(我们写下的内容)带到机械动作的想法。一个过程由句法表达式组成,每个表达式都可以有子表达式等。
- 我们有
if __ then __ else __ 语句,它由三个子表达式组成:
-
x > y的查询子句,包括:
-
return True 的“then”子句,包括:
-
return False 的“else”子句,包括:
这个“语法树”是计算机看到的。现在,编程语言将含义与这些表达式相关联:它知道如何在所谓的“控制流”中导航这棵树。特别是,在编程语言 Python 中,我们知道当我们看到 if-then-else 语句时,首先我们会检查测试条件。在这种情况下,我们查看测试条件并注意到它是一个赤裸裸的比较(我们询问 CPU,它会返回 True 或 False)。如果比较为真,我们将执行“then”子句,该子句返回;即递给你一张纸条,上面有答案True。如果比较是错误的,我们会执行“else”子句,并给你一张纸条,上面写着False的答案。
这样,每当您问助手“X 是否大于 Y?其中 X=... 和 Y=...”时,您的助手将(实际上)查看您在程序,并解释它们,助手的眼睛一次总是固定在一个表情上(“控制流”可以被认为是突出显示或下划线的“活动”子表达式,即控制流是助手的眼睛在看时所采用的路径通过代码)。在这种特殊情况下,您的过程以 if-then-else 子句开始,它将其解释为控制流中的一个分支点(道路上的一个岔路口);它采用适当的分支,在这种情况下,会发现两个“返回”语句中的一个,然后尽职尽责地给你一张纸条。
控制流由特殊控制流语句(例如 if-then-else)背后的语义(意义)决定。其他控制流结构的解释不同。 for x in range(7): ... 将假装 x 为 1 并执行 ...,假装 x 为 2 并执行 ... 等等。
while True: ... 将永远循环,一遍又一遍地执行 ...。
break(中断)表示“停止 while 循环”或“过早停止 for 循环”。
continue 表示“在此 while/for 循环中跳过 ... 的其余部分,但继续循环”。
您可以使用上述和您自己的自定义函数实现自己的控制流,使用所谓的递归(此答案范围之外的另一个主题)。
简而言之,就是控制流和命令式编程。
顺便说一句,这样做更好:
def isXGreaterThanY(x, y):
# this is a comment
# you can insert a print x>y here, or print(x>y) depending on your version of python
return (x > y)
表达式x > y 在输入 if-then-else 语句之前计算结果为 True/False。因此,您可以只返回表达式作为答案。但是,到那时,您的函数已经足够简单,以至于您不会编写函数答案:
#print isXGreaterThanY(1,3)
print (1 > 3)