学习编程有时候会给人一种高深莫测的错觉,容易让人“敬而远之”。事实并非如此,学习编程其实就是学习一种语言——一种与机器对话的语言。编程语言与人类语言有着很多相似的东西,只要你懂了机器的语言构成,学习编程的过程就像结交一个好朋友。 而你编写程序的过程就像与老朋友聊天一样有趣。这章我们就先从整体上认识一下编程语言的体系,很多编程语言都符合这个标准。
1. 编程体系概述
很多编程语言的主体部分都可以概括为四个部分:数据、运算、控制和执行。Scratch和Python也不例外。
通过设置或者从外界侦测获得数据,然后对获得数据进行运算,根据运算结果用条件判断和循环等方式进行控制,最后执行相应的程序,实现相应的功能或效果,如图4.1所示。
编程体系示意图
比如从Scratch的代码模块分类中我们可以看到数据、运算、控制三个模块;而运动、外观、画笔等模块则可以归为“执行”部分;“侦测”模块是获得数据的一种方式;“事件”是综合运用了数据、运算、控制的一种方式;“更多模块”主要是用函数进行封装,是提高效率的方法。Python与Scratch类似,Scratch的方法都能在Python中找到对应的实现方式。
后面我们用几个案例来说明一下这个编程系统,让大家加深理解。
1.1 案例一:自动驾驶汽车
假设我们设计一辆能够自动驾驶的汽车,能够根据周围的环境自动调整速度和方向,完成驾驶。这个过程就用到了我们上述的编程系统。
数据部分:侦测与前后左右车辆或障碍物的距离,获得数据;提取当前的速度和方向等数据;
运算部分:根据需求对获得的数据进行处理;
控制部分:根据运算结果制定控制计划,如根据车距合理提高或降低行驶速度;根据计算结果判读是否具备改变行驶方向的条件。
执行部分:根据控制计划作出实际的操作,达到最终的结果。
1.2 案例二:我们完成一个愿望
我们完成一个愿望的过程,其实也是在运行上述编程系统,只不过我们没有发觉而已。比如我们要完成筹备一次旅行的的过程。这个过程涉及很多内容:身体条件准备、财务条件准备、生活及工作的安排、出行计划的制定、出行方式的选择等。上述的每一个部分都在默默的运行上述系统,为了简单说明问题,我们只提取其中的“财务准备”来说明问题。
数据部分:通过各种途径了解到某地旅游的各种数据:最佳旅游天数、日均消费额、各个消费项目、最佳出行日期等数据。
运算部分:对获得的数据进行运算,总共需要多少资金,还有多长时间进行准备,每天需要攒钱多少等。
控制部分:根据运算结果制定自己的准备计划,如每天需获得多少资金,通过哪些项目进行节约资金或获得资金。
执行部分:严格执行上面制定的计划并最终获得
1.3 案例三:我们的身体本身
让我们惊讶的是我们的身体本身也在默默地按照编程系统不停运行。身体的触觉、听觉、视觉、嗅觉、痛觉等系统都符合编程系统的设置。这里我们以视觉为例进行说明。
数据部分:我们通过各个感觉器官获得外部的各种刺激,不一定折算成我们熟悉的阿拉伯数值,但一定以某种“数据”形式传递给我们的大脑。例如我们感受到的光的强度。
运算部分:我们的大脑根据获得的“数据”进行各种精密运算,得到我们身体需要的“数据”。例如我们将获得的光的强度的数据传递给大脑,大脑将这个强度数据与眼睛能够承受的光强度数据进行比较运算。
控制部分:根据大脑的运算结果进行判读,形成对器官的不同指令。例如根据运算结果制定眼睛睁眼、眯眼、闭眼的不同指令。
执行部分:我们的身体根据“控制”部分的指令产生相应的反应或动作。例如执行大脑对眼睛额指令,当光线强的时候,眼睛按照指令进行眯眼或闭眼。
2 数据
中国古代哲学(比如《易经》)认为世间万物可以从“象、数、理”三个维度进行描述,这是有一定道理的。比如说我们日常用品,你能看到这个东西,说明他有一定的具象,同时你也可以从长宽高、重量、方位等数据进行描述,同时,这个东西为什么是这个样子(“象”),为什么是这个数据(“数”)一定有他存在的道理,及所谓的“理”。 所以,从某种层面上说我们的世界是一个“数据”的世界,我们在这里讨论的“编程”更是一个离不开数据的小世界,计算机最底层的代码只不过是在处理“0”与“1”两个数字。
在编程语言中数据,一部分由程序捕获,一部分由编程者给定。需要我们注意的是,这里的数据不仅指数学中所指的各个数字,也包括字符串、布尔值等其他内容。更具体的内容,我们会在下面的章节中详细学习。
3 运算
运算指的是对各类数据进行相应的处理,这里既包括我们传统意义上的加减乘除、取模、求余、比较大小等数据运算,也包括或、且、非等逻辑运算。
逻辑运算在程序设计中与数据运算一样重要。特别是在条件判断的控制部分,发挥着举足轻重的作用。就像三个人投票决定某件事:两种相反的意见的关系互为“非”,如“同意”与“不同意”;几个人只要有一人同意即可通过,几个人的意见之间的关系就是“或”; 几个人都同意才可以通过,不同人的意见之间的关系为“且”。
4 控制
控制指根据运算的结果调整、制定相应的指令或计划。主要包括两个方面:条件控制与循环控制。
条件控制就像一个“看门人”,控制符合什么样条件的人才能进入;条件控制也可以是“谈判者”,守住心中的底线,在什么样的一个数值范围内可以接受条件并完成交易。
循环控制就像一个喜欢动脑的“机灵鬼儿”,最不想干的就一遍又一遍地反复做同样的工作,于是他将问题简化,制定了一个自动程序,一按按钮,就可以翘着二郎腿晒太阳去了。
在接下来的章节中我们会详细了解这些“看门人”、“谈判者”和“机灵鬼儿”。
5 执行
“执行”部分的语句最为丰富。是直接呈现最终结果的命令。在各种编程语言中,执行部分的语句也是种类和数量最多的部分。如在Scratch系统自带的代码分类中的运动、外观、声音、画笔等几个部分都可以归结为“执行”部分。
这就像一个企业的人事结构,出主意提想法的是少数人,真正将想法实现,变为真正产品的的是占比最多的专业人才,这些专业人才在执行任务的过程中也需要相互合作。在企业里,专业人才就相当于编程系统中的“执行部分”。编程的过程与管理一个企业出奇相似,如果我们从学习编程的过程中领悟了管理思维,这算是额外收获。
6 提高效率
在本书的后面章节,我们还会学到提高编程效率的两大利器:“函数式编程”和“面向对象编程”。大家首先要明白一点:这两个利器非常好用、对提高编程效率的作用无可替代,但是对于编程实现的功能来说,并没有添加新的东西。也就是说我们完全可以不通过这两大利器完成相应的功能,所以大家学习的时候不要有心理压力,我们只是换了一种更高效的程序编写方式。也许你的心中还有疑虑,既然可以选择不用,为什么还要学习他们?相信你看了后面章节的案例就会有了答案:太方便太强大了,没有理由不用。
7 Scratch案例——无人驾驶汽车
详见链接 Scratch案例——无人驾驶汽车
8 Python案例——喝墨水的小乌龟
详见链接 Python案例——喝墨水的小乌龟