第4课 照猫画虎——剖析Python程序
4.1 照猫画虎学编程
有一种学习绘画的方法叫作临摹。通过依样画葫芦的方式,照着作品一丝不苟地画下来,逐步掌握作品的构图布局、色彩运用、色调把握和造型手段等基本技法。
在学习绘画、书法等技能时,可以使用临摹法。那么,学习 Python 编程是否也可以采用这种方法呢?答案是肯定的。
初学者采用“临摹法”学习 Python 编程时,建议选择短小的 Python 程序进行临摹,代码行数在20行左右。在临摹学习的过程中,如果代码录入错误致使程序无法运行,则要认真对照“摹本”程序检查自己的代码,让每一行代码和“摹木”程序一致。当程序能够正确运行之后,可以尝试修改代码中的一些数值,并观察它对程序结果的影响,这样能直观地了解程序代码的作用。在学习 Python 的最初阶段,通过这种方式能够逐步找到用键盘敲代码的感觉,渐渐熟悉使用 Python 编辑器创建、编辑和运行程序等基木操作。
接下来,我们将对验证“冰雹猜想”的Python程序进行临摹。
冰雹猜想是一种非常有趣的数字黑洞,曾让无数的数学爱好者为之痴迷。它有一个非常简单的变换规则,具体来说就是:任意取一个正整数 n ,如果 n 是偶数,就把 n 变成 n / 2 ;如果 n 是奇数,就把 n 变成 3 n + 1。如此反复进行变换运算,最终一定会得到 1 ,确切 地说是落入 4-2-1 的循环之中。
例如,对于整数 3 ,按照冰雹猜想的规则进行运算,它的变换过程为:10,5,16,8,4,2,l。经过7次操作,就把整数 3 变换为 1 。
使用自然语言来描述验证冰雹猜想的算法,具体步骤如下。
创建一个空列表,用于记录变换过程。
输入一个正整数 n ,然后在一个循环结构中进行变换运算。
将 n 放在循环控制条件中进行判断。如果 n 不等于1就执行第4步,否则,结束循环。
如果 n 是偶数,则使 n = n / 2 ;如果 n 是奇数,则使 n =3 n +1。
将变换后的 n 值记录到列表中,返回到第3步重复执行。
使用 Python 语言将上述算法编写为程序,程序清单如图1所示。
这个程序并不复杂,只有10多行代码。在IDLE环境中打开一个新的 Python 编辑器窗口,并认真对照程序清单将 Python 代码逐行录入到文本编辑区。
在程序代码录入完成后,以 bingbao.py 作为文件名将源代码保存到本地磁盘中。
在录入代码的过程中,需要注意以下儿点:
- 确保代码缩进正确,每一级向右缩进4个空格。
- 不要使用全角符号,务必将输入法的“全角/半角”状态切换为半角。
- 引号和括号要成对出现。
- 检查单词拼写是否有错误,比如将return误写为reutrno
接着,打开 Python 编辑器,选择 Run—Run Module 命令。这时,Python Shell 窗口被激活程序开始运行,执行结果如下:
>>>
======================= RESTART: D:/phython/bingbao.py =======================
请输入一个正整数:10
[10, 5, 16, 8, 4, 2, 1]
>>>这说明程序能够运行,同时也说明“冰雹猜想”验证通过。
虽然这个验证冰雹猜想的 Python 程序代码并不多,但是对于初学者来说,由于录入错误而导致程序无法运行的可能性极大。如果出现错误,请认真对照图1进行检查,并改正自己编写的程序代码,然后再次运行,直到成功为止。
试一试尝试输入不同的数字进行验证,观察最后的结果是否都是?4.2 双语对比细思量
如果你学过 Scratch 编程,那么可能会对上面的 Python 程序有似曾相识的感觉。这个Python程序代码中的if...else语句和Scratch中的if...then...else指令积木几乎一样。
如图2所示,左边是使用 Scratch 编写的验证冰雹猜想程序,右边对应的是 Python 版本。把 Scratch 和 Python 两种语言的程序放在一起仔细对比观察,就能发现它们的相似之处非常多。
虽然在图2中使用虚线将两种语言的指令(积木或语句)作了对照连接,但这并不是说它们是完全等价的。例如:Scratch 的 say 积木和 Python 的 print() 函数只是功能相近的两个指令。
如果你平时习惯使用中文界面的 Scratch 进行编程,那么可能对图2用英文编写的程序会感到比较生疏。然而,如果你对英文界面的 Scratch 编程比较熟悉,那么在看图2的对比图时,就会对 Python 程序有一种似曾相识的感觉。这正是在第1课中建议 Scratch 编程者使用英文界面的 Scratch 进行编程的原因。
4.3 剖析 Python 程序
程序是用来控制计算机工作的一系列指令的集合。一般来说,程序通常由输入数据、处理数据和输出数据三部分组成。
例如,在上述验证冰雹猜想的 Python 程序中,input())函数负责接收用户输入的数据,自定义的 bingbao() 函数负责处理数据,print() 函数负责输出数据到屏幕上显示。如图3所示。
在程序设计中,顺序结构、选择结构和循环结构是程序的三种基本结构,任何程序都可以由这三种基本结构组成。这三种基本结构既可以独立使用也可以混合使用。
图4对验证冰雹猜想的 Python 程序的基本结构进行了简单标注。第 12〜16 行是主程序部分,在 if 语句内部(第 13〜16 行)使用的是顺序结构,各行代码从上到下依次执行。第 2〜10 行定义了一个名为 bingba() 的函数,在函数体内混合使用顺序结构、循环结构和选择结构这三种基本结构。在函数体内的第 4〜9 行使用循环结构,只要变量 n 的值不等于 1 ,循环体就会一直执行;在循环体内的第 5〜8 行使用选择结构,会判断变量 n 的值是偶数或奇数而选择执行不同的分支。
麻雀虽小,五脏俱全。虽然“冰雹猜想”程序只有10多行代码,但是却涉及许多 Python 编程的基本元素。接下来将对 Python 编程中一些常用的基本元素进行讲解。
注释
图4中的第 1 行是一个单行注释语句。单行注释以“#”号开头,后面可以是任何内容。注释是给人看的,程序在执行时会自动忽略掉注释。
变量、表达式和赋值操作
图4中的第 8 行是一个赋值语句。其中,等号( = )是 Python 中的赋值操作符,等号左边的 n 是一个变量,等号右边是一个表达式。这个语句的作用是,先计算等号右边的表达式,再将计算结果赋给等号左边的变量 n 。在 Python 中,使用赋值操作修改变量的值,在 Scratch 中使用 set...to...指令积木实现类似的功能,如图5所示。
流程控制
图4中的第 4 行是 while 循环语句,当条件 n ! = 1 成立时,循环体(第 5〜9 行)就 会被反复执行。在 Python 中可以用 while 语句实现循环结构,在 Scratch 中则可以用 repeat until…指令积木实现类似的功能,如图6所示。但是,它们的循环控制逻辑是相反的,后面课程会对此详细介绍。
[图4](#t-4-4)中的第 5〜8 行是 if...else 选择语句,当条件 n % 2 == 0 成立时,就执行 n = n // 2 ;否则就执行 n = 3 * n + 1 。在 Python 中可以用 if... else 语句实现选择结构,在 Scratch 中则可以用 if...then...else 指令积木实现相同的功能,如[图7](#t-4-7)所示。
函数的定义和调用
图4中的第2行是一个函数定义语句,它定义一个名为bingbao的函数,参数为n; 第15行是对这个函数的调用。在Python中使用def语句创建自定义函数,在Scratch中 使用创建新积木的方式实现类似的功能,如图4-8所示。
调用对象的方法
在 Python 中一切都是对象。方法是对象内部提供的函数,通过点号(.)调用对象的方法。图4中的第13行通过 arr = [] 创建一个列表对象;在第 3 行使用arr. append(n)调用列表对象的 append() 方法,向列表中添加新元素。
缩进和语句块
在 Python 语言中,使用缩进表示语句块的开始和结束。按照惯例,通常使用 4 个空格 进行缩进。缩进属于 Python 语法的一部分,不正确的缩进会导致语法错误或逻辑错误。 图4中的第 13〜16 行是一个语句块,它的每行代码都向右缩进 4 个空格,表示这个语句块属于第 12 行的 if 语句。当 if 语句的条件为真时,这个语句块就会被执行。 当混合使用顺序结构、选择结构和循环结构编写程序时,特别要注意代码的缩进。 图4中的第 5〜9 行构成一个语句块,它属于第 4 行的while语句;第 8 行也构成一个语句块(只有1行代码),它属于第7行的else语句;而第9行与第8行的缩进不相同, 因此,else 语句的语句块只有第 8 行,而第 9 行属于第 4 行 while 语句的语句块。
除了以上介绍的一些基本元素之外,还有其他编程元素(如模块、类等)将在后面课程中进行介绍。本课中涉及的内容比较多,对于 Python 初学者来说,暂时不理解是正常的, 可以先跳过,在后面的课程中还会对这些编程元素进行详细说明。