Python全网最全基础课程笔记(五)——选择结构+Python新特性Match

本专栏系列为Pythong基础系列,每篇内容非常全面,包含全网各个知识点,非常长,请耐心看完。

每天都会更新新的内容,搜罗全网资源以及自己在学习和工作过程中的一些总结,可以说是非常详细和全面。

以至于为什么要写的这么详细:自己也是学过Python的,很多新手只是简单的过一篇语法,其实对于一个知识点的底层逻辑和其他使用方法以及参数详情根本不是很了解,这就导致学完很容易忘记,而且在实战过程中也是半知半解,所以自己就尽量写的详细些,让需要的人能更了解Python的每一个知识点,也感谢大家指正,祝大家早日从小码农变成大牛!

编程不仅是技术的堆砌,更是灵魂的创造,每一次代码的跳动,都是向世界宣告你的不凡!

  • 博客主页:长风清留扬-CSDN博客
  • 系列专栏:Python基础专栏
  • 每天更新大数据相关方面的技术,分享自己的实战工作经验和学习总结,尽量帮助大家解决更多问题和学习更多新知识,欢迎评论区分享自己的看法
  • 感谢大家点赞👍收藏⭐评论

推荐阅读:

Python全网最全基础课程笔记(一)——基础入门-CSDN博客

Python全网最全基础课程笔记(二)——变量-CSDN博客

Python全网最全基础课程笔记(三)——所有运算符+运算符优先级-CSDN博客

Python全网最全基础课程笔记(四)——基本数据类型-CSDN博客

探索Python世界的趣味之旅:自制贪吃蛇游戏-CSDN博客

目录

流程控制-选择结构

if语句

单分支选择结构

语法:

代码案例

代码解释

流程图

双分支选择结构

语法:

代码案例

代码解释:

流程图

多条件选择结构

 语法:

代码案例

代码解释

嵌套if选择结构

语法

代码案例

代码解释

match匹配模式

语法

字面量匹配

变量模式

类实例匹配

序列匹配

映射匹配

星号表达式(*rest)

守卫(Guards)

联合模式(使用|)


流程控制-选择结构

Python的流程控制是编程中非常重要的一部分,它决定了程序如何根据不同的条件执行不同的代码块。在Python中,流程控制主要包括三种结构:顺序结构、选择结构(条件结构)和循环结构。这里我们重点详解选择结构(条件结构)。

选择结构允许程序根据条件判断来执行不同的代码块。Python中使用ifelif(else if的缩写)、else关键字来实现选择结构。

if语句

Python中的if选择结构(也称为条件结构)是一种基本的流程控制语句,它允许程序根据条件的真假来决定执行哪个代码块。下面我将详细解释if选择结构的语法参数,并提供案例代码和进阶案例来确保各个知识点得到充分描述。

单分支选择结构

Python中的if单分支选择结构是一种基本的流程控制语句,它允许程序根据条件的真假来决定是否执行某个代码块。当条件为真(True)时,执行if语句下的代码块;当条件为假(False)时,则跳过该代码块,继续执行if语句之后的代码。

语法:

if 条件表达式:  
    # 条件为真时执行的代码块  
    # 注意:这里的代码块需要缩进  
    pass
  • 条件表达式:这是一个返回布尔值(True或False)的表达式。它可以是任何可以计算为布尔值的Python表达式,包括比较运算符(如==!=<><=>=)、逻辑运算符(如andornot)以及复杂的表达式组合。
  • 代码块:如果条件表达式为真,则执行该代码块。在Python中,代码块的开始是通过缩进来表示的,而不是使用大括号({})或其他关键字。
  • pass:是一个占位符,表示什么都不做。在上面的语法中,pass是可选的,通常用于表示这里将会有一些代码,但目前还没有写。在实际应用中,你会用具体的语句替换pass

代码案例

number = 15  
  
# 检查number是否大于10  
if number > 10:  
    # 如果条件为真(即number确实大于10),则执行以下代码块  
    print("这个数大于10。")  
print('if判断结束')
# 注意:如果number不大于10,则不会执行上面的print语句,程序会继续执行if语句之后的代码

