- Python数据科学零基础一本通
- 洪锦魁
- 4096字
- 2025-02-23 23:03:33
第5章 流程控制及if语句的使用
本章摘要
5-1 关系运算符
5-2 逻辑运算符
5-3 if语句
5-4 if … else语句
5-5 if … elif … else语句
5-6 嵌套的if语句
5-7 尚未设置的变量值None
5-8 专题——BMI程序/猜出生日期/十二生肖系统/线性方程式
一个程序如果是按部就班从头到尾,中间没有转折,其实是无法完成太多工作的。程序设计过程中难免会需要转折,这个转折在程序设计中的术语是流程控制。本章将完整讲解有关if语句的流程控制。另外,与程序流程设计有关的关系运算符与逻辑运算符也将在本章做说明,因为这些是if语句流程控制的基础。
5-1 关系运算符
Python语言所使用的关系运算如下。

上述运算如果是真会返回True,如果是伪会返回False。
实例1:下列会返回True。

实例2:下列会返回False。

5-2 逻辑运算符
Python所使用的逻辑运算符有以下三个。
and:相当于逻辑符号AND。
or:相当于逻辑符号OR。
not:相当于逻辑符号NOT。
下列是逻辑运算符and的图例说明。

实例1:下列会返回True。

实例2:下列会返回False。

下列是逻辑运算符or的图例说明。

实例3:下列会返回True。

实例4:下列会返回False。

下列是逻辑运算符not的图例说明。

如果是True经过not运算会返回False,如果是False经过not运算会返回True。
实例5:下列会返回True。

实例6:下列会返回False。

5-3 if语句
if语句的基本语法如下:
if (条件判断): # 条件判断外的小括号可有可无 程序代码区块
如果条件判断是True,则执行程序代码区块,如果条件判断是False,则不执行程序代码区块。如果程序代码区块只有一条指令,可将上述语法写成下列格式。
if (条件判断): 程序代码区块
可以用下列流程图说明这个if语句。

如果读者学习过其他程序语言,例如Visual Basic、C、JavaScript等,在条件表达式中是使用大括号“{ }”,将if语句的程序代码区块括起来,如下所示(以C语言为实例)。

在Python内是使用内缩方式区隔if语句的程序代码区块,编辑程序时可以用Tab键内缩或是直接内缩4个字符空间,表示这是if语句的程序代码区块。相同内容,可以用下列方式处理。

在Python中内缩程序代码是有意义的,相同的程序代码区块,必须有相同的内缩,否则会产生错误。
实例1:正确的if语句程序代码。

实例2:不正确的if语句程序代码,下列代码因为任意内缩造成错误。

上述笔者讲解if语句是True时需内缩4个字符空间,这是Python预设的,读者可能会问可不可以内缩5个字符空间,答案是可以的,但是记得相同程序区块必须有相同的内缩空间。不过如果是使用Python的IDLE编辑环境,当输入if语句后,只要按Enter键,程序就会自动内缩4个字符空间。
程序实例ch5_1.py:if语句的基本应用。

执行结果

程序实例ch5_2.py:输出绝对值的应用。

执行结果

对于上述ch5_2.py而言,由于if语句只有一条指令,所以可以将第5行和第6行改写成下列语句。

上述可以得到相同的结果,详请可参考本书代码文件中的ch5_2_1.py。
5-4 if … else语句
程序设计时更常用的功能是条件判断为True时执行某一个程序代码区块,当条件判断为False时执行另一段程序代码区块,此时可以使用if … else语句,它的语法格式如下:
if (条件判断): 程序代码区块一 else: 程序代码区块二
如果条件判断是True,则执行程序代码区块一,如果条件判断是False,则执行程序代码区块二。可以用下列流程图说明这个if … else语句。

程序实例ch5_3.py:重新设计ch5_1.py,增加年龄满20岁时的输出。

执行结果

程序实例ch5_4.py:奇数偶数的判断。

执行结果

Python语言在执行网络爬虫存取数据时,常会不知道可以获得多少笔数据,例如可能是0~100笔,如果我们想要最多只取10笔数据(小于10笔也可以当作我们的数据),使用传统程序语言的语法,设计观念应该如下:

