内容概览
今日内容:
- 1- 【掌握】容器的拆包
- 2- 【知道】推导式
- 3- 【掌握】Python的函数:
- 3.1 基本定义与使用
- 3.2 变量的作用域
- 3.3 函数中各个参数设置
- 3.4 lambda函数(匿名函数)
容器拆包
什么是拆包?
简单来说就是把一个元组中的数据一个一个拆解出来的过程,就称之为叫做拆包操作。
基本语法
1 | tuple1 = (10, 20) |
拆包典型案例
定义一个容器(元组)
1 | tuple1 = ("炸鸡", True, 25.5) |
将元组中每个元素分别赋值给三个变量
1 | name, is_flag, price = tuple1 |
输出:炸鸡,True,25.5
其他自动拆包方式
1 | a, b = (10, 20) |
两变量值交换
初始化两个变量
1 | c1 = '游戏手柄' |
直接交换(利用自动拆包)
1 | c1 = '游戏手柄' |
输出:
1 | Switch |
使用临时变量(不用自动拆包)
1 | c1 = '游戏手柄' |
输出:
1 | Switch |
总结:自动拆包本质上就是把容器的每个元素”打散”分别赋值给对应位置的变量,变量数量必须和元素数量一致。变量交换时直接 a, b = b, a 即可,比传统临时变量法简洁得多
推导式
什么是推导式
推导式comprehensions(又称解析式),是Python的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列(一个有规律的列表或控制一个有规律列表)的结构体。 共有三种推导:列表推导式、集合推导式、字典推导式。
为什么需要推导式
案例:创建一个0-9的列表
while循环:
1 | # 初始化计数器 |
for循环:
1 | list1 = [] |
思考:我们能不能把以上代码简化为一行代码搞定这个程序呢?
答:可以,使用推导式
什么时候可以使用推导式:
当需要遍历一个容器, 然后遍历后需要返回一个新容器的场景
列表推导式
基本语法:
1 | 变量名 = [表达式 for 变量 in 列表] |
案例:定义0-9之间的列表
1 | list1 = [] |
列表推导式
1 | # 推导式演示: |
执行原理:[i for i in range(10)]
1 | 列表推导式先运行表达式右边的内容: |
列表推导式 + if条件判断
在使用列表推导式时候,我们除了可以使用for循环,其实我们还可以在其遍历的过程中,引入if条件判断。
1 | 变量 = [表达式 for 临时变量 in 序列 if 条件判断] |
案例:生成0-9之间的偶数(i%2 0)序列
1 | # 推导式 含 IF 操作 |
for循环嵌套列表推导式
1 | for 临时变量 in range(n): |
基本语法:
1 | 变量 = [表达式 for 临时变量 in 序列 for 临时变量 in 序列] |
🪑 座位表生成案例
需求:生成教室座位坐标列表
假设一个 3行 × 4列 的教室,生成所有座位的坐标:
1 | 座位布局: |
方法一:for循环嵌套
1 | seats = [] |
输出:
1 | [(0, 0), (0, 1), (0, 2), (0, 3), |
方法二:列表推导式
1 | # 推导式方式(更简洁) |
输出:
1 | [(0, 0), (0, 1), (0, 2), (0, 3), |
对比记忆 🧠
| 对比项 | for循环嵌套 | 列表推导式 |
|---|---|---|
| 代码行数 | 多行 | 一行搞定 |
| 可读性 | 逻辑清晰 | 简洁但稍难读 |
| 执行效率 | 稍慢 | 更快 |
| 适用场景 | 复杂逻辑 | 简单转换 |
推导式本质就是:
1 | # 外层 for 在前,内层 for 在后 |
更多练习 🎯
题目1: 生成 2×3 的棋盘坐标(从 (1,1) 开始)
1 | # 推导式 |
题目2: 生成所有 (0-9, 0-9) 的坐标对(排除对角线 i==j)
1 | # 推导式 |
推导式案例
案例一:使用列表推导式生成平方数集合
例如, 用户输入10, 表示要生成 1~10的每一个数字的平方的集合
1 | # 推导式案例: 案例一:使用列表推导式生成平方数集合 |
Python中函数的作用与使用步骤
为什么需要函数
在Python实际开发中,我们使用函数的目的只有一个“让我们的代码可以被重复使用”
函数的作用有两个:
① 代码重用(代码重复使用)
② 模块化编程(模块化编程的核心就是函数,一般是把一个系统分解为若干个功能,每个功能就是一个函数)
在编程领域,编程可以分为两大类:① 模块化编程 ② 面向对象编程
什么是函数
所谓的函数就是一个被命名的、独立的、完成特定功能的代码段(一段连续的代码),并可能给调用它的程序一个返回值。
被命名的:在Python中,函数大多数是有名函数(普通函数)。当然Python中也存在没有名字的函数叫做匿名函数。
独立的、完成特定功能的代码段:在实际项目开发中,定义函数前一定要先思考一下,这个函数是为了完成某个操作或某个功能而定义的。(函数的功能一定要专一)
返回值:很多函数在执行完毕后,会通过return关键字返回一个结果给调用它的位置。
函数的定义
基本语法:
1 | def 函数名称(参数1, 参数2, ...): |
在Python中,函数和变量一样,都是先定义后使用。
1 | # 定义函数 |
背包物品管理 — 带你一步步认识函数
1️⃣ 第一步:不用函数 — 重复代码写到手酸
1 | # 场景:游戏角色背包里有 100 个空格 |
问题: 每次捡道具都要写一模一样的 3 行代码,太繁琐了!💀
2️⃣ 第二步:封装成函数 — 代码复用
1 | # 定义一个函数:捡道具 |
输出:
1 | 捡到1个道具! |
好处: 🎉 定义一次,随时调用!再也不用复制粘贴了!
3️⃣ 第三步:函数带参数 — 告诉函数具体捡什么
1 | # 场景:捡到的东西不一样,打印的信息也要不一样 |
输出:
1 | 捡到了 【生命药水】! |
好处: 🎯 一个函数,变出无数种用法!
4️⃣ 第四步:函数带返回值 — 告诉调用者结果
1 | # 场景:希望函数告诉调用者,捡道具到底成不成功 |
输出:
1 | 捡到了 【生命药水】!背包进度:1/100 |
📊 总结对比
| 阶段 | 代码特点 | 能做什么 |
|---|---|---|
| 无函数 | 重复代码多 | 基本功能 |
| 无参函数 | 定义一次,调用多次 | 代码复用 |
| 带参函数 | 传入不同数据 | 一函多用 |
| 带返回值函数 | 返回执行结果 | 反馈给调用者 |
聊聊return返回值
思考1:如果一个函数如些两个return (如下所示),程序如何执行?
1 | def return_num(): |
答:只执行了第一个return,原因是因为return可以退出当前函数,导致return下方的代码不执行。
思考2:如果一个函数要有多个返回值,该如何书写代码?
答:在Python中,理论上一个函数只能返回一个结果。但是如果我们向让一个函数可以同时返回多个结果,我们可以使用return 元组的形式。
1 | def return_num(): |
思考3:封装一个函数,参数有两个num1,num2,求两个数的四则运算结果
四则运算:加、减、乘、除
1 | def size(num1, num2): |
相关演示:
1 | # 需求: 请帮我定义一个函数: computer 计算器函数, 要求给这个函数传入 2个参数, 在函数的内部完成 + - 计算, 并且将 + -的二个结果返回 |
函数的嵌套及案例
什么是函数的嵌套
所谓函数嵌套调用指的是一个函数里面又调用了另外一个函数。
函数嵌套的基本语法
1 | def funca(): |
扩展递归
1 | # 1 利用递归实现阶乘运算 |
1 | # 2 利用递归青蛙台阶 |

1 | # 3 实现汉诺塔 |
变量的作用域
什么是变量的作用域
变量作用域指的是变量的作用范围(变量在哪里可用,在哪里不可用),主要分为两类:全局作用域与局部作用域。
其实作用域的划分比较简单,在函数内部定义范围就称之为局部作用域,在函数外部(全局)定义范围就是全局作用域
1 | # 全局作用域 |
局部变量与全局变量
在Python中,定义在函数外部的变量就称之为全局变量;定义在函数内部变量就称之为局部变量。
1 | # 定义在函数外部的变量(全局变量) |
演示全局和局部的使用场景
1 | # 演示: 全局和局部变量: |
变量作用域的作用范围
全局变量:在整个程序范围内都可以直接使用
1 | str1 = 'hello' |
局部变量:在函数的调用过程中,开始定义,函数运行过程中生效,函数执行完毕后,销毁
1 | # 定义一个函数 |
运行结果:

普及小知识:计算机的垃圾回收机制 garbage collection
global关键字的应用场景
思考一个问题:我们能不能在局部作用域中对全局变量进行修改呢?
1 | ''' |

最终结果:弹出10,所以由运行结果可知,在函数体内部理论上是没有办法对全局变量进行修改的,所以一定要进行修改,必须使用global关键字。
1 | # 定义全局变量num = 10 |
记住:global关键字只是针对不可变数据类型的变量进行修改操作(数值、字符串、布尔类型、元组类型),可变类型可以不加global关键字。



1 | # 案例: 以卖票案例 |
可变数据类型, 不需要添加global
1 | # 结论: 如果变量的数据类型是可变的, 不需要添加global 就可以 对 全局变量进行修改 |
1 | 如果函数内修改的是可变对象,不需要加global,(dict,set,list,自定义类型对象) |





作用域说明完整源码
1 | ''' |
函数的参数进阶
函数的参数
在函数定义与调用时,我们可以根据自己的需求来实现参数的传递。在Python中,函数的参数一共有两种形式:
① 形参 ② 实参
形参:在函数定义时,所编写的参数就称之为形式参数
实参:在函数调用时,所传递的参数就称之为实际参数
1 | def greet(name): # name就是在函数greet定义时,所编写的参数(形参) |
注意:虽然我们在函数传递时,喜欢使用相同的名称作为参数名称。但是两者的作用范围是不同的。name = ‘老王’,代表实参。其是一个全局变量,而greet(name)函数中的name实际是在函数定义时才声明的变量,所以其实一个局部变量。
函数的参数类型(调用)
☆ 位置参数
理论上,在函数定义时,我们可以为其定义多个参数。但是在函数调用时,我们也应该传递多个参数,正常情况,其要一一对应。
1 | def user_info(name, age, address): |
注意事项:位置参数强调的是参数传递的位置必须一一对应,不能颠倒
☆ 关键词参数(Python特有)
函数调用,通过“键=值”形式加以指定。可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求。
1 | def user_info(name, age, address): |
☆ 函数定义时缺省参数(参数默认值)
缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可不传该默认参数的值(注意:所有位置参数必须出现在默认参数前,包括函数定义和调用)。
1 | def user_info(name, age, gender='男'): |
谨记:我们在定义缺省参数时,一定要把其写在参数列表的最后侧
相关的演示
1 | # 定义一个函数, 该函数需要传入三个参数 |
不定长参数
不定长参数也叫可变参数。用于不确定调用的时候会传递多少个参数(不传参也可以)的场景。此时,可用包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递,会显得非常方便。
☆ 不定长元组(位置)参数
1 | def user_info(*args): |
☆ 不定长字典(关键字)参数
1 | def user_info(**kwargs): |
kw = keyword + args
综上:无论是包裹位置传递还是包裹关键字传递,都是一个组包的过程。
Python组包:就是把多个数据组成元组或者字典的过程。
相关演示:
1 | # 演示不定长参数: |
案例:Python中数据的传递案例
1 | def func(*args, **kwargs): |
lambda函数
普通函数与匿名函数
在Python中,函数是一个被命名的、独立的完成特定功能的一段代码,并可能给调用它的程序一个返回值。
所以在Python中,函数大多数是有名函数 => 普通函数。但是有些情况下,我们为了简化程序代码,也可以定义匿名函数 => lambda表达式
lambda表达式应用场景
如果一个函数有一个返回值,并且只有一句代码,可以使用 lambda简化。
lambda表达式基本语法
1 | 变量 = lambda 函数参数:表达式(函数代码 + return返回值) |
编写lambda表达式
定义一个lambda表达式
1 | ''' |

编写带参数的lambda表达式
编写一个函数求两个数的和
1 | def fn1(num1, num2): |
lambda表达式进行简化:
1 | ''' |
☆ 带默认参数的lambda表达式
1 | # 有参数 参数带有默认值: |
☆ 带if判断(三目运算符)的lambda表达式
1 | # 带 if判断(三目运算符)的lambda表达式 |
☆ 列表数据+字典数据排序(重点)
lambda表达式经常配合泛型编程使用
不受限于数据结构
也不受限于实际参数
封装和调用解耦合
知识点:列表.sort(key=排序的key)
1 | print("------------------------------------") |