代码解释

在这个例子中,number的值是15,它大于10,所以条件表达式number > 10为真。因此,Python会执行if语句下的代码块,即打印出“这个数大于10。然后打印if判断结束,但是如果条件表达式不为真的话也会打印if判断结束,因为这段语句不在if判断中。

流程图

双分支选择结构

Python的if双分支选择结构是一种流程控制语句,它允许程序根据条件的真假来决定执行两个可能的代码块之一。具体来说,如果条件为真(True),则执行if语句下的代码块;如果条件为假(False),则执行else语句下的代码块。

语法:

if 条件表达式:  
    # 条件为真时执行的代码块  
    # 注意:这里的代码块需要缩进  
    pass  
else:  
    # 条件为假时执行的代码块  
    # 同样,这里的代码块也需要缩进  
    pass
  • 条件表达式:与单分支if结构相同,这是一个返回布尔值(True或False)的表达式。
  • if代码块:如果条件表达式为真,则执行该代码块。
  • else代码块:如果条件表达式为假,则执行该代码块。
  • 缩进:Python使用缩进来定义代码块的范围,这是Python语法的重要部分。在ifelse语句后,紧跟的下一行(以及随后的行,直到缩进结束)构成了相应的代码块。

代码案例

age = 20  # 设置年龄为20  
  
# 如果年龄大于等于18:  
if age >= 18:    
    # 打印“你已经成年了。”  
    print("你已经成年了。")    
# 否则:  
else:    
    # 打印“你还未成年。”  
    print("你还未成年。")

代码解释:

age 被设置为 20,因此条件 age >= 18 是真的,所以程序会执行 if 代码块中的 print("你已经成年了。") 语句,输出“你已经成年了。”。else 代码块中的语句则不会被执行。 

流程图

多条件选择结构

Python的if多分支选择结构是一种更加灵活的条件控制语句,它允许程序根据多个条件的真假来决定执行不同的代码块。在if多分支结构中,通常会结合使用ifelif(else if的缩写)和else语句来实现多条件判断。

 语法:

if 条件表达式1:  
    # 条件表达式1为真时执行的代码块  
    pass  
elif 条件表达式2:  
    # 条件表达式1为假且条件表达式2为真时执行的代码块  
    pass  
# 可以继续添加更多的elif语句来检查更多的条件  
elif 条件表达式N:  
    # 条件表达式1到条件表达式N-1都为假,且条件表达式N为真时执行的代码块  
    pass  
else:  
    # 所有前面的条件表达式都为假时执行的代码块  
    pass
  • 条件表达式:这是返回布尔值(True或False)的表达式。程序会按照ifelifelse的顺序检查每个条件表达式,直到找到一个为真的表达式。
  • if代码块:如果第一个条件表达式为真,则执行该代码块,并忽略后面的所有elifelse代码块。
  • elif代码块(可选):如果前面的if条件为假,程序会检查每个elif条件。一旦找到为真的elif条件,就执行对应的代码块,并忽略后面的所有elifelse代码块。
  • else代码块(可选):如果所有的ifelif条件都为假,则执行else代码块。如果没有else语句,并且所有条件都不满足,则不执行任何操作。
  • 缩进:Python使用缩进来定义代码块的范围。每个ifelifelse语句后跟随的下一行(以及随后的行,直到缩进结束)构成了相应的代码块。

代码案例

score = 85  # 分数为85  
  
# 如果分数大于等于90:  
if score >= 90:    
    # 打印“优秀”  
    print("优秀")    
# 否则,如果分数大于等于80:  
elif score >= 80:    
    # 打印“良好”  
    print("良好")    
# 否则,如果分数大于等于60:  
elif score >= 60:    
    # 打印“及格”  
    print("及格")    
# 否则:  
else:    
    # 打印“不及格”  
    print("不及格")

代码解释

score的值是85。程序首先检查score >= 90是否为真,发现不是,于是继续检查score >= 80。因为85确实大于等于80,所以这个条件为真,程序执行对应的print("良好")语句,并忽略后面的elifelse代码块。

嵌套if选择结构

