迄今为止,咱们写的 Python 代码都是一条一条句子按次序向下履行的,这种代码结构叫做次序结构。然而仅有次序结构并不能处理一切的问题,比方咱们设计一个游戏,游戏第一关的过关条件是玩家取得1000分,那么在第一关完成后,咱们要依据玩家得到分数来决定是进入第二关,仍是告诉玩家“Game Over”。在这样的场景下,咱们的代码就会发生两个分支,并且这两个分支只需一个会被履行。相似的场景还有许多,咱们将这种结构称之为“分支结构”或“挑选结构”。给咱们一分钟的时间,你应该能够想到至少5个以上相似的比如,赶忙试一试吧!

运用if和else结构分支结构

在 Python 中,要结构分支结构能够运用ifelifelse三个关键字。所谓关键字便是编程语言中有特别意义的单词,像ifelse便是专门用于结构分支结构的关键字,很显然你不能够运用它作为变量名。当然,咱们并不是每次结构分支结构都会把三个关键字全部用上,下面咱们经过比如加以阐明。

咱们来写一个身体质量指数(BMI)的核算器。身体质量质数也叫体质指数,是国际上常用的衡量人体胖瘦程度以及是否健康的一个规范,核算公式如下所示。一般以为18.5≤BMI<24\small{18.5 \le BMI < 24}是正常规模,BMI<18.5\small{BMI < 18.5}阐明体重过轻,BMI≥24\small{BMI \ge 24}阐明体重过重,BMI≥27\small{BMI \ge 27}就属于肥壮的领域了。

BMI=体重身高2BMI = \frac{体重}{身高^{2}}

阐明:上面公式中的体重以千克(kg)为单位,身高以米(m)为单位。

"""
BMI核算器
Version: 1.0
Author: 骆昊
"""
height = float(input('身高(cm):'))
weight = float(input('体重(kg):'))
bmi = weight / (height / 100) ** 2
print(f'{bmi = :.1f}')
if 18.5 <= bmi < 24:
    print('你的身段很棒!')

提示if句子的最终面有一个:,它是用英文输入法输入的冒号;程序中输入的'"=()等特别字符,都是在英文输入法状况下输入的,这一点之前现已提示过咱们了。许多初学者经常会疏忽这一点,比及履行代码时,就会看到一大堆过错提示。当然,仔细读一下过错提示仍是很简单发现哪里出了问题,但是强烈建议咱们在写代码的时分切换到英文输入法,这样能够防止许多不必要的麻烦。

上面的代码中,咱们在核算和输出 BMI 之后,加上了一段分支结构,假如满意18.5≤BMI<24\small{18.5 \le BMI < 24},程序会输出“你的身段很棒!”,但是假如不满意条件,这段输出就没有了。这便是咱们上面说的代码有不同的履行路径,有些代码不一定会履行到。咱们在if关键字的后边给出了一个表达式18.5 <= bmi < 24,之前咱们说过,联系运算会发生布尔值,假如if后边的布尔值为True,那么if句子下方,有四个空格缩进的print('你的身段很棒!')就会被履行。咱们先输入几组数据运转上面的代码,如下所示。

第一组输入:

身高(cm):175
体重(kg):68
bmi = 22.2
你的身段很棒!

第二组输入:

身高(cm):175
体重(kg):95
bmi = 31.0

第三组输入:

身高(cm):175
体重(kg):50
bmi = 16.3

只需第一组输入的身高和体重核算出的 BMI 在18.5到24这个规模值内,所以触发了if条件,输出了“你的身段很棒”。需求阐明的是,不同于 C、C++、Java 等编程语言,Python 中没有用花括号来结构代码块而是运用缩进的方法来表明代码的层次结构,假如if条件建立的情况下需求履行多条句子,只需坚持多条句子具有相同的缩进就能够了。换句话说,若干行连续的句子假如坚持了相同的缩进,那么它们就属于同一个代码块,相当于是一个履行的全体。缩进能够运用任意数量的空格,但一般运用4个空格,强烈建议咱们不要运用制表键(Tab键)来缩进代码,假如你现已习惯了这么做,能够设置你的代码编辑器主动将1个制表键变成4个空格,许多代码编辑器都支持这项功能,PyCharm 中默许也是这样设定的。还有一点,在 C、C++、Java 等编程语言中,18.5 <= bmi < 24要写成两个条件bmi >= 18.5bmi < 24,然后把两个条件用逻辑与运算符连接起来,Python 中也能够这么做,例如刚才的if句子也能够写成if bmi >= 18.5 and bmi < 24:,但是没有必要,莫非if 18.5 <= bmi < 24:这个写法它不香吗?下面用 Java 代码做了同样的事情,看不懂 Java 代码没联系,感受一下它和 Python 语法的差异就能够了。

