)
本文为Python学习第五天的完整笔记涵盖拆包技巧、列表推导式、局部变量与全局变量、函数多种传参方式位置传参、关键字传参、默认参数、不定长参数以及类型提示适合有一定Python基础的同学进阶学习。一、拆包Unpacking拆包是Python中一个非常实用且优雅的语法特性它允许我们将可迭代对象如元组、列表等中的元素一次性赋值给多个变量让代码更加简洁高效。1.1 元组拆包tuple1 (10, 20) # ########## 拆包 ########## num1, num2 tuple1 print(num1, num2) # 10 20以上代码可以简写为num1, num2 (10, 20) print(num1, num2) # 10 20还可以进一步简写本质上是利用元组拆包num1, num2 10, 20 print(num1, num2) # 10 201.2 列表拆包# todo 列表拆包 num1, num2, num3 [10, 20, 30] print(num1, num2, num3) # 10 20 301.3 集合拆包# todo 集合拆包 num1, num2, num3 {10, 20, 30} print(num1, num2, num3) # 10 20 301.4 字典拆包字典拆包时拆出来的是键key而不是值。# todo 字典拆包 num1, num2, num3 {a: 10, b: 20, c: 30} print(num1, num2, num3) # a b c二、实现两个变量值的交换在编程中交换两个变量的值是非常常见的需求。Python提供了传统方式和利用拆包的优雅方式。2.1 传统方式引入第三方变量# ① 引入第三方变量实现数值交换 c1 可乐 c2 牛奶 temp c1 c1 c2 c2 temp print(c1, c2) # 牛奶 可乐2.2 优雅方式使用元组拆包Python中交换两个变量无需借助临时变量一行代码即可搞定这也是拆包最经典的用法之一。# ② 使用元组拆包实现两个变量值交换 c1 可乐 c2 牛奶 c1, c2 c2, c1 print(c1, c2) # 牛奶 可乐小贴士c1, c2 c2, c1的底层原理是先计算等号右边的元组(c2, c1)然后再拆包赋值给左边的变量。三、列表推导式列表推导式List Comprehension是Python中创建列表的简洁语法可以用一行代码替代多行循环代码更加Pythonic。3.1 基本语法name_list [tom, jerry, rose] name_list2 [i for i in name_list] # 生成0~10的数字列表 num_list [i for i in range(0, 11)] print(num_list) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]3.2 带条件的列表推导式可以在推导式中加入if条件实现过滤效果。age_list [19, 12, 13, 16, 18, 22, 32] list_18 [i for i in age_list if i 18] print(list_18) # [19, 22, 32]3.3 二维列表推导式列表推导式也支持多重循环用于生成二维列表。list3 [[i, j] for i in range(3) for j in range(5)] print(list3)四、函数进阶4.1 局部变量与全局变量在Python中变量的作用域分为全局变量定义在函数外部和局部变量定义在函数内部。在函数中访问全局变量函数内部可以直接读取全局变量的值# 定义全局变量 name 黑马 def class_407(): # 定义局部变量 class_name AI大模型6期 print(f我们的学校是{name}) # 可以访问全局变量 class_407()在函数中修改全局变量如果要在函数内部修改全局变量必须使用global关键字进行声明否则会视为创建了一个同名的局部变量。# 定义全局变量 name 黑马 def class_407(): # 定义局部变量 class_name AI大模型6期 # todo 要想修改全局变量name需要先用global声明 global name name 传智教育-王辉-黑马程序员 print(class_name) # AI大模型6期 print(name) # 传智教育-王辉-黑马程序员 # 调用函数 class_407() print(f我们的学校是{name}) # 我们的学校是传智教育-王辉-黑马程序员函数外部无法访问局部变量局部变量只在函数内部有效函数外部无法访问否则会报错。def class_407(): class_name AI大模型6期 print(class_name) class_407() # print(class_name) # NameError: name class_name is not defined4.2 函数返回多个值Python函数可以通过return同时返回多个值本质上返回的是一个元组。def shuchu(): return 1, 2, 3, 4 print(type(shuchu())) # class tuple4.3 函数参数类型提示Python 3.5 支持类型提示Type Hint可以在定义函数时标注参数和返回值的类型增强代码可读性注意类型提示仅在开发时辅助运行时不会强制校验。def func(a: str): pass五、函数传参方式Python函数的参数传递非常灵活支持位置传参、关键字传参、默认参数以及不定长参数等多种方式。5.1 位置传参按照参数定义的顺序依次传入是最基本的传参方式。5.2 关键字传参通过参数名值的形式传参可以打乱顺序代码可读性更强。5.3 默认参数在定义函数时给参数设置默认值调用时如果不传该参数则使用默认值。def show_student(name, age, nationality中国): print(f学生名字是:{name}, 年龄是:{age}, 国籍是:{nationality}) # 调用函数 show_student(小明, 19) # 学生名字是:小明, 年龄是:19, 国籍是:中国 show_student(tom, 19, nationalityUSA) # 学生名字是:tom, 年龄是:19, 国籍是:USA5.4 不定长参数 *args当不确定会传入多少个位置参数时可以使用*args来接收多余的位置参数。*表示收集多余位置参数args表示元组变量名一般命名为args但也可以自定义# 需求定义函数求任意个整数的和 def sum_any_num(*numbers): print(numbers) # () print(type(numbers)) # class tuple # 开始求和 total 0 for num in numbers: total num print(f求和结果是:{total}) # 调用函数 sum_any_num() # 传0个 sum_any_num(1) # 传1个 sum_any_num(1, 2, 3) # 传多个5.5 不定长参数 **kwargs当不确定会传入多少个关键字参数时可以使用**kwargs来接收多余的关键字参数。**表示收集多余关键字参数kwargs表示字典变量名一般命名为kwargs传参时需要使用键值的形式def show_student(**kwargs): print(kwargs) print(type(kwargs)) # 遍历字典打印学生信息 for k, v in kwargs.items(): print(k, v) # 调用函数 show_student() print(--------------) show_student(nametom) print(--------------) show_student(nametom, age19, gender男)5.6 传参的打包与拆包在调用函数时可以利用*和**对可迭代对象进行拆包传参func(*args)将列表/元组拆包为位置参数func(**kwargs)将字典拆包为关键字参数这在实际开发中非常实用可以方便地将已有的数据结构传递给函数。六、总结Day06主要学习了Python中一些进阶且实用的语法特性重点掌握拆包元组、列表、集合、字典的拆包语法以及利用拆包实现变量交换列表推导式基本推导、带条件过滤、二维列表推导用更少的代码实现更强大的功能变量作用域全局变量与局部变量的区别global关键字的使用函数返回多个值return多个值本质返回元组函数传参位置传参、关键字传参、默认参数、*args、**kwargs的灵活运用类型提示func(a: str)增强代码可读性这些知识点在日常Python开发中使用频率极高尤其是拆包和列表推导式是写出优雅Python代码的关键。建议多加练习做到融会贯通下一篇将继续学习Python的其他进阶内容敬请期待