1. 第七章:判断,再判断
其实之前我也想过这个问题:要是每次都要我们告诉程序应该做什么,其实效率不高,并且解决问题的过程一定会变得枯燥。
程序,必须要知道自己接下来要做什么。
前提是,它要有基本的判断力,能决定下一步怎么走。这种技术我们称它为决策技术(decision-making)。
7.1 测试,测试
程序要根据一下情景进行设置:
(1)如果Tim给出正确答案,则加一份;
(2)如果价格满97元,则自动包邮;
(3)如果文件没找到,则显示错误信息……
这些我们都成为“决策”,而决策的第一步,便是测试:
(1)Tim的答案是否正确?是/否
(2)价格是否满97元?是/否
(3)文件是否找到?是/否
要让python理解我们的意思,要从两个方面入手:问题和回答。
后者很容易看出来,测试只能有两个正确的答案:是/否。
前者比较棘手:如何让python理解我们的意思呢?
我们可以换一种方式问:
如果 Tim 的答案 等于 正确答案
这句话存在两个“变量”,一个是Tim的答案,一个是正确答案。假如它们是相等的,条件(condition)为真(true);否则,不相等,则条件为假(false)。
这种判断,我们称之为分支(branching)。而前面的如果,我们在python中用if语句来表达。
7.2 缩进
不要以为缩进不重要!有时它能影响整个程序的运行,具体例子请参考小结(3)。
7.3 if ==语句:测试两个值是否相等
7.4 其他类型的测试:比较操作符
(1)一些常用的比较大小符号:
!= 不等于
<> 这个也是不等于(没那么常用,且python3舍弃了)
(2)一些特殊用法,比如:
if 8 < age < 12
这里用了两个小于号,可以限定age的范围;再比如:
if 8 <= age <= 12
这样可以包含8和12两个岁数。
(3)练习:比较数字大小
7.5 如果测试为假会怎么样
在测试中,需要考虑到许多意外的情况,以免出现bug。其中需要重点考虑的是if语句有没有包含所有情况。以下是一些可以避免出bug的方法:
(1)做另一个测试:elif
(2)注意else语句只能放最后
7.6 测试多个条件
7.7 使用and
使用and,将嵌套的if函数连在一起:
if age >= 8 and grade >= 3
这样就不用多写一行了。在代码复杂的时候应该很有用。
另外,还有很多方法简化多个条件的判断:
7.8 使用or
如果使用or,假如有一个条件为真,整个代码块就可以执行:
7.9 使用not
可以用not把比较倒过来,表示相反的逻辑:
可以看到,if not (age < 8)与 if age >= 8 这句代码,两者含义是一样的。
练习题
(1)检查一个数是否大于30,并且小于或等于40:
后来我尝试写一个自动划分成绩等级的函数:
(4)判断输入的字母是否为特定字母:
(5)写一个自动计算折扣程序:账单没超过1000元的打九折,超过1000元的打八折:
一开始我就想当然地噼里啪啦一大堆码上去,结果提示float错误:
接下来,不仅加了float,还在第一个条件上加上了print,要不然显不出打九折的情况:
(6)一个足球队在寻找年龄在10到12岁之间的小女孩加入。要求写一个程序,询问年龄与性别,并且要求人性化,如果不是小女孩就不用再询问年龄:
下面是一开始写的,首先不能用gender != f 来表示,因为加入这样还是会显示后面“What's your age”的提问;另外还是漏了age应该用int函数来赋值,否则前面rawinput函数获得的字符型值,是不能够直接跟age这个数值进行比较的。(汗,这些细节好磨人啊!)
(7)我们正长途旅行中,现在差不多要到一个加油站,距下一个加油站还有200km。
编写一个程序,确定要不要在这儿加油,还是到下个站加油。提示:
1⃣️油箱有多大?(单位:升)
2⃣️油箱有多满?(百分比)
3⃣️汽车每升油可以走多远?(L/km)
以下是第一次的编程:
值得注意的是,这道题还出了一个附加要求:因为油表容易出现误差,所以要求加上5km的缓冲区。一开始我不懂这什么意思,跟老公讨论后,明白了是在油表处减去5km,有点像是做最坏打算的意思。运行过程和结果如下:
小结
(1)比较测试,和关系操作符密不可分,像是重新认识了大于号、小于号和等于号~
(2)这次的练习都比较实用,而且应该说是太符合实际了,导致我一下子转不过弯来,不能很好的用程序思维去分析问题。今晚的练习异常艰苦,很多次出现bug都不能分析出所以然,——但既然选择了学习,那就要不断的去挑战自己的舒适区,能学到东西就是最好的状态。
(3)后来我自己尝试写了一个简单的根据密码判断能否进入的程序,
第一遍尝试解决密码模块,如下:
第二遍,修正了bug:
接下来,要实现的是中间的模块,先加了注释,然后将代码直接粘贴进去:
然而,运行结果是:
百思不得其解,最后在python编译器的帮助下,将新插入的程序,用制表符重新编辑好缩进,结果——正确了!
缩进是一个非常小的问题,但它能够影响整个程序。同样,一些小细节假如不注意,在编写大程序时就会有非常多的漏洞。魔鬼在细节!