.. Kenneth Lee 版权所有 2018-2020
:Authors: Kenneth Lee :Version: 1.0
教中学生学编程1:介绍
我其实不赞成中学生正经学编程的,主要是中学生太忙了,不可能深入写正经的程序,学 一点点没有什么意思,学深入了影响正课的学习时间。
但我觉得学生可以学习一点和自己学习过程相关的工具,顺着这个工具大概知道“编程”是 怎么回事,又能用一个有趣的,可以帮助学习的工具,这还是有点意思的。
我要介绍的工具叫Anaconda,可以在Windows上直接安装(下载链接:Anaconda installer archive),它是一个免费的数学工具,有很多功能,但我们主要学习它的两个功能:解方 程和画函数图,并通过这个学习,理解到底什么是编程。
这个工具启动以后长这个样子:
.. figure:: _static/jupyter.jpg
(其实就是一个可以接受命令的大窗口,你可以通过这个大窗口输入你对软件的要求。)
我写的这几个关于编程的文档,是作为自己的提纲用的,不指望学生看这个就能看懂,所 以,要正经学的,要找一个能写程序的老师。如果没有老师,不影响你了解一下,但要看 懂,估计是不够的。
我们大部分学生已经学过使用Office写文档,做PPT了。做PPT的过程,是一个对计算机下 命令的过程,你敲入“ABC”,屏幕上显示ABC,你选中这个ABC,然后在菜单上选择“粗体”, 这个字就变成粗体的了,这就是给计算机下命令的过程。
考虑这样:这个计算机不在你的面前,你只能通过打电话给它让它怎么做,这时你怎么控 制你的PPT的制作?
这显然会变得很难。
这种通过“说话”,要求计算机怎么做怎么做的,就叫“编程”。通过编程告诉计算机怎么做 怎么做,有时很不方便(比如写PPT的时候),但对一些情形,它又是很方便的。比如,你 要计算机反复做同一件事,每次都要手把手教它,这就很不方便了,如果可以写成一个“指 引”:“你先这样,再这样,在那样,重复10次,就可以了”……这个指引,就叫“程序”。写这 个程序的过程,就叫“编程”,它是“编写程序”的简称。平时我们说的“软件”,其实就是“程 序”。
计算机里面有很多的程序,最基本的程序和计算机的硬件说话,需要懂得硬件的语言。有 些程序和这些基本程序说话,就可以用一些高级一点的语言,和更高级的程序说话,就可 以用更高级的语言,或者甚至不用语言,像我们做PPT那样,直接动手教它就可以了。
Anaconda使用的语言叫Python。这属于比较接近英语的一种高级语言,不但可以用于 Anaconda,还可以用于和更多的软件沟通。我们通过这种语言学习编程是怎么回事。
最简单来说,我们可以把Anaconda当作一个计算器来用,比如我们可以计算这次考试的平 均分:::
(90+85+99)/3
Anaconda可以直接把结果输出来给你。Anaconda支持一些最简单的四则运算符号: +, - , * , /,还有乘方是**。当然,它也可以支持更复杂的计算, 我们后面会讲到这个。
我们可以给数字命名,这种命名的数字,我们称为变量,比如前面这个计算,我们可以这 样写: ::
yuwen=90 //语文
shuxue=85 //数学
yingyu=99 //英语
sum=yuwen+shuxue+yingyu //总分
sum/3 //平均分
这样计算中英数的平均分,就比较直观。如果后面我们发现语文的成绩给错了,我们把 yuwen的成绩改一下就可以了,平均分的计算那条运算可以拷下来使用(试试按上箭头键, 有惊喜):::
yuwen=90
shuxue=85
yingyu=99
sum=yuwen+shuxue+yingyu
sum/3
yuwen=95
sum=yuwen+shuxue+yingyu
sum/3
变量是可以改的,所以才叫变量。(顺便说一句,每句话后面//的字叫“注释”,表示让 Anaconda看到也当作看不到)
我们前面说了,程序的好处就是可以把重复的东西变成一个指引,这里这个计算总分和平 均分的过程,就是重复的过程,我们可以写成一个“定义”(definition),比如这样:
.. code-block:: python
def calculate(yuwen, shuxue, yingyu): sum=yuwen+shuxue+yingyu ave=sum/3 print "sum and average are ", sum, ave
calculate(90, 85, 99)
calculate(95, 85, 99)
我们把计算总分和平均分的方法写成了一个独立的“指引”,这样,我们要用的时候,只要 引用这个指引就可以了。这就是写程序的优势。
Anoconda的强大之处在于它已经有很多写好的“定义”了,你可以省很多事。比如前面我们 提到的各种运算,都已经有人“定义”了,你只要用就可以了。
为了使用别人的“定义”,因为需要引入别人的“名称空间”。“名称空间”,就是别人说话的 习惯。南方叫番薯的东西,北方可能叫地瓜,同一个语言,对于不同的需要会形成不同的 语言习惯,这些不同的名字“叫什么”,就构成一个“名称空间”。Python默认有一个大家都 知道的名称空间,比如前面的“变量”啦,加减乘除啦,print啦,这些都是大家都懂的公共 名称空间中的语言。但如果你要用更复杂的定义,就需要“引入”其他的名称空间了。
我们先看看我们最常用的名称空间:math。
.. code-block:: python
import math math.sin(30)
这是求sin(30),我们引入了math这个名称空间,这个名称空间对sin有“定义”,我们就可 以用这个定义来要求Anoconda解决我们的问题:sin(30)等于几。
要知道一个名称空间里面有哪些定义,我们可以用dir这个定义来找,比如你要知道“公共 名称空间”里面有哪些定义,你可以:::
.. code-block:: python
dir()
如果你要支持math里面有什么定义(前提当然是你import了math,否则Anoconda就不知道 你“说什么”了):
.. code-block:: python
dir(math)
引入了其他名称空间,你要用这个名称空间里面的定义,你要专门说“这是谁家的sin”,这 话说起来很麻烦。你也可以简单把这个名称空间全部作为你的“公共名称空间”,比如这样 :
.. code-block:: python
from math import sin
或者
.. code-block:: python
from math import * # 引入所有的符号
这样,你再用sin的时候,就不需要写math.sin了,直接写sin就可以了。
每个名称空间都引入所有的符号可能会引起冲突,可能两个名称空间都用sin,但“定义”不 一样,如果你只是想写起来简单,还可以这样:
.. code-block:: python
import math as m
这样,你以后提到math的地方,说m就可以了。
math中,除了三角函数,可能我们用得最多的是这几个:
sqrt(square root):平方根
pow(power):乘方
pi:就是圆周率啦
(没有开方,但我们都知道开方都可以用乘方来表示的)
这就是所谓编程。是不是很简单?