Python中的嵌套if语句指的是在一个if语句或elif语句的代码块内部再使用if语句。这种结构允许你在满足某个条件的基础上进一步细化条件判断。嵌套if语句可以非常灵活地处理复杂的逻辑条件。

语法

if 条件表达式1:  
    # 条件表达式1为真时执行的代码块  
    # 可以在这里嵌套另一个if语句  
    if 条件表达式2:  
        # 条件表达式1和条件表达式2都为真时执行的代码块  
        pass  
    # 条件表达式1为真,但条件表达式2为假时,可以继续执行这里的代码  
    pass  
# 条件表达式1为假时,跳过整个内嵌的代码块,继续执行后面的代码

代码案例

# 假设有一个人的年龄和学生身份  
age = 20  
is_student = True  
  
# 首先判断年龄是否小于18岁  
if age < 18:  
    print("未成年人,需要监护人陪同。")  
    # 如果年龄小于18岁,则不再进行后续判断  
else:  
    # 年龄大于等于18岁,进行进一步判断  
    # 判断是否为学生  
    if is_student:  
        # 如果是学生  
        print("学生优惠:享受8折优惠。")  
    else:  
        # 如果不是学生  
        if age < 60:  
            # 如果年龄在18到59岁之间  
            print("普通优惠:享受9折优惠。")  
        else:  
            # 如果年龄大于等于60岁  
            print("老年优惠:享受7折优惠。")

代码解释

  1. 首先,我们定义了两个人的属性:age(年龄)和is_student(是否为学生)。

  2. 接着,我们使用了一个if语句来判断年龄是否小于18岁。如果是,则打印出未成年人需要监护人陪同的信息,并且不再进行后续的判断(因为没有嵌套if)。

  3. 如果年龄不小于18岁,则进入else代码块。在else代码块中,我们首先使用了一个嵌套的if语句来判断这个人是否为学生。如果是学生,则打印出学生优惠的信息。

  4. 如果这个人不是学生,则我们再次使用了一个if-else结构来判断他的年龄是否小于60岁。如果是,则打印出普通优惠的信息;如果不是(即年龄大于等于60岁),则打印出老年优惠的信息。

match匹配模式

Python中的match语句是Python 3.10及以后版本中引入的一个新特性,它提供了一种更直观、更强大的方式来执行模式匹配(pattern matching)。match语句允许你根据值的结构或类型来执行不同的代码块,这在处理复杂数据结构或进行条件分支时特别有用。

语法

match subject:  
    case pattern1:  
        # 如果subject匹配pattern1,则执行这里的代码  
        ...  
    case pattern2:  
        # 如果subject匹配pattern2,则执行这里的代码  
        ...  
    case pattern3 if guard:  
        # 如果subject匹配pattern3且满足guard条件,则执行这里的代码  
        ...  
    case _:  
        # 如果subject不匹配以上任何模式,则执行这里的代码(类似于default)  
        ...

字面量匹配

字面量匹配是最简单的匹配模式,它直接比较值是否相等。

# 字面量匹配  
# 定义一个变量number并将其赋值为42  
number = 42  
  
# 使用match语句来匹配number的值  
match number:  
    # 如果number的值等于42,则执行这个case块  
    case 42:  # 这里匹配的是字面量42  
        # 打印结果  
        print("The answer to life, the universe, and everything.")  # 这是当匹配成功时执行的结果  
      
    # 如果number的值不是42,则执行这个case块,_代表任何不匹配前面的case的值  
    case _:  # 这是一个通配符,用于匹配所有其他情况  
        # 打印不是答案的提示  
        print("Not the answer.")  
  
# 输出: The answer to life, the universe, and everything.

match语句检查number变量的值,并根据它是否等于42来执行不同的代码块。如果number等于42,它将打印出“The answer to life, the universe, and everything.”,否则,它将打印出“Not the answer.”。 

变量模式

变量模式会将匹配的值赋给变量,以便在后续的代码块中使用。

# 变量模式  
# 定义一个变量value并将其赋值为10  
value = 10  
  