在Python中,我们可以用下列语法表达:
items = 10 if items >= 10 else items
程序实例ch5_4_1.py:测试if … else语法。

执行结果

5-5 if … elif … else语句
这是一个多重判断,程序设计时需要多个条件做比较时就比较有用。例如,在美国成绩计分是采取A、B、C、D、F等,通常90~100分是A,80~89分是B,70~79分是C,60~69分是D,低于60分是F。使用Python可以用这个语句,很容易就可以完成这个工作。这个语句的基本语法如下。
if (条件判断一): 程序代码区块一 elif (条件判断二): 程序代码区块二 … else: 程序代码区块 n
如果条件判断一是True则执行程序代码区块一,然后离开条件判断。否则检查条件判断二,如果是True则执行程序代码区块二,然后离开条件判断。如果条件判断是False则持续进行检查,上述elif的条件判断可以不断扩充,如果所有条件判断是False则执行程序代码n区块。下列流程图是假设只有两个条件判断说明这个if … elif … else语句。

程序实例ch5_5.py:请输入数字分数,程序将响应A、B、C、D或F等级。

执行结果

程序实例ch5_6.py:有一地区的票价收费标准是100元。
(1)如果小于等于6岁或大于等于80岁,收费是打2折。
(2)如果是7~12岁或60~79岁,收费是打5折。
请输入年龄,程序会计算票价。

执行结果

上述程序的第6行和第9行,如果读者对于运算符执行的优先级没有太大的把握,建议直接用小括号将条件判断括起来,可参考ch5_6_1.py。

程序实例ch5_7.py:这个程序要求输入字符,然后告知所输入的字符是大写字母、小写字母、阿拉伯数字或特殊字符。

执行结果

5-6 嵌套的if语句
嵌套的if语句是指在if语句内又有其他的if语句,下列是一种情况的实例。

其实Python允许加上许多层,不过层次太多时,未来程序维护会变得比较困难。
程序实例ch5_8.py:测试某一年是否闰年,闰年的条件是首先可以被4整除(相当于没有余数),这个条件成立时,还必须符合除以100时余数不为0或是除以400时余数为0,当两个条件都符合才算闰年。

执行结果

5-7 尚未设置的变量值None
有人在设计程序时,喜欢将所有变量一次先予以定义,在尚未用到此变量时先设置这个变量的值是None,如果此时用type( )函数了解它的类型时将显示NoneType,如下所示。

通常在设计程序时,可使用下列方式测试。
程序设计ch5_8_1.py:if语句与None的应用。不过要注意的是,None在布尔值运算时会被当作
False。

执行结果

5-8 专题——BMI程序/猜出生日期/十二生肖系统/ 线性方程式
5-8-1 设计人体体重健康判断程序
BMI(Body Mass Index)又称身高体重指数(也称身体质量指数),是由比利时的科学家凯特勒(Lambert Quetelet)最先提出,也是世界卫生组织认可的健康指数,它的计算方式如下:
BMI = 体重(kg) / 身高(m)2
如果BMI为18.5~23.9,表示这是健康的BMI值。请输入自己的身高和体重,然后列出是否在健康的范围。中国官方针对BMI指数公布的更进一步资料如下。

程序实例ch5_9.py:人体健康体重指数判断程序,这个程序会要求输入身高与体重,然后计算BMI指数,由这个BMI指数判断体重是否正常。

执行结果

上述程序第4行"float (height)/100",主要是将身高单位由厘米改为米,上述专题程序可以扩充为输入身高体重后,程序可以列出相应BMI值及其所在区间,作为读者的习题。
5-8-2 猜出生日期
本节将先说明程序,随后再说明程序的工作原理。在讲解猜出生日期之前,先用更简单的猜0~7数字做说明。
程序实例ch5_10.py:读者心中先预想一个0~7的数字,程序中会问读者3个问题,请读者真心回答,然后这个程序会猜出读者心中的数字。

执行结果