import java.util.Scanner;
class Test {
    public static void main(String[] args) {
        try (Scanner sc = new Scanner(System.in)) {
            System.out.print("身高(cm): ");
            double height = sc.nextDouble();
            System.out.print("体重(kg): ");
            double weight = sc.nextDouble();
            double bmi = weight / Math.pow(height / 100, 2);
            System.out.printf("bmi = %.1f\n", bmi);
            if (bmi >= 18.5 && bmi < 24) {
                System.out.println("你的身段很棒!");
            }
        }
    }
}

阐明:上面便是 BMI 核算器1.0版别对应的Java代码,欢迎在评论区吐槽它。

接下来,咱们对上面的代码稍作修正,在 BMI 不满意18.5≤BMI<24\small{18.5 \le BMI < 24}的情况下,也给出信任的提示信息。咱们能够在if代码块的后边添加一个else代码块,它会在if句子给出的条件没有达到时履行,如下所示。很显然,if下面的print('你的身段很棒!')else下面的print('你的身段不行规范哟!')只需一个会被履行到。

"""
BMI核算器
Version: 1.1
Author: 骆昊
"""
height = float(input('身高(cm):'))
weight = float(input('体重(kg):'))
bmi = weight / (height / 100) ** 2
print(f'{bmi = :.1f}')
if 18.5 <= bmi < 24:
    print('你的身段很棒!')
else:
    print('你的身段不行规范哟!')

假如要给出更为准确的提示信息,咱们能够再次修正上面的代码,经过elif关键字为上面的分支结构添加更多的分支,如下所示。

"""
BMI核算器
Version: 1.2
Author: 骆昊
"""
height = float(input('身高(cm):'))
weight = float(input('体重(kg):'))
bmi = weight / (height / 100) ** 2
print(f'{bmi = :.1f}')
if bmi < 18.5:
    print('你的体重过轻!')
elif bmi < 24:
    print('你的身段很棒!')
elif bmi < 27:
    print('你的体重过重!')
elif bmi < 30:
    print('你已轻度肥壮!')
elif bmi < 35:
    print('你已中度肥壮!')
else:
    print('你已重度肥壮!')

咱们再用刚才的三组数据来测试下上面的代码,看看会得到怎样的成果。

第一组输入:

身高(cm):175
体重(kg):68
bmi = 22.2
你的身段很棒!

第二组输入:

身高(cm):175
体重(kg):95
bmi = 31.0
你已中度肥壮!

第三组输入:

身高(cm):175
体重(kg):50
bmi = 16.3
你的体重过轻!

运用math和case结构分支结构

Python 3.10 中添加了一种新的结构分支结构的方法,经过运用matchcase 关键字,咱们能够轻松的结构出多分支结构。Python 的官方文档在介绍这个新语法时,举了一个 HTTP 呼应状况码识别的比如,十分有意思。假如不知道什么是 HTTP 呼应状况吗,能够看看 MDN 上面的文档。下面咱们对官方文档上的示例稍作修正,为咱们讲解这个语法,先看看下面用if-else结构完成的代码。

status_code = int(input('呼应状况码: '))
if status_code == 400:
    description = 'Bad Request'
elif status_code == 401:
    description = 'Unauthorized'
elif status_code == 403:
    description = 'Forbidden'
elif status_code == 404:
    description = 'Not Found'
elif status_code == 405:
    description = 'Method Not Allowed'
else:
    description = 'Unknown status Code'
print('状况码描绘:', description)

运转成果:

呼应状况码: 403
状况码描绘: Forbidden

下面是运用match-case语法完成的代码,尽管效果完全相同,但是代码显得愈加简单高雅。

status_code = int(input('呼应状况码: '))
match status_code:
    case 400: description = 'Bad Request'
    case 401: description = 'Unauthorized'
    case 403: description = 'Forbidden'
    case 404: description = 'Not Found'
    case 405: description = 'Method Not Allowed'
    case _: description = 'Unknown Status Code'
print('状况码描绘:', description)

阐明:带有_case句子在代码中起到通配符的效果,假如前面的分支都没有匹配上,代码就会来到case _case _的运用是可选的,并非每种分支结构都要给出通配符选项。假如分支中呈现了case _,它只能放在分支结构的最终面,假如它的后边还有其他的分支,那么这些分支将是不可达的。