# 使用match语句来匹配value的值,但这里实际上是捕获所有可能的值并将其赋给变量x  
match value:  
    case x:  # 匹配任意值,并将这个值赋给变量x  
        # 使用变量x来格式化并打印结果  
        print(f"The value is {x}")  # 这将打印出变量x的值,即value的值  
  
# 输出: The value is 10

 match语句实际上只有一个case,它匹配所有可能的值(因为这里只有一个模式,即变量x,它会捕获所有传入的值)。因此,无论value变量的值是什么,它都会被赋给变量x,并在接下来的代码块中使用。在这个特定的例子中,value被设置为10,所以x也被设置为10,并且程序会打印出“The value is 10

类实例匹配

类实例匹配允许你根据类的实例来匹配,并可以进一步访问实例的属性或方法。

# 类实例匹配  
# 定义一个Point类,它有两个属性x和y  
class Point:    
    def __init__(self, x, y):    
        # 在初始化时,将传入的x和y值分别赋给实例的x和y属性  
        self.x = x    
        self.y = y    
    
# 创建一个Point类的实例,传入3和4作为x和y的值  
point = Point(3, 4)    
  
# 使用match语句来匹配point实例  
# 注意:这里的Point(x, y)是结构化模式匹配,要求point是一个Point类的实例,并且其x和y属性的值能够被捕获到变量x和y中  
match point:    
    case Point(x, y):  # 匹配Point类的实例,并捕获其x和y属性的值到变量x和y中  
        # 使用捕获到的x和y变量的值来打印出点的坐标  
        print(f"Point at ({x}, {y})")    
    
# 输出: Point at (3, 4)

序列匹配

序列匹配允许你匹配列表、元组等序列类型的数据,并可以捕获序列中的元素。

# 序列匹配  
# 定义一个名为coordinates的元组,包含两个元素3和4  
coordinates = (3, 4)  
  
# 使用match语句来匹配coordinates元组  
# case (x, y): 这一行匹配一个元组,并假设元组中有两个元素,这两个元素将被分别捕获到变量x和y中  
match coordinates:    
    case (x, y):  # 匹配一个元组,并捕获其前两个元素到变量x和y  
        # 使用捕获到的变量x和y来打印出元组的值  
        print(f"x: {x}, y: {y}")    
    
# 输出: x: 3, y: 4

match语句用于检查coordinates元组是否匹配(x, y)这个模式,其中xy是待捕获的变量。由于coordinates确实是一个包含两个元素的元组,所以匹配成功,并且这两个元素分别被赋值给xy,然后程序打印出这两个变量的值。 

映射匹配

映射匹配允许你匹配字典等映射类型的数据,并可以捕获键对应的值。

# 映射匹配  
# 定义一个名为person的字典,包含两个键值对:"name" 对应 "Alice","age" 对应 30  
person = {"name": "Alice", "age": 30}  
  
# 使用match语句来匹配person字典  
# case {"name": name, "age": age}: 这一行匹配一个字典,它必须包含键"name"和"age",并将这两个键对应的值捕获到变量name和age中  
match person:    
    case {"name": name, "age": age}:  # 匹配字典,并捕获name和age键对应的值到变量name和age  
        # 使用捕获到的变量name和age来打印出字典中的值  
        print(f"Name: {name}, Age: {age}")    
    
# 输出: Name: Alice, Age: 30

 match语句用于检查person字典是否匹配一个特定的模式,该模式是一个包含"name""age"两个键的字典,并且这两个键的值将被捕获到同名的变量nameage中。由于person字典确实符合这个模式,匹配成功,并且这两个键的值(即"Alice"30)被分别赋值给变量nameage,然后程序打印出这两个变量的值。

星号表达式(*rest)

在序列匹配中,星号表达式用于捕获剩余的元素。

# 星号表达式  
# 定义一个名为numbers的列表,包含五个元素:1, 2, 3, 4, 5  
numbers = [1, 2, 3, 4, 5]  
  
