仓库源文

.. 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中,除了三角函数,可能我们用得最多的是这几个:

(没有开方,但我们都知道开方都可以用乘方来表示的)

这就是所谓编程。是不是很简单?