当然,match-case语法还有许多高级玩法,咱们等用到时分再为咱们讲解,有一个兼并模式能够在这里分享给咱们。例如,咱们要将呼应状况码401403404归入一个分支,400405归入到一个分支,其他坚持不变,代码还能够这么写。

status_code = int(input('呼应状况码: '))
match status_code:
    case 400 | 405: description = 'Invalid Request'
    case 401 | 403 | 404: description = 'Not Allowed'
    case _: description = 'Unknown Status Code'
print('状况码描绘:', description)

运转成果:

呼应状况码: 403
状况码描绘: Not Allowed

分支结构使用举例

比如1:分段函数求值

有如下所示的分段函数,要求输入x,核算出y

y={3x−5,(x>1)x+2,(−1≤x≤1)5x+3,(x<−1)y = \begin{cases} 3x – 5, & (x \gt 1) \\ x + 2, & (-1 \le x \le 1) \\ 5x + 3, & (x \lt -1) \end{cases}
"""
分段函数求值
Version: 1.0
Author: 骆昊
"""
x = float(input('x = '))
if x > 1:
    y = 3 * x - 5
elif x >= -1:
    y = x + 2
else:
    y = 5 * x + 3
print(f'{y = }')

依据实践开发的需求,分支结构是能够嵌套的,也便是说在分支结构的ifelifelse代码块中还能够再次引进分支结构。例如if条件建立表明玩家过关,但过关以后还要依据你取得宝物或许道具的数量对你的体现给出评价(比方点亮一颗、两颗或三颗星星),那么咱们就需求在if的内部再结构一个新的分支结构。同理,咱们在elifelse中也能够结构新的分支,咱们称之为嵌套的分支结构。依照这样的思路,上面的分段函数求值也能够用下面的代码来完成。

"""
分段函数求值
Version: 1.1
Author: 骆昊
"""
x = float(input('x = '))
if x > 1:
    y = 3 * x - 5
else:
    if x >= -1:
        y = x + 2
    else:
        y = 5 * x + 3
print(f'{y = }')

阐明:咱们能够自己感受和评判一下上面两种写法哪一种更好。在Python之禅中有这么一句话:“Flat is better than nested”。之所以以为“扁平化”的代码更好,是因为代码嵌套的层次假如许多,会严峻的影响代码的可读性。所以,我以为上面的代码第一种写法是更好的挑选。

比如2:百分制成果转换为等级制成果

要求:假如输入的成果在90分以上(含90分),则输出A;输入的成果在80分到90分之间(不含90分),则输出B;输入的成果在70分到80分之间(不含80分),则输出C;输入的成果在60分到70分之间(不含70分),则输出D;输入的成果在60分以下,则输出E

"""
百分制成果转换为等级制成果
Version: 1.0
Author: 骆昊
"""
score = float(input('请输入成果: '))
if score >= 90:
    grade = 'A'
elif score >= 80:
    grade = 'B'
elif score >= 70:
    grade = 'C'
elif score >= 60:
    grade = 'D'
else:
    grade = 'E'
print(f'{grade = }')

比如3:输入三条边长,假如能构成三角形就核算周长和面积。

"""
核算三角形的周长和面积
Version: 1.0
Author: 骆昊
"""
a = float(input('a = '))
b = float(input('b = '))
c = float(input('c = '))
if a + b > c and a + c > b and b + c > a:
    perimeter = a + b + c
    print(f'周长: {perimeter}')
    s = perimeter / 2
    area = (s * (s - a) * (s - b) * (s - c)) ** 0.5
    print(f'面积: {area}')
else:
    print('不能构成三角形')

阐明: 上面的if 条件表明任意两头之和大于第三边,这是构成三角形的必要条件。当这个条件建立时,咱们要核算并输出周长和面积,所以if下方有五条句子都坚持了相同的缩进,它们是一个全体,只需if条件建立,它们都会被履行,这便是咱们之前提到的代码块的概念。另外,上面经过边长核算三角形面积的公式叫做海伦公式。假设有一个三角形,边长分别为a\small{a}b\small{b}c\small{c},那么三角的面积A\small{A}能够由下面的公式得到,其中,s=a+b+c2s=\frac{a+b+c}{2}

A=s(s−a)(s−b)(s−c)A = \sqrt{s(s-a)(s-b)(s-c)}

总结

学会了 Python 中的分支结构和循环结构,咱们就能够处理许多实践的问题了。这一节课信任现已帮助咱们把握了结构分支结构的方法,下一节课咱们为咱们介绍循环结构,学完这两次课你一定会发现,你能写出许多很有意思的代码,持续加油吧!