
3.1 案例6:三个数中找最大
3.1.1 案例描述
从键盘输入三个数字,判断三个数字中的最大值。
分析:通过前面所学知识,可使用input()函数实现用户输入的功能,并利用强制类型转换将用户输入的三个数字转为float型。接下来要找出三个数字中的最大值,将如何实现呢?在实际生活中,如果要找出三位同学中哪一位最高,可比一比并筛选出最高的。而Python程序则需要借助选择结构设置不同的条件判断来控制程序的走向,不断进行判断,最后将最大值找出,并输出结果。选择结构就是本节要学习的重点内容。
3.1.2 相关知识
3.1.2.1 简单选择结构:单分支结构和双分支结构
选择结构是程序根据条件判断结果而选择不同执行路径的一种方式。简单选择语句包括单分支结构和双分支结构。这两种结构的流程图如图3-1和图3-2所示。

图3-1 单分支结构流程图

图3-2 双分支结构流程图
1.单分支结构
大家都听过一首节奏欢快的歌曲《幸福拍手歌》,歌词如下。
如果感到幸福你就拍拍手
如果感到幸福你就拍拍手
如果感到幸福就快快拍手哟
快来大家都一起拍拍手
如果感到幸福你就跺跺脚
如果感到幸福你就跺跺脚
如果感到幸福就快快跺脚哟
快来大家都一起跺跺脚
随着歌曲欢快的节奏大家可以动起来,如果感到幸福,就可以做如下动作:拍拍手和跺跺脚。那么怎么将这首欢快的歌曲转换成Python语言呢?在Python语言中满足一定的条件后执行的动作可以用单分支结构来表示。
单分支结构的语法格式如下。

学习了单分支结构后,《幸福拍手歌》转化成Python语言就可以写成:

注意:判断条件就是计算结果必须为布尔值的表达式,其可以用包含>(大于)、<(小于)、==(等于)、>=(大于等于)、<=(小于等于)等运算符的表达式来表示,若判断条件的结果为True,则执行if后面缩进的语句块。同时要注意,判断条件中不能含有赋值操作符“=”,且后面的冒号一定不能少,否则会出现语法错误。
下面再来看一个单分支结构的具体例子,通过判断年龄是否满足条件决定是否可以进入网吧。
【例3-1】未成年人禁止进入网吧,如果年龄小于18岁,则输出“未成年人禁止进入网吧。”。

年龄为16时,条件判断表达式age<18的值为真(True),运行结果为输出“未成年人禁止进入网吧。”。
2.双分支结构
双分支结构就是有两个选择分支的结构,当程序执行到if…else…语句时,一定会执行if后或else后的一个语句块,而且只执行两者中的一个。
双分支结构的语法格式如下。

【例3-2】未成年人禁止进入网吧,如果年龄小于18岁,则输出“未成年人禁止进入网吧。”,否则输出“欢迎来到虚拟的互联网世界!”。
分析:年龄有两种情况,要么小于18岁,要么大于等于18岁,因此可以使用一个双分支结构来编写该程序。
代码如下。

年龄为20时,通过运算if后的判断条件,程序会执行else后的语句块,输出“欢迎来到虚拟的互联网世界!”。
双分支结构也可写成三目运算符形式,语法格式如下。

注意:
1)当判断条件为真时,执行表达式1;当判断条件为假时,执行表达式2。
2)三目运算符只支持表达式的使用而不支持语句的使用。
3)注意三目运算符形式中没有冒号。
【例3-3】比较两个值x、y的大小,将较大的值找出来并赋值给a。
分析:从两个值中找出较大的值,可直接进行条件判断,将较大的值赋值给变量a。
程序可以使用双分支结构if…else…写成如下形式。


也可将上述语句简化如下。

在三目运算符形式中,若x>y为真,则x为两个值中的较大者,将x赋值给a;否则,将y赋值给a。本例中三目运算符语句和双分支结构语句一样,都实现了取两个数中的较大值,且代码量少,更加简单。
3.1.2.2 复杂选择结构:多分支结构和分支嵌套
1.多分支结构
多分支结构是解决复杂问题的重要手段之一,和C、C++、Java语言不同,在Python中是没有switch…case…多分支结构的,可以使用if…elif…else…来代替switch…case…结构。多分支结构的流程图如图3-3所示。

图3-3 多分支结构流程图
多分支结构的语法格式如下。