0~7的数字基本上可用3个二进制表示,为000~111。其实所问的3个问题,基本上只是了解特定位是否为1。

了解了以上概念,我们可以再进一步扩充上述实例猜测一个人生日的日期,一个人生日的日期是1~31的数字。
程序实例ch5_11.py:猜测一个人生日的日期,对于1~31的数字可以用5个二进制的位表示,所以可以询问5个问题,每个问题获得一个位是否为1,经过5个问题即可获得一个人的生日日期,下列是5组数据信息。


执行结果

5-8-3 十二生肖系统
在中国除了使用公元年份代号,也使用鼠、牛、虎、兔、龙、蛇、马、羊、猴、鸡、狗、猪当作十二生肖,每12年是一个周期,1900年是鼠年。
程序实例ch5_12.py:请输入你出生的公元年19××或20××,本程序会输出相对应的生肖年。

执行结果

注 以上是用公元日历,十二生肖年是用农历年,所以年初或年尾会有一些差异。
5-8-4 求一元二次方程式的根
在中学数学中,可以看到下列一元二次方程式:
ax2 + bx + c = 0
可以用下列方式获得根。

上述方程式有3种状况,如果b2 – 4ac是正值,那么这个一元二次方程式有两个实数根。如果b2 – 4ac是0,那么这个一元二次方程式有一个实数根。如果b2 – 4ac是负值,那么这个一元二次方程式没有实数根。
实数根的几何意义是与x轴交叉点的坐标。
程序实例ch5_13.py:有一个一元二次方程式如下:
3x2 + 5x + 1 = 0
求这个方程式的根。

执行结果

5-8-5 求解联立线性方程式
假设有一个联立线性方程式如下:
ax + by = e
cx + dy = f
可以用下列方式获得x和y值。

在上述公式中,如果a×d – b×c等于0,则此联立线性方程式无解。
程序实例ch5_14.py:计算下列联立线性方程式的值。
2x + 3y = 13
x – 2y = -4

执行结果

习题
1. 请改为不使用abs( )函 数重新设计ch5_2.py程序。(5-3节)

2. 请输入3个数字,本程序可以将数字由大到小输出。(5-3节)

3. 有一个圆半径是20,圆中心在坐标(0,0)位置,请输入任意点坐标,这个程序可以判断此点坐标是不是在圆内部。(5-4节)
提示 可以计算点坐标距离圆中心的长度是否小于半径。

4. 请设计一个程序,如果输入是负值则将它改成正值输出,如果输入是正值则将它改成负值输出。(5-4节)

5. 用户可以先选择华氏温度与摄氏温度转换方式,然后输入一个温度,可以转换成另一种温度。(5-5节)

6. 假设在麦当劳打工每周领一次薪资,工作基本时薪是150元,其他规则如下。
(1)小于40小时(周),每小时是基本时薪的0.8倍。
(2)等于40小时(周),每小时是基本时薪。
(3)大于40至50(含)小时(周),每小时是基本时薪的1.2倍。
(4)大于50小时(周),每小时是基本时薪的1.6倍。
请输入工作时数,然后可以计算周薪。(5-5节)

7. 假设今天是星期日,请输入天数days,本程序可以响应days天后是星期几。(5-5节)

8. 三角形边长的要求是两边长加起来大于第三边,请输入3个边长,如果这3个边长可以形成三角形则输出三角形的周长。如果这3个边长无法形成三角形,则输出这不是三角形的边长。(5-6节)

9. 扩充设计ch5_9.py,列出中国BMI指数区分的结果表。(5-7节)

10. 请参考ch5_13.py,但是修改为在屏幕上输入a, b, c三个数值,彼此用逗号隔开,然后计算此一元二次方程式的根,先列出有几个根。如果有实数根则列出根值,如果没有实数根则列出没有实数根,然后程序结束。(5-7节)

11. 请参考ch5_14.py,但是修改为在屏幕上输入a, b, c, d, e, f六个数值,彼此用逗号隔开,这些数值分别是联立线性方程式的系数与方程式的值,然后计算此线性方程式的x和y值,如果此题无解则列出此题目没有解。(5-7节)
