类比:函数是一个准备好执行任务并给出答案的可克隆助手。任务由函数的参数定义(括号内的内容)。让我们重写这些名称以赋予它们语义意义(即说明我们期望的名称)。在def isXGreaterThanY(.....
在这里,任务的名称是“X是否大于Y?”。如果你走到你的可克隆助理那里问“X大于Y吗?”,除非你告诉他们X和Y是什么,否则你的助手将无法完成你想要的。在
^{pr2}$
现在我可以开始解释你可能错在哪里了。在这一级别的编程中,一个错误是,仅仅因为你在网页上看到了一些几乎是你想要的东西,你可能会被诱惑去复制它的语法,并试图篡改语法,希望它能正常工作。这是行不通的。这不是编程的重点。在
一些日常生活中的人认为编程是关于解决你的问题的神奇的词汇(我不是在暗示你这么想)。事实并非如此。相反,编程是(经典的)能够制造自动装置(这些小助手)来为你操作信息。计算机擅长死记硬背、机械地处理信息。我们希望我们的任务是可复制的,所以我们给它们起一个名字,比如“X大于Y吗?”什么是函数(在eem.a中称之为“程序”)。在
让我们想想你写的:def isXGreaterThanY(x, y):
if x > y:
return True
else:
return False
程序就是关于控制流的。过程的每个部分都是一个语句或表达式(在这个级别上,可以将其视为同一件事)。一个过程通常有一个答案:每当控制流遇到“return answer”语句时,整个过程都会停止(任务完成),您的魔法助手会返回给您,并在一张纸上写上ANSWER。返回答案的过程被称为“函数”,这几乎总是我们想要的(在幕后产生丑陋的“副作用”的过程通常不是我们想要的)。在
下面,我将说明从语法(我们写下的内容)到机械动作的想法。一个过程是由句法表达式组成的,每个表达式可以有子表达式等我们有if __ then __ else __语句,它由三个子表达式组成:
x > y的查询子句,它包括:
作用于的_ > _运算符:
变量x
变量y
return True的“then”子句,包括:
return语句,返回:
文本布尔值True
return False的“else”子句,包括:
return语句,返回:
文本布尔值False
这个“语法树”就是计算机看到的。现在,编程语言将含义与这些表达式关联起来:它知道如何在所谓的“控制流”中导航这棵树。特别是在编程语言Python中,我们知道当我们看到if-then-else语句时,我们首先检查测试条件。在本例中,我们查看测试条件,并注意到这是一个裸比较(我们询问CPU,它会返回True或False)。如果比较结果为真,我们将执行“then”子句,该子句将返回;即,递给您一张带有答案True的纸条。如果比较结果是错误的,我们会做“else”子句,并给你一张纸条,上面写着答案False。在
这样,每当你问你的助手“X大于Y吗?”?其中X=。。。而Y=…”,你的助手会(实际上)看着你在过程中指定的指令,并在助手的眼睛始终盯着一个指令的情况下进行解释一次表达式(“控制流”可以看作是突出显示或带下划线的“活动”子表达式,即控制流是助手在查看代码时眼睛所走的路径)。在这种特殊情况下,您的过程从if-then-else子句开始,它将其解释为控制流中的一个分支点(一个岔路口);它采取适当的分支,在这种情况下,将发现两个“return”语句中的一个,然后尽职地给您一张纸条。在
控制流由特殊控制流语句(如if-then-else)背后的语义(含义)决定。其他控制流结构的解释不同。for x in range(7): ...将假装x是1并执行...,假设x是2并执行...,依此类推
一个while True: ...将永远循环,反复执行...。在
一个break(break-out)的意思是“停止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)