[关闭]
@yangwenbo 2021-08-23T17:26:00.000000Z 字数 4060 阅读 563

风变编程-Python基础语法

章节三:条件判断与条件嵌套

对于Python来讲,光正确使用【镜像世界的数据】还不够,还需要正确的【沟通逻辑】才能让Python准确地执行你的命令。

比方说,我想让天猫精灵在感知到我开门的一瞬间,打开客厅的灯。如果我只说:天猫精灵,打开灯。那么,由于缺少开门的前提条件,无论你开不开门,灯都会打开着。

所以,我们下的命令应该是这样:天猫精灵,如果我开门,你就打开客厅的灯。

而这个下命令的如果…就…逻辑,就是与计算机沟通的逻辑——条件判断,其作用就是明确地让计算机知道:在什么条件下,该去做什么。

image.png-75.4kB

对于Python也是同样。Python之所以能完成自动化任务,比如自动抓取网页关键词,自动下载小电影等,就是因为它可以执行条件判断。

1. 条件判断

1.1 单向判断:if

在Python里,条件判断语句总共有三种表现形式,我们先从最简单的单向判断:if开始说起:

单向判断:if代表什么呢?相传上面的六颗宝石是宇宙中最强大的东西。如果一个人同时拥有六颗宝石,ta就可以实现包括毁灭宇宙在内的所有事情。

有一个如果……就。那么,如果我们要用代码来“翻译”这段话,就可以用条件判断语句中的单项判断:if来表述。

比如像这样:

image.png-123.2kB

详解:
首先,第一行代码,用赋值运算符=对当前情况进行赋值:将你拥有的宝石个数6赋值给变量——宝石数stonenumber。

第二步,确定if条件:如果变量stonenumber的值>=个数6时,就执行冒号后,下一行的命令。

第三步,用print()命令打印出结果:你拥有了毁灭宇宙的力量。

所以,if语句的单向判断逻辑,我们可以这样归纳:

image.png-87.1kB

在这里,你可能注意到了一个细节:在条件判断代码中的冒号:后、下一行内容的前面,会空几个格,但这是为什么呢?

image.png-217.1kB

首先,在计算机的沟通语言中,空格的学名叫缩进,比如我们写文章都要空两个格,这就叫首行缩进。

对于Python而言,冒号和缩进是一种语法。它会帮助Python区分代码之间的层次,理解条件执行的逻辑及先后顺序。【注:缩进是四个空格或一个Tab键】

并且,在if条件语言中,缩进不需要我们手动按空格键。当你用英文输入法打:后按回车,我们的开发工具(用来编写Python代码的程序)为了方便大家编程,会自动实现下一行代码,向右缩进的功能。

此时,被缩进的内容(print()函数)和if条件语句组成了一个代码块(一个整体),成为了if条件下的内部命令。

这意味着:如果赋值满足if条件,计算机就会准确执行if条件内部的命令(即缩进的代码块)。


当我们去掉缩进时,if条件和print命令成为了两个不同的代码组,属于平行关系。你看:if条件下面,缺少了可以执行的动作,是不是会出现IndentationError: expected an indented block(缩进错误:期望一个缩进块)的报错?

image.png-154.3kB

下面,我们来小结一下单向判断:if的代码逻辑及语法格式:

image.png-109.3kB

现在来看下这个

image.png-127.1kB

详解:
首先,第一行的赋值语句【stonenumber=2】是后面if条件判断语句的前提情况,然而并不满足『stonenumber>=6』这个条件,所以不会执行条件下的『print』操作。

计算机是一行行往下执行代码的。所以,当第一行赋值情况的前提不满足if的条件时,Python的逻辑就会判断:条件不满足,无法执行if条件下的命令,从而自动跳过,执行下一行命令。

image.png-72.9kB

但是,在上方代码中,除了if之外,我们并没有设置其他的命令去让Python执行。因此,Python自然就无法输出结果。

也就是说,由于宝石数量只有2,没有满足6颗宝石的if条件,if条件下的打印命令就无法生效

1.2 双向判断:if…else…

在Python宇宙,我们可以利用if的双向判断形式:if…else…去实现这个行动

下面,请你直接运行下面的代码,看程序是如何识别的:

image.png-196.6kB

很多时候,我们不能把鸡蛋放在一个篮子里,要做好两手准备:如果不满足条件时,我们要怎么办。

Python则很贴心地,让我们借用if…else…语句,让码农们有了另一种选择——【如果…不满足,就…】

image.png-114.7kB

在if...else条件语句中,if和else各自抱团,形成两个不同的代码块。表示的是条件和其他条件的互斥关系——如果不满足if条件,就执行else其他条件。

image.png-63.7kB

image.png-120.9kB

关于if...else...的相关知识点到这里就讲完了,我们来总结一下if…else…语句的知识点。

image.png-89kB

1.3 多向判断:if…elif…else…

在判断3个或3个以上的条件时,我们就需要借助Python中的多向判断命令:if…elif…else…。

这三者共同构成了多向判断的命令逻辑关系:如果if的条件不满足,就按顺序看是否满足elif的条件,如果不满足elif的条件,就执行else的命令。

并且,当判断的条件超过3个时,中间的多个条件都可以使用elif。

image.png-166.1kB

比如像这样:

image.png-265.9kB