# 使用match语句来匹配numbers列表  
# case [first, *rest]: 这一行使用了星号表达式来捕获列表的第一个元素到变量first中,并将剩余的元素捕获到一个名为rest的新列表中  
match numbers:    
    case [first, *rest]:  # 捕获列表的第一个元素到first,并将剩余的元素作为列表捕获到rest  
        # 使用捕获到的变量first和rest来打印出第一个元素和剩余的元素  
        print(f"First: {first}, Rest: {rest}")    
    
# 输出: First: 1, Rest: [2, 3, 4, 5]

 match语句用于检查numbers列表是否匹配一个特定的模式,该模式是一个列表,它首先捕获列表的第一个元素到变量first中,然后使用星号表达式*rest来捕获列表中剩余的所有元素到一个新的列表rest中。由于numbers列表确实符合这个模式,匹配成功,并且第一个元素1被赋值给变量first,而剩余的元素[2, 3, 4, 5]被捕获并作为一个新的列表赋值给变量rest,然后程序打印出这两个变量的值。

守卫(Guards)

守卫是与模式关联的额外条件,用于进一步限制匹配。

# 守卫  
# 定义一个名为number的变量,并将其赋值为10  
number = 10  
  
# 使用match语句来匹配number的值  
# case n if n > 5: 这一行是一个带有守卫的case,它首先检查变量n(在这里n就是number的值)是否大于5  
# 如果条件为真(即number大于5),则执行该case下的代码块  
match number:    
    case n if n > 5:  # 匹配大于5的n  
        # 如果number大于5,则打印这条消息  
        print("Number is greater than 5")    
    # case _: 是一个通配符模式,它会匹配任何未被前面case捕获的值  
    # 在这个例子中,如果number不大于5,则会执行这个case下的代码块  
    case _:    
        # 如果number不大于5(但在这个例子中,由于number是10,所以不会执行到这里)  
        # 则打印这条消息  
        print("Number is not greater than 5")    
    
# 输出: Number is greater than 5  
# 因为number的值是10,大于5,所以第一个case匹配成功,并打印出相应的消息。

match语句通过带有守卫的case来检查number的值是否大于5。由于number的值是10,大于5,所以第一个case匹配成功,并执行了相应的代码块,打印出了“Number is greater than 5”。如果number的值不大于5,那么第一个case将不匹配,此时会检查下一个case,即通配符模式case _:,但在这个例子中,由于第一个case已经匹配成功,所以不会执行到那里。 

联合模式(使用|

从Python 3.10开始,联合模式允许你在单个case中指定多个模式。

# 联合模式  
# 定义一个名为shape的变量,并将其赋值为"circle"  
shape = "circle"  
  
# 使用match语句来匹配shape变量的值  
# match语句检查shape的值,并与各个case中的模式进行匹配  
# case "square" | "rectangle": 这一行使用了联合模式,它表示匹配"square"或"rectangle"中的任意一个  
match shape:    
    case "square" | "rectangle":    
        # 如果shape的值是"square"或"rectangle",则执行这里的代码块  
        # 但在这个例子中,shape的值是"circle",所以不会执行到这里  
        print("Rectangle-ish shape")    
    case "circle":    
        # 如果shape的值是"circle",则执行这里的代码块  
        # 因为shape的值确实是"circle",所以这里会匹配成功  
        print("Perfectly round")    
    # case _: 是一个通配符模式,它会匹配任何未被前面case捕获的值  
    # 如果shape的值既不是"square"也不是"rectangle",同时也不是"circle",则会执行这个case下的代码块  
    # 但在这个例子中,由于前面已经有一个case匹配成功,所以不会执行到这里  
    case _:    
        print("Unknown shape")    
    
# 输出: Perfectly round  
# 因为shape的值是"circle",所以第二个case匹配成功,并打印出相应的消息。

match语句通过联合模式case "square" | "rectangle":来尝试匹配shape变量的值是否是"square"或"rectangle"中的任意一个。但是,由于shape的值是"circle",所以这个case不匹配。接着,程序检查下一个case,即case "circle":,这个caseshape的值匹配成功,因此执行了相应的代码块,打印出了"Perfectly round"。由于已经有一个case匹配成功,所以不会继续检查后续的case

  • 13
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长风清留扬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值