注意:
1)一个if只能有一个else语句,但是可以拥有多个elif语句。
2)多分支结构的几个分支之间是有逻辑关系的,不能随意颠倒顺序。
【例3-4】利用多分支结构判断成绩的等级:当成绩大于等于90分时,等级为优秀;当成绩大于等于80分小于90分时,等级为良好;当成绩大于等于70分小于80分时,等级为中等;当成绩大于等于60分小于70分时,等级为及格;当成绩低于60分时,等级为不及格。
分析:当判断条件中有多个值时,可以使用多个if…elif…else…多分支结构来进行编程,套用多分支结构的语法格式即可。
代码如下。

当输入分数为85时,运行结果为输出“良好”。
2.分支嵌套
前面详细介绍了单分支结构、双分支结构及多分支结构,即if、if…else…和if…elif…else…。在编写程序时,如果希望在条件成立的执行语句中再增加判断条件,就可以根据需要将这3种选择结构相互嵌套。if语句的嵌套的应用场景为:在之前判断条件满足的前提下,再增加额外的判断条件。
在最简单的if语句中嵌套if…else…语句,语法格式如下。

在if…else…语句中嵌套if…else…语句,语法格式如下。


注意:if语句嵌套的层数不要太多,最多不超过5层。在相互嵌套时,一定要严格遵守不同级别代码块的缩进规范。
例3-4中将学生的成绩转化为不同的等级,当输入的数值不合法,即不在0~100之间时,程序没办法判断等级或者给出错误的判断,这时,可以利用if嵌套重新编写该程序。
【例3-5】利用多分支结构判断成绩的等级:当成绩大于等于90分时,等级为优秀;当成绩大于等于80分小于90分时,等级为良好;当成绩大于等于70分小于80分时,等级为中等;当成绩大于等于60分小于70分时,等级为及格;当成绩低于60分时,等级为不及格。要求用户输入的成绩介于0~100之间,当用户输入了不合法的数值时,提示输出“请输入0-100之间的分数”。
分析:相比例3-4,本例需要在之前条件满足的前提下,再增加额外的判断,可使用if嵌套,将if…else…和if…elif…else…嵌套在一起,当输入的数值合法时再执行多分支语句。
代码如下。

当输入分数为85时,运行结果为输出“良好”。当输入分数为120时,运行结果为输出“请输入0-100之间的分数”。
3.1.3 案例实现
从键盘输入三个数字,判断三个数字中的最大值。本案例的解法较多,读者可以开拓思路,使用多种方法实现,不断提高自己的编程能力和思考能力。本案例可通过穷举各种大小关系,将最大的值找出来;也可假定三个数字中的num1最大,将其赋值给max_num,然后将其与剩下的两个值进行逐一比较来实现;也可使用内置的max()函数来实现;还可使用三目运算符来实现。最后两种方法的代码量最少,也更简单。
方法一基本思路:通过input()函数让用户输入三个数字,并将其转化成float型数值,接着通过穷举各种大小关系找到最大值。此案例判断条件为多个,可以使用if…elif…else…多分支结构来进行编程。首先用num1与num2、num3比较,若num1既大于num2又大于num3,则num1为最大值;若num2既大于num1又大于num3,则num2为最大值;若都不成立,则num3为最大值,最后将结果输出。
代码如下。

方法二基本思路:前面讲过使用三目运算符取两个数中的较大值,同样地,取三个数中的最大值也可以用三目运算符进行编写。
代码如下。

方法三基本思路:首先假定三个数字中num1最大,将其赋值给max_num,然后将max_num逐一与剩下的两个数字进行比较,如果假定的最大值max_num比num2小,则将num2重新赋值给max_num,此时找出的是num1和num2中的较大值,将其与num3进行比较,若num3较大,则将num3赋值给max_num,最后将结果输出。
代码如下。

方法四基本思路:这种方法充分利用了Python中的内置max()函数。max()函数的功能为,取传入的多个参数中的最大值,此种方法最为简单和方便,极大地减少了代码量。
代码如下。

求三个数字中的最大值,上面给出了四种编程方法,读者也可以展开头脑风暴想出更多其他的方法,并思考如果是求n个数字中的最大值将如何编程。除了可以使用Python中的max()内置函数,也可以参考三个数中取最大值的编程思路,不妨增加一个变量max_num,假设其最大,并初始化为第一个值,剩下的每个数依次和最大值max_num比较,如果当前正在比较的值比max_num大,就修改max_num的值。