首先,第一行的赋值,会按照从上到下的顺序挨个试一遍,看自己满足哪个条件,满足了就不往下走,不满足就继续试,试到出结果为止。

其次,elif的运行本质上和else一样,已经带有其他条件的意思,所以elif后可以不接else。

比如上面的代码,stonenumber=5会对下面的if elif else条件逐个扫描,看看自己满足哪一个,就执行哪个条件底下的命令。

很显然,第二个条件elif 0

还可以这样

image.png-283.3kB

下面,我们来总结一下elif的知识点:

image.png-105.6kB

2. if嵌套

举例

  1. 考试成绩评价规则:
  2. 1. 如果成绩大于等于60分,就是及格,在此前提下:
  3. (1)如果成绩大于等于80分,属于优秀范围;
  4. (2)否则(即大于等于60分而小于80分),属于一般范围。
  5. 2. 如果成绩小于60分,就是不及格,在此前提下:
  6. (1)如果成绩小于30分,平时太不认真,属于学渣了;
  7. (2)如果成绩(小于60分而大于等于30分),那么,至少还能抢救一下。

像这种如果底下还有如果(即条件里还套条件)的情况,我们如何用Python把上面的规则写出来,并得出评价呢?

答案就是——嵌套条件。

if嵌套的应用场景,简单来讲就是:在基础条件满足的情况下,再在基础条件底下增加额外的条件判断。

用if嵌套可以像下方代码这样:

image.png-171.5kB

2.1 if嵌套的执行顺序

首先,我们先从整体总览一下,这段彼得·帕克成绩评价规则的代码,总共分为四部分【赋值、if、else、print()】,两个大代码组。

image.png-201kB

并且,在代码组1的if条件和代码组2的else的条件下,又包含了条件判断命令if...else...。

那么,这种嵌套命令我们要如何理解呢?

缩进相同的命令处于同一个等级,第一步,计算机就要按顺序一条一条地执行命令。


那么,计算机执行的顺序就是:
(1)先给historyscore赋值;

(2)因为if和else是只能留一个的互斥关系,if和else下的代码块只会执行一个,所以计算机要判断赋值的内容满足【historyscore>=60】还是【historyscore<60】的条件——如果满足if的条件,就执行if缩进下的内容,如果不满足就执行else缩进下的内容;

(3)执行print('程序结束')。

下面,我们再通过一张导图理一下if嵌套的逻辑:

image.png-201.6kB

2.2 如何写嵌套代码

if嵌套由于涉及多个条件判断,并且是条件套条件的判断,所以为了理清逻辑,我们可采用扒洋葱大法写if嵌套

举例:

image.png-173.5kB

详解:
以此举例,第一步就要搞定最外层那张皮,将最基础的命令和条件写出来。

那么,我们的思考逻辑应该是这样(1)把历史成绩赋给变量historyscore;(2)用if…else写最基础判断条件如果historyscore>=60时,打印你已经及格,否则,打印不及格;(3)用print()输出程序结束。

第二步,在“第一层皮”里装东西。也就是在条件【historyscore>=60】下,增加额外条件。

image.png-340.9kB

3. 本章小结

image.png-166kB

4. 习题练习

4.1 习题一

1.练习介绍:
在灭霸打了一个响指,宇宙一半生物都灰飞烟灭。
剩下的复仇者联盟成员们依旧没有放弃反击灭霸的机会,他们决定利用最后一次行动机会,去把灭霸手里的宝石偷回来。
如果偷回的宝石数是4颗及以上,便获得了打败灭霸的力量;如果偷回的宝石数是1-3颗,他们可以全员出动,殊死一搏;如果偷回的宝石数是0颗,只能尝试呼叫惊奇队长。
最终,他们因为实力相差太大,1颗宝石都没有偷回来。

2.题目要求:
请你写出一段代码,在一颗宝石都没偷回来的赋值下,进行条件判断,并产生对应的结果:
1.如果偷回的宝石数是4颗及以上,输出结果获得了打败灭霸的力量,反杀稳了
2.如果偷回的宝石数是1-3颗,输出结果可以全员出动,殊死一搏
3.如果偷回的宝石数是0颗,输出结果没办法了,只能尝试呼叫惊奇队长

image.png-125kB

4.2 习题二

1.练习介绍:
复仇者联盟的成员也是有工资的,然而,由于美国队长一直被冰封在北极,错过了多次调薪机会,所以美国队长的工资一直是每月80美元。光荣挺进史塔克穷人榜前三名,并获封“美元队长”称号。

2.题目要求:
请你写出一段代码,判断美国队长的工资水平,代码需要满足如下条件:
1.如果月工资小于等于500美元,显示“欢迎进入史塔克穷人帮前三名”
1.1如果月工资在100-500美元之间,显示“请找弗瑞队长加薪”
1.2如果月工资小于等于100美元,显示“恭喜您荣获“美元队长”称号!”
2.如果月工资在500-1000美元之间(含1000美元),打印“祝贺您至少可以温饱了。”
3.其他情况下,如果工资大于1000美元,打印“经济危机都难不倒您!”
3.1如果工资在1000-20000美元(含20000美元)之间,打印“您快比钢铁侠有钱了!”
3.2如果月工资大于20000美元,打印“您是不是来自于瓦坎达国?”
4.不管赋值改变后输出结果如何,都需固定打印结果“程序结束”

image.png-242.5kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注