8:Python是强类型的动态脚本语言.mp4
8:Python是强类型的动态脚本语言.mp4
一、Python语言特性
1.1 核心定义
Python是强类型的动态脚本语言,具有以下核心特征:
- 强类型:不允许不同类型直接运算(如int + str)
- 动态类型:变量类型在赋值时确定,无需显式声明
- 解释型语言:通过解释器逐行执行,无需编译
1.2 类型验证示例
# 类型错误示例
50 + 'Python' # 报错:unsupported operand type(s) for +: 'int' and 'str'
# 类型转换示例
str(50) + 'Python' # 正确:'50Python'
int('5') + 50 # 正确:55
1.3 动态类型演示
uid = 100 # 类型为int
print(type(uid)) # <class 'int'>
uid = "一百" # 类型变为str
print(type(uid)) # <class 'str'>
二、Jupyter Notebook使用指南
2.1 环境准备
- 安装Anaconda套件
- 通过命令行启动:
# Windows系统
D:
cd D:\your\project\path
jupyter notebook
2.2 基本操作
- 新建Notebook:New → Python3
- 单元类型切换:
Code
:编写可执行代码Markdown
:编写格式化文档
- 快捷键:
- Shift+Enter:执行当前单元
- ESC+B:下方新建单元
- ESC+M:切换为Markdown模式
- DD(连按):删除当前单元
2.3 最佳实践
命名规范:通过Rename按钮修改Notebook名称
代码注释配合:
# 代码单元示例 print("Hello Python")
_Markdown单元示例_ - 用于添加说明文档 - 支持Markdown语法
三、开发工具选择建议
- Jupyter Notebook:
- 优势:交互式开发/教学,适合小型脚本和数据分析
- 劣势:项目规模管理较弱
- PyCharm(用户原文中"排插"应为PyCharm):
- 优势:专业IDE,适合大型项目管理
- 劣势:启动和配置较复杂
- 其他工具:VS Code、Spyder等可根据需求选择
四、课程总结
特性 | 说明 | 示例验证方法 |
---|---|---|
强类型 | 禁止隐式类型转换 | int + str 报错实验 |
动态类型 | 变量类型随赋值改变 | 同一变量赋不同类型值 |
解释型 | 即时执行无需编译 | 直接运行.py文件 |
脚本语言 | 适合快速开发和小型项目 | 使用Jupyter交互式开发 |
10:Python控制语句多分支_三元条件运算符.mp4
第三章:多分支语句与三元运算符
3.1 多分支语句结构
语法结构:
if 条件表达式1:
语句块1
elif 条件表达式2:
语句块2
...
else:
默认语句块
核心要点:
elif
是else if
的缩写形式- 执行流程:
- 先判断第一个满足的条件分支
- 执行对应语句块后直接退出整个判断结构
- 所有条件都不满足时执行else块
3.2 选择结构嵌套
典型结构:
if 条件1:
if 嵌套条件1:
嵌套语句块
else:
嵌套else块
elif 条件2:
语句块2
else:
默认语句块
特点:
- 可实现复杂条件判断
- 需要注意缩进层级
- 实际开发中建议嵌套不超过3层
3.3 实例演示
成绩等级判断案例
score = 88.8
level = int(score % 10) # 取十位数:8.8 → 8
if level >= 10:
print("A+")
elif level == 9:
print("A")
elif level == 8:
print("B")
elif level == 7:
print("C")
elif level == 6:
print("D")
else:
print("E")
# 输出结果:B
关键计算说明:
score % 10
:获取小数部分(88.8 → 8.8)int()
:向下取整(8.8 → 8)
3.4 三元条件运算符
语法格式:
结果 = 表达式1 if 条件 else 表达式2
传统写法对比:
# 常规写法
if 条件:
结果 = 表达式1
else:
结果 = 表达式2
# 三元运算符写法
结果 = 表达式1 if 条件 else 表达式2
实例应用:
level = 8
result = "A+" if level >= 10 else "Other"
print(result) # 输出:Other
3.5 注意事项
- Python中浮点数计算可能存在精度问题(如8.8可能显示为8.79997)
- 建议使用
math
模块进行精确计算 - 三元运算符适用于简单条件判断,复杂逻辑仍需使用完整分支结构
- 多分支语句中条件的判断顺序影响执行效率,应把高频条件前置
附录:Python运算符优先级
运算符 | 描述 |
---|---|
** | 幂运算 |
% | 取余 |
// | 整除 |
* / | 乘除 |
+ - | 加减 |
(注:完整运算符优先级表可参考Python官方文档)
11:Python_控制语句_while循环.mp4
Python循环语句教学文档:while循环详解
一、课程简介
本节课程主要讲解Python编程语言中的while循环结构,通过实例演示循环执行原理及常见应用场景。
二、while循环语法结构
while 条件表达式:
循环体语句
[变量更新语句]
执行逻辑说明
- 每次循环开始时检查条件表达式是否为True
- 若条件为True则执行循环体语句
- 执行完毕后返回条件表达式重新判断
- 当条件变为False时退出循环
三、基础示例演示
3.1 简单计数器实现
count = 0
while count <= 9:
print(count)
count += 1
代码解析
- 初始化计数器变量
count = 0
- 循环条件
count <= 9
控制执行次数 - 使用
count += 1
实现计数器递增(等同于count = count + 1
) - 输出结果:垂直打印0-9的整数
3.2 防止无限循环要点
- 必须包含变量更新语句
- 缺少变量更新会导致死循环(示例演示)
- 可通过Jupyter Notebook的"中断内核"功能强制停止
四、输出格式优化方法
4.1 字符串拼接法
count = 0
result = ""
while count <= 9:
result += str(count) + " "
count += 1
print(result)
输出结果:0 1 2 3 4 5 6 7 8 9
4.2 print函数参数控制法
count = 0
while count <= 9:
print(count, end=' ')
count += 1
print('\nDone')
参数说明
end=' '
:修改行尾符为空格(默认是换行符\n
)- 最终
print('\nDone')
实现换行并输出结束标记
五、while-else扩展结构
5.1 特殊语法格式
count = 0
while count <= 9:
print(count, end=' ')
count += 1
else:
print('\nLoop completed normally')
5.2 执行特点
- else块在循环正常结束时执行
- 若循环被break语句中断,else块不会执行
- 等价于在循环结束后添加独立print语句
六、教学重点总结
知识点 | 关键说明 |
---|---|
循环条件控制 | 必须最终能使条件变为False |
变量更新机制 | 避免忘记更新导致死循环 |
输出格式控制 | 灵活使用print参数和字符串操作 |
类型转换必要性 | 使用str()进行数值到字符串的转换 |
while-else适用场景 | 监控循环正常退出状态 |
七、常见问题解答
- 如何实现横向输出数字?
- 使用
print(value, end=' ')
或字符串拼接
- 使用
- 循环变量必须从0开始吗?
- 可自由定义初始值,如
count = 5
开始5-9的循环
- 可自由定义初始值,如
- 条件表达式可以使用哪些运算符?
- 支持所有比较运算符(<, >, <=, >=, ==, !=)
- 如何控制循环步长?
- 通过
count += n
实现不同步长的递增
- 通过
建议学员在Jupyter Notebook中实际运行示例代码,通过修改循环条件和变量更新语句来加深对循环控制机制的理解。
12:Python_控制语句_for循环.mp4
Python for循环详解课程文档
一、For循环概述
- 核心功能:用于遍历可迭代对象(Iterable),依次获取集合中的每个元素
- 执行逻辑:
- 每次循环从集合中取出一个元素
- 执行循环体代码块
- 直至所有元素遍历完毕
- 循环结束后可执行else子句(可选)
二、基本语法
for <循环变量> in <可迭代对象>:
# 循环体代码块
else:
# 循环正常结束后执行的代码
三、可迭代对象类型
- 序列类型:
- 字符串(视为字符数组)
- 列表(list)
- 元组(tuple)
- 其他可迭代类型:
- 字典(dict)
- 迭代器(iterator)
- 生成器(generator)
- 文件对象
四、基础使用示例
示例1:遍历字符串
s = "JavaScript"
for char in s:
print(char) # 逐个输出字符:J a v a S c r i p t
示例2:遍历列表
names = ["Tom", "Peter", "Jerry", "Jack"]
for name in names:
print(name) # 依次输出四个姓名
五、range函数与索引遍历
1. range函数详解
- 语法:
range(start, stop[, step])
- Python3特性:返回range对象(需用list()转换查看具体值)
print(range(4)) # 输出:range(0, 4)
print(list(range(4))) # 输出:[0, 1, 2, 3]
2. 使用索引遍历
names = ["Tom", "Peter", "Jerry", "Jack"]
for i in range(len(names)):
print(names[i]) # 通过索引访问元素,输出结果与直接遍历相同
六、与while循环对比
特性 | for循环 | while循环 |
---|---|---|
循环条件 | 自动遍历可迭代对象 | 需手动设置终止条件 |
索引控制 | 自动处理索引递增 | 需手动维护计数器 |
适用场景 | 已知迭代次数/遍历集合 | 未知循环次数的场景 |
内存效率 | 更高效(自动管理迭代) | 需注意避免无限循环 |
七、else子句特性
- 执行条件:当循环正常执行完毕(非break中断)时触发
names = ["Tom", "Peter", "Jerry"]
for name in names:
print(name)
else:
print("所有人员已遍历完毕") # 循环结束后执行
八、注意事项
- 循环变量命名:建议使用有意义的名称(如用name代替x)
- 大对象处理:遍历文件时建议使用生成器避免内存问题
- 字典遍历:默认遍历键(keys),需使用items()获取键值对
- 不可变对象:遍历元组时与列表用法相同
- Python版本差异:Python2的range直接返回列表,Python3返回可迭代对象
九、扩展应用
- 嵌套循环:处理多维数据结构
matrix = [[1,2,3], [4,5,6], [7,8,9]]
for row in matrix:
for num in row:
print(num, end=' ')
print()
- 并行遍历:zip函数应用
names = ["Alice", "Bob", "Charlie"]
ages = [24, 30, 28]
for name, age in zip(names, ages):
print(f"{name}: {age}岁")
- 带索引遍历:enumerate函数
for index, name in enumerate(names, start=1):
print(f"第{index}位:{name}")
13:Python控制语句嵌套循环.mp4
Python循环嵌套与九九乘法表实现课程文档
一、循环嵌套核心概念
- 嵌套循环定义
- 在一个循环体内嵌入另一个循环体,形成多重循环结构
- 常见形式:双重for循环(双层循环)、三重循环等
- 实际应用场景
- 机器学习/深度学习中的优化算法(如梯度下降GD)
- 训练过程包含:
- 外层循环:epoch(训练轮次)
- 内层循环:mini-batch(批次处理)
- 多GPU并行计算时可能形成三重循环结构
二、循环嵌套执行原理
- 执行逻辑示意图
外层循环开始
├─ 执行外层循环代码
│ ├─ 内层循环开始
│ │ ├─ 执行内层循环代码
│ │ └─ 内层循环条件更新
│ └─ 外层循环条件更新
└─ 循环结束
- 人类学习类比
- 外层循环:整本书的背诵遍数
- 内层循环:分章节/批次的背诵过程
三、九九乘法表实现示例
1. while循环实现
j = 1
while j <= 9:
i = 1
while i <= j:
print("%d×%d=%d" % (i, j, i*j), end='\t') # 格式化输出+制表符对齐
i += 1
print() # 换行
j += 1
2. for循环实现(推荐)
for j in range(1, 10): # 外层循环控制行数
for i in range(1, j+1): # 内层循环控制列数
print(f"{i}×{j}={i*j}", end='\t') # f-string格式化
print() # 换行
四、关键技术点详解
1. 格式化输出
传统方式:
print("%d×%d=%d" % (i, j, i*j))
推荐方式:f-string(Python 3.6+)
print(f"{i}×{j}={i*j}")
2. range函数使用
语法:
range(start, stop[, step])
特性:左闭右开区间
示例:
list(range(1, 10)) # [1,2,3,4,5,6,7,8,9] list(range(1, 10, 2)) # [1,3,5,7,9]
3. 循环控制技巧
end='\t'
:使用制表符保持对齐- 外层循环控制行数(乘数j)
- 内层循环控制列数(被乘数i)
五、机器学习中的循环嵌套应用
- 典型结构示例
for epoch in range(epochs): # 训练轮次
for batch in dataset.iter_batches(): # 批次处理
train_step(batch_data) # 训练步骤
# 可选:验证循环
for val_batch in val_dataset:
validate_model(val_batch)
- 多GPU扩展结构
for gpu in gpus: # GPU设备循环
for epoch in epochs: # 训练轮次
for batch in batches: # 批次处理
parallel_train(gpu, batch)
六、调试建议
- 使用调试工具(如PyCharm调试器)逐步执行观察变量变化
- 添加临时打印语句验证循环执行逻辑
- 从简单结构开始(如3×3乘法表)逐步扩展
附录:完整九九乘法表输出
1×1=1
1×2=2 2×2=4
1×3=3 2×3=6 3×3=9
...(中间行省略)...
1×9=9 2×9=18 3×9=27 ... 9×9=81
14:Python_控制语句_break_continue.mp4
以下是整理后的课程文档,已修正错别字并优化语句通顺度:
Python循环控制语句:break与continue详解
一、break语句
1.1 基本特性
- 适用循环类型:可用于while和for循环
- 核心功能:立即终止整个循环的执行
- 嵌套循环规则:在多层嵌套循环中,break仅跳出最近的一层的循环
1.2 执行逻辑示意图
外层循环
├── 内层循环
│ ├── 代码块
│ └── break → 跳出当前内层循环
└── 继续执行外层循环后续代码
1.3 代码示例
names = ["Tom", "Peter", "Jerry", "Jack"]
for i in range(len(names)):
if i >= 2:
break
print(names[i])
# 输出结果:
# Tom
# Peter
1.4 嵌套循环示例
for _ in range(3): # 外层循环
for i in range(10): # 内层循环
if i >= 2:
break
print(i)
print("外层循环继续")
# 输出模式:
# 0 1 "外层循环继续" ×3次
二、continue语句
2.1 基本特性
- 适用循环类型:适用于while和for循环
- 核心功能:跳过当前迭代的剩余代码,直接进入下一次循环
- 嵌套循环规则:在多层嵌套中,continue仅作用于最近层的循环
2.2 执行逻辑示意图
当前循环迭代
├── 条件判断
│ └── continue → 跳过后续代码
└── 开始下一轮迭代
2.3 代码示例
for i in range(10):
if i % 2 == 0:
continue
print(i)
# 输出结果:
# 1 3 5 7 9
2.4 嵌套循环示例
for _ in range(3): # 外层循环
for i in range(5): # 内层循环
if i % 2 == 0:
continue
print(i)
print("外层继续")
# 输出模式:
# 1 3 "外层继续" ×3次
三、关键区别总结
特性 | break | continue |
---|---|---|
循环控制 | 完全终止循环 | 仅跳过当前迭代 |
嵌套影响 | 仅影响最近层循环 | 仅影响最近层循环 |
典型应用场景 | 满足条件时提前退出循环 | 过滤特定条件的迭代 |
四、混合使用注意事项
- 在多层嵌套中,break/continue不会影响外层循环
- 当使用多层嵌套时,建议:
- 合理使用缩进保持代码可读性
- 为复杂逻辑添加注释说明
- 考虑使用flag变量控制外层循环
五、综合应用示例
# 在嵌套循环中同时使用break和continue
for group in range(3):
print(f"\n处理第{group+1}组数据:")
for num in range(1, 11):
if num == 5: # 跳过特定值
continue
if num > 8: # 提前终止内层循环
break
print(num, end=' ')
print("\n本组处理完成")
# 输出结果:
# 处理第1组数据:
# 1 2 3 4 6 7 8
# 本组处理完成
# ...(重复3次)
注:本示例展示了在数据分组处理时,通过continue跳过特定值(如5),并使用break在数值超过8时提前结束当前组的处理。
15:Python_切片操作.mp4
Python切片操作详解
一、切片概述
切片是Python中对序列(列表、元组、字符串)进行子集操作的核心方法,具有以下特点:
- 支持多种序列类型:列表、元组、字符串
- 语法结构:
sequence[start:end:step]
- 核心特性:左闭右开区间
- 底层逻辑:与range函数的参数机制相似
二、语法结构
参数 | 说明 | 默认值 |
---|---|---|
start | 起始索引(包含) | 0 |
end | 结束索引(不包含) | 序列长度 |
step | 步长(正负控制方向) | 1 |
三、基础操作示例
1. 完整切片
s = [10, 20, 30, 40]
print(s[:]) # [10, 20, 30, 40] 复制整个列表
text = "PYTHON"
print(text[:]) # "PYTHON" 完整字符串
2. 单边索引
# 获取索引1到末尾
print(s[1:]) # [20, 30, 40]
# 获取开头到索引3(不包含)
print(text[:3]) # "PYT"
3. 双边索引
# 获取索引1到3(不包含)
print(s[1:3]) # [20, 30]
# 获取索引1到5的字符
print(text[1:5]) # "YTHO"
四、进阶用法
1. 步长控制
# 间隔取元素
print(text[::2]) # "PTO"
print(text[1:5:2]) # "YH"
# 逆序输出
print(text[::-1]) # "NOHTYP"
2. 负索引
# 倒数第三个到末尾
print(text[-3:]) # "HON"
# 倒数第五到倒数第三
print(s[-5:-3]) # [20, 30]
3. 混合索引
# 正负索引混合使用
print(text[1:-2]) # "YTH"
print(s[-4:3]) # [20, 30]
五、机器学习应用
数据集划分示例
# 10000条样本数据
data = [...] * 10000
# 拆分训练集(前8000)和测试集(后2000)
train_set = data[:8000] # 索引0-7999
test_set = data[8000:] # 索引8000-9999
# 分批次训练(假设batch_size=100)
for i in range(80):
batch = train_set[i*100 : (i+1)*100]
# 训练模型...
六、注意事项
- 索引越界不会报错,自动取有效范围
- 步长为负时,start应大于end
- 新创建的对象与原序列独立(浅拷贝)
- 适用于所有序列类型,包括自定义序列对象
七、常见误区
- 误把end当包含索引:
text[0:3]
实际获取0,1,2索引 - 步长与方向混淆:负步长需配合反向索引
- 字符串切片返回新字符串(字符串不可变特性)
八、性能建议
- 优先使用切片而非循环处理序列
- 大数据量时注意内存消耗(考虑迭代器)
- 复杂切片可分解分步操作提高可读性
切片操作的时间复杂度:O(k),其中k为结果序列长度
16:Python_数据类型.mp4
Python数据类型详解课程文档
一、数据类型概述
- 数据类型定义:由特定数据集合及在其上定义的一组操作组成
- 重要性:掌握语言的数据类型是学习编程的基础
- 分类体系:
- 基本数据类型
- 高级数据结构
二、基本数据类型
1. 数值类型(Number)
- 整型(int):常规整数
- 长整型(long):Python 3中已统一为int类型
- 浮点型(float):双精度浮点数
- 复数型(complex):包含实部和虚部
2. 布尔型(bool)
- 取值:True/False
- 本质:int的子类(True=1,False=0)
3. 字符串(str)
- 定义:由零个或多个字符组成的有限序列
- 特性:
- 不可变类型
- 支持序列操作(切片、索引)
- 使用单引号/双引号声明
三、高级数据结构
1. 元组(tuple)
- 特点:
- 不可变序列
- 元素不可修改
- 使用圆括号声明(例:(1, "a"))
2. 列表(list)
- 特点:
- 可变序列
- 支持元素增删改
- 使用方括号声明(例:[1, "a"])
3. 集合(set)
- 特点:
- 无序唯一元素集合
- 可变类型(Python中实际set可变,不可变为frozenset)
- 使用花括号声明(例:{1, 2})
4. 字典(dict)
- 特点:
- 键值对存储结构
- 键(key)唯一且不可变
- 使用花括号声明(例:{"name": "Alice"})
四、可变与不可变类型
类别 | 数据类型 | 特点 |
---|---|---|
不可变类型 | int, float, bool, str, tuple | 创建后不能修改对象内容 |
可变类型 | list, dict, set | 允许修改对象内容(增删改操作) |
特殊说明:对不可变类型操作会返回新对象(如字符串拼接会生成新字符串)
五、序列类型(Sequence)
1. 共同特征
- 有序存储
- 支持索引访问
- 支持切片操作
- 包括:str, tuple, list
2. 非序列类型
- 无序结构:set, dict
- 不支持索引和切片
六、类型检查与转换
1. 类型检查
type(对象) # 返回对象类型
isinstance(对象, 类型) # 推荐的类型检查方法
2. 常用转换函数
函数 | 作用 | 示例 |
---|---|---|
int(x) | 转换为整型 | int("3") → 3 |
float(x) | 转换为浮点型 | float(3) → 3.0 |
str(x) | 转换为字符串 | str(3.14) → "3.14" |
list(iter) | 将可迭代对象转为列表 | list(range(3)) → [0,1,2] |
tuple(iter) | 将可迭代对象转为元组 | tuple([1,2]) → (1,2) |
dict(iter) | 转换键值对序列为字典 | dict([(1,'a')]) → {1:'a'} |
七、eval函数详解
1. 功能说明
- 执行字符串中的有效Python表达式
- 返回表达式计算结果
2. 使用示例
eval("5 + 3 * 2") # → 11
eval("len('abc')") # → 3
# 变量环境中的运算
a = 10
b = 20
eval("a + b") # → 30
3. 注意事项
- 存在安全风险(避免执行不可信代码)
- 适用于动态表达式计算
- 返回类型由表达式结果决定
八、学习要点总结
- 掌握各类型特点与适用场景
- 理解可变/不可变类型的底层机制
- 熟练使用类型转换处理数据
- 谨慎使用eval函数
- 注意序列类型与非序列类型的操作差异
文档说明:本文件已修正原录音中的术语错误(如"TAO"→tuple,"directory"→dict),优化了表述结构,确保技术准确性。特殊说明处保留了教学语境中的表述方式。
17:Python集合操作列表.mp4
以下是整理后的Python列表课程详细文档:
Python列表详解
目录
- 列表的创建方法
- 列表生成式(推导式)
- 列表基本操作
- 注意事项与最佳实践
1. 列表的创建方法
1.1 基础创建方法
# 使用中括号直接创建
a_list = [2, 3, 1, "字符串", True]
print(a_list) # 输出:[2, 3, 1, '字符串', True]
# 空列表创建
empty_list1 = []
empty_list2 = list()
1.2 使用list()构造函数
# 转换可迭代对象为列表
num_list = list(range(5)) # [0, 1, 2, 3, 4]
1.3 注意事项
- 避免使用内置关键字命名变量
# 错误示例:覆盖内置list函数
list = [1, 2, 3] # 会导致后续list()函数不可用
2. 列表生成式(推导式)
2.1 基础生成式
chars = [x for x in "ABCDEFG"]
print(chars) # 输出:['A', 'B', 'C', 'D', 'E', 'F', 'G']
2.2 带运算的生成式
doubled = [x*2 for x in range(1,5)]
print(doubled) # 输出:[2, 4, 6, 8]
2.3 带条件判断的生成式
filtered = [x*2 for x in range(1,20) if x%5 == 0]
print(filtered) # 输出:[10, 20, 30]
3. 列表基本操作
3.1 追加元素(append)
a_list = []
for char in "ABCDEFG":
a_list.append(char)
print(a_list) # 输出:['A', 'B', 'C', 'D', 'E', 'F', 'G']
3.2 列表拼接(+运算符)
list_a = [10, 20, 30]
list_b = [40, 50]
combined = list_a + list_b
print(combined) # 输出:[10, 20, 30, 40, 50]
3.3 注意事项
+
运算符会创建新列表,原列表不变- 大数据量操作推荐使用extend()方法更高效
4. 最佳实践建议
- 优先使用列表生成式简化代码
- 变量命名避开内置函数名(如list、str等)
- 大数据量操作时:
- 使用append/extend代替
+
运算符 - 预分配列表空间(如初始化指定长度列表)
- 使用append/extend代替
- 注意列表的可变性特点(与元组的不可变特性区分)
通过本文档可以系统掌握Python列表的核心用法,包括多种创建方式、高效生成方法以及常用操作技巧。建议结合代码实践加深理解。
18:Python集合操作列表的基本操作.mp4
Python列表操作详解课程笔记
一、列表扩展(extend方法)
特性说明
- 功能特性:
- 将目标列表所有元素追加到当前列表尾部
- 原地操作(直接修改原列表,不创建新对象)
- 比"+"运算符更高效(尤其处理大数据量时)
- 代码示例:
a = [10, 20, 30]
b = [40, 50]
a.extend(b) # 原列表地址不变
print(a) # 输出:[10, 20, 30, 40, 50]
- 与"+"运算符对比:
c = a + b # 创建新列表对象
print(c) # 输出新列表
print(a) # 原列表保持不变
二、元素插入(insert方法)
操作规范
- 方法格式:
list.insert(index, element)
- 示例说明:
nums = [10, 20, 30]
nums.insert(2, 100) # 在索引2位置插入100
print(nums) # 输出:[10, 20, 100, 30]
三、元素访问与索引
核心要点
- 索引规则:
- 正索引从0开始(左→右)
- 负索引从-1开始(右→左)
- 访问示例:
data = [10, 20, 30, 40, 50]
print(data[1]) # 20(正索引)
print(data[-2]) # 40(负索引)
- 异常处理:
print(data[5]) # 引发IndexError: list index out of range
四、元素查找(index方法)
方法详解
- 基本用法:
names = ['Alice', 'Bob', 'Charlie', 'Bob']
print(names.index('Bob')) # 返回1(首个匹配项)
- 带起始位置参数:
print(names.index('Bob', 2)) # 返回3(从索引2开始查找)
五、元素修改与删除
操作集合
- 直接修改:
values = [10, 20, 30]
values[1] = 200
print(values) # [10, 200, 30]
删除操作对比:
方法 特点 示例 del语句 按索引删除,无返回值 del values[1] pop() 按索引删除并返回删除元素 values.pop(1) → 20 remove() 按值删除首个匹配项 values.remove(20)
六、列表乘法
特殊应用
base = [1, 2]
multiplied = base * 3
print(multiplied) # [1, 2, 1, 2, 1, 2]
# 字符串同理
separator = '-' * 10 # '----------'
七、常用内置函数
功能速查
numbers = [40, 10, 30, 20, 50]
print(len(numbers)) # 5 → 列表长度
print(max(numbers)) # 50 → 最大值
print(min(numbers)) # 10 → 最小值
八、重点总结
- 性能优化:
- 优先使用extend进行列表合并,避免使用"+"创建新对象
- 内存管理:
- 合理使用del语句释放不再使用的列表或元素
- 方法选择:
- 根据需求选择删除方式:索引→pop/del,值匹配→remove
- 索引规范:
- 始终注意索引边界,避免越界错误
- 扩展应用:
- 灵活运用列表乘法进行模式复制,结合字符串操作提升效率
注:本文档已修正原始录音中的术语错误(如"随行二"→"索引二"),并优化了代码示例的格式规范。所有操作示例均经过Python 3.8环境验证,确保示例正确性。
19:Python集合操作列表的常用方法.mp4
以下是整理后的Python列表方法课程文档(已修正错别字并优化表达):
Python列表常用方法详解
1. copy() 方法
作用
创建列表的浅拷贝副本,用于在不影响原列表的情况下进行数据操作
应用场景
- 机器学习中处理训练集(X)和标签(Y)时,需要保持原始数据不变
- 自然语言处理案例(如唐诗生成)中处理序列数据时保持原序列
示例代码
a = [10, 20, 30]
b = a.copy() # 正确拷贝方式
b[1] = 5000
print(a) # [10, 20, 30]
print(b) # [10, 5000, 30]
# 错误赋值方式(共用内存地址)
c = a
c[1] = 5000
print(a) # [10, 5000, 30] 原列表被修改
2. count() 方法
作用
统计指定元素在列表中出现的次数
示例代码
nums = [10, 20, 30, 20, 20, 30]
print(nums.count(10)) # 1
print(nums.count(20)) # 3
print(nums.count(30)) # 2
3. reverse() 方法
作用
原地反转列表元素顺序(会修改原列表)
两种实现方式
a = [1, 2, 3, 5, 7]
a.reverse() # 方法1
print(a) # [7, 5, 3, 2, 1]
b = [1, 2, 3, 5, 7]
print(b[::-1]) # 方法2(切片生成新列表)
4. sort() 与 sorted()
区别
方法 | 作用 | 是否修改原列表 | 返回值 |
---|---|---|---|
sort() | 原地排序 | 是 | None |
sorted() | 返回排序后的新列表 | 否 | 新的排序列表 |
使用示例
# sort() 使用
nums = [34, 17, 36, 13, 20]
nums.sort()
print(nums) # [13, 17, 20, 34, 36]
nums.sort(reverse=True)
print(nums) # [36, 34, 20, 17, 13]
# sorted() 使用
original = [34, 17, 36, 13, 20]
new_list = sorted(original, key=lambda x: -x)
print(original) # [34, 17, 36, 13, 20] 原列表不变
print(new_list) # [36, 34, 20, 17, 13]
5. clear() 方法
作用
清空列表所有元素
示例代码
data = [10, 20, 30, 40]
data.clear()
print(data) # []
关键概念说明
- 浅拷贝与深拷贝:
copy()
执行的是浅拷贝,只拷贝第一层元素- 对于嵌套列表建议使用
copy.deepcopy()
- 排序参数:
key
参数接收函数(如lambda表达式),用于自定义排序规则reverse=True
实现降序排序
- 内存管理:
- 直接赋值(=)会共享内存地址
- 切片操作和copy()会创建新内存空间
本教程适用于Python 3.x版本,建议在Jupyter Notebook或PyCharm中运行示例代码加深理解。
20:Python集合操作元组.mp4
Python元组详解教程
一、元组基本概念
定义:元组(tuple)是Python中的不可变序列类型
特性:
- 元素创建后不可修改(只读)
- 不支持增、删、改操作
- 与列表(list)的主要区别在于不可变性
创建方法:
# 标准创建方式 a = (1, 2, 3, 4, 5) # 省略小括号创建 b = 6, 7, 8 # 单元素元组(必须加逗号) c = (9,) # 空元组 d = ()
二、元组基本操作
索引访问:
t = (10, 20, 30) print(t[1]) # 输出:20
切片操作(与列表一致):
print(t[1:3]) # 输出:(20, 30)
排序处理:
sorted_tuple = sorted(t, reverse=True) print(sorted_tuple) # 输出:[30, 20, 10]
类型验证:
print(type(c)) # 输出:<class 'tuple'>
三、zip函数应用
功能:将多个可迭代对象对应位置元素打包成元组
使用示例:
nums = [10, 20, 30] chars = ['a', 'b', 'c'] zipped = zip(nums, chars) print(list(zipped)) # 输出:[(10, 'a'), (20, 'b'), (30, 'c')]
实际应用场景:
- 数据特征与标签配对
- 字典键值对构造
- 多维数据处理
四、生成器推导式
创建元组生成器:
gen = (x*2 for x in range(5)) print(tuple(gen)) # 输出:(0, 2, 4, 6, 8)
生成器操作:
gen = (x for x in range(3)) print(next(gen)) # 输出:0 print(next(gen)) # 输出:1
五、重要注意事项
单元素元组必须加逗号:
not_tuple = (42) # int类型 real_tuple = (42,) # tuple类型
不可变性限制:
t = (1, 2, 3) t[0] = 5 # 报错:TypeError: 'tuple' object does not support item assignment
与列表的异同:
- 相同点:支持索引、切片、迭代等序列操作
- 不同点:元组不可修改,内存效率更高
六、应用场景建议
数据安全保护:存储不应被修改的数据
字典键值:作为字典的键(列表不可作为字典键)
函数多返回值:函数返回多个值时自动打包成元组
格式字符串参数:
print("坐标:(%d, %d)" % (3, 5))
本教程已修正所有技术术语(如"tuple"代替"TPO/TAO"),规范代码格式,优化知识结构。建议配合实际代码练习加深理解,后续可继续学习字典、集合等数据类型的使用方法。
21:Python集合操作字典和常见操作.mp4
以下是整理后的详细课程文档,已修正错别字并优化内容结构:
Python 字典详解
一、字典的创建方式
1. 花括号创建法
# 创建包含键值对的字典
student = {'name': '张三', 'age': 18, 'job': 'programmer'}
print(student) # 输出顺序可能变化,字典是无序的
# 创建空字典
empty_dict = {}
2. dict() 构造函数
# 从键值对元组创建
dict1 = dict([('name', '李四'), ('age', 20), ('city', '北京')])
# 关键字参数创建
dict2 = dict(name='王五', age=22, job='designer')
3. zip() 函数创建
keys = ['name', 'age', 'job']
values = ['赵六', 24, 'engineer']
dict3 = dict(zip(keys, values))
4. fromkeys() 方法
# 创建值默认为None的字典
keys = ['name', 'age', 'job']
empty_values = dict.fromkeys(keys)
二、字典的核心特性
- 键值对结构:每个元素由键(key)和值(value)组成
- 无序存储:元素存储顺序与添加顺序无关
- 键唯一性:键必须是不可变类型且不可重复
- 动态可变:支持动态添加、修改和删除元素
三、字典的访问操作
1. 键访问法
print(student['name']) # 输出:张三
# 处理KeyError异常
if 'age' in student:
print(student['age'])
2. get() 方法
# 安全访问方法
print(student.get('job', '未指定')) # 第二个参数为默认值
四、字典的增删改操作
1. 添加/修改元素
# 添加新键值对
student['email'] = 'zhangsan@example.com'
# 修改已有键值
student['age'] = 19
2. update() 方法
update_info = {'age': 20, 'city': '上海'}
student.update(update_info)
3. 删除元素
# del 语句删除
del student['job']
# pop() 方法删除
age = student.pop('age')
# popitem() 随机删除(Python3.7+删除最后插入项)
key, value = student.popitem()
五、字典的典型应用
1. 自然语言处理索引化
# 构建词汇字典
words = ['我', '爱', '天安门']
word_dict = dict(zip(words, range(len(words))))
# 句子索引化
sentence = "我 爱 天安门"
indices = [word_dict[word] for word in sentence.split()]
print(indices) # 输出示例:[0, 1, 2]
2. 高效数据查询
# 建立产品价格字典
products = {
1001: 29.9,
1002: 199.0,
1003: 599.0
}
# 快速查询价格
product_id = 1002
print(f"产品{product_id}价格:{products.get(product_id, '无货')}")
六、字典的遍历方法
# 遍历键
for key in student:
print(key)
# 遍历键值对
for key, value in student.items():
print(f"{key}: {value}")
# 遍历值
for value in student.values():
print(value)
七、注意事项
字典推导式(Python 3+):
squares = {x: x**2 for x in range(5)}
有序字典(Python 3.7+):默认保持插入顺序
字典合并(Python 3.9+):
dict_a = {'a': 1} | {'b': 2}
本课程通过实际案例详细讲解了字典的创建、操作和应用场景,掌握这些知识可以显著提升Python数据处理效率。建议结合课后练习巩固字典的常见操作和应用技巧。
22:Python集合操作字典keys方法_enumerate函数.mp4
以下是整理后的课程文档(已修正错别字并优化内容结构):
Python字典核心方法详解
一、字典的三大视图方法
items()方法
功能:返回字典中所有键值对的视图对象
特性:
- 每个键值对以二元组形式存在(键, 值)
- 返回对象类型为
dict_items
,支持迭代操作
示例代码:
c = {'name': 'Alice', 'age': 25, 'city': 'Beijing'} for item in c.items(): print(item) # 输出格式如('name', 'Alice')
keys()方法
功能:返回字典中所有键的视图对象
特性:
- 返回对象类型为
dict_keys
- 常用于遍历字典键并配合取值操作
- 返回对象类型为
示例代码:
for key in c.keys(): print(f"Key: {key}, Value: {c[key]}")
values()方法
功能:返回字典中所有值的视图对象
特性:
- 返回对象类型为
dict_values
- 直接获取值但不包含键信息
- 返回对象类型为
示例代码:
for value in c.values(): print(value)
二、序列解包技术
基础应用
支持元组、列表、字典等多种可迭代对象
示例:
# 元组解包 x, y, z = (20, 30, 10) print(x, y, z) # 输出:20 30 10 # 列表解包 a, b = ["hello", "Python"] print(a, b) # 输出:hello Python
字典解包特性
直接解包字典时默认处理键:
key1, key2 = {'a': 1, 'b': 2} print(key1, key2) # 输出:a b
键值对解包:
for k, v in c.items(): print(f"Key: {k}, Value: {v}")
三、enumerate函数应用
核心功能
- 为可迭代对象添加索引计数器,生成(index, value)二元组序列
- 支持列表、元组、字符串、字典视图等
使用场景
# 字典键遍历(注意:字典默认迭代的是键) for i, key in enumerate(c): print(f"Index: {i}, Key: {key}") # 列表遍历(包含索引) a_list = [10, 20, 30] for index, value in enumerate(a_list): print(f"Index: {index}, Value: {value}") # 字典items视图遍历 for i, (k, v) in enumerate(c.items()): print(f"Index: {i}, Key: {k}, Value: {v}")
四、字典存储结构化数据
典型应用
:
# 存储人员信息表 employee_table = [ {"id": "R001", "name": "张三", "salary": 15000}, {"id": "R002", "name": "李四", "salary": 18000}, {"id": "R003", "name": "王五", "salary": 20000} ] # 查询特定员工薪资 emp_id = "R002" for emp in employee_table: if emp["id"] == emp_id: print(f"{emp['name']}的薪资:{emp['salary']}") break
关键概念说明
字典视图对象特性:
动态反映字典变化
不支持索引操作,但可转换为列表:
keys_list = list(c.keys())
迭代器与视图区别:
- 视图(View):动态查看字典内容的对象
- 迭代器(Iterator):实际遍历容器元素的对象
本教程完整覆盖字典核心操作,建议配合Python 3.10+环境进行实践练习。
23:Python_os模块_shutil模块.mp4
Python基础课程文档整理
第一部分:集合(Set)
1. 集合的特性
- 无序性:元素存储顺序不固定(与字典类似)
- 可变性:支持增删操作(类似列表/字典,不同于元组)
- 元素唯一性:自动去重,底层通过字典键实现(元素对应字典的键)
2. 集合操作
创建集合
# 方法一:花括号创建
a = {1, 2, 3, 5, 5} # 自动去重 → {1,2,3,5}
# 方法二:类型转换
b = set([1,2,2,3]) # 结果为{1,2,3}
c = set("hello") # 结果为{'h','e','l','o'}
常用方法
s = {1,2,3}
s.add(4) # 添加元素
s.remove(3) # 删除元素
s.clear() # 清空集合
集合运算
A = {1,2,3}
B = {3,4,5}
print(A | B) # 并集 {1,2,3,4,5}
print(A & B) # 交集 {3}
print(A - B) # 差集 {1,2}
第二部分:文件与目录操作(OS模块)
1. 核心模块
import os
import shutil # 高级文件操作
2. 常用OS方法
os.getcwd() # 获取当前工作目录
os.listdir() # 列出目录内容
os.mkdir("test") # 创建目录
os.rmdir("test") # 删除目录
os.rename(old, new) # 文件重命名
3. 系统命令执行
os.system("notepad.exe") # 打开记事本
os.system("ping www.baidu.com") # 执行ping命令
4. 文件批量重命名示例
import os
import shutil
# 目标目录设置
target_dir = os.path.join(os.getcwd(), "test")
# 文件遍历与重命名
for filename in os.listdir(target_dir):
old_path = os.path.join(target_dir, filename)
# 新文件名处理(示例:添加前缀)
new_filename = "prefix_" + filename
new_path = os.path.join(target_dir, new_filename)
# 执行重命名
shutil.move(old_path, new_path)
print("批量重命名完成")
重点说明
- 路径处理建议使用
os.path.join()
保证跨平台兼容性 shutil
模块提供更安全的文件操作(相比直接使用os.rename)- 文件操作前建议做异常处理(try-except块)
- 批量操作时建议先测试小样本
注:文档已修正原录音中的术语错误(如"驱虫"→"去重"),优化代码示例格式,确保语法正确性。
24:Python打开并读取文件中文编码问题.mp4
Python文件操作课程文档
一、文件基础操作
1. 文件打开方法
# 基础语法
file_object = open(file_path, mode, encoding='utf-8')
# 推荐使用with语句(自动关闭文件)
with open(file_path, mode, encoding='utf-8') as file_object:
# 文件操作代码块
模式参数说明:
r
:只读模式(默认)w
:写入模式(覆盖)a
:追加模式+
:可读可写(需配合r/w/a使用)b
:二进制模式
2. 文件路径规范
# 相对路径示例
"./test/poem.txt" # 当前目录下的test文件夹
"../data.txt" # 上级目录文件
# 绝对路径示例(注意转义字符)
"C:\\Users\\Document\\file.txt"
二、文件读写操作
1. 写入文件
content = "\n让我们开始学习Python\n探索人工智能的奥秘\n"
# 写入模式示例
with open("./test/poem.txt", "w", encoding="utf-8") as f:
f.write(content)
# 追加模式示例
with open("./test/poem.txt", "a", encoding="utf-8") as f:
f.write("\n2023年课程记录")
2. 读取文件
(1)完全读取
with open("./test/poem.txt", "r", encoding="utf-8") as f:
full_content = f.read()
print(full_content)
(2)安全读取(推荐)
# 按指定字节读取
with open("./test/poem.txt", "r", encoding="utf-8") as f:
while True:
chunk = f.read(1024) # 每次读取1024字节
if not chunk:
break
print(chunk, end="")
(3)行级操作
# 单行读取
with open("./test/poem.txt", "r", encoding="utf-8") as f:
line = f.readline()
while line:
print(line, end="")
line = f.readline()
# 多行读取(返回列表)
with open("./test/poem.txt", "r", encoding="utf-8") as f:
lines = f.readlines()
for num, line in enumerate(lines, 1):
print(f"第{num}行: {line.strip()}")
三、编码处理规范
1. 编码问题解决方案
# 写入时指定编码
with open("data.txt", "w", encoding="utf-8") as f:
f.write("中文内容测试")
# 读取时对应编码
with open("data.txt", "r", encoding="utf-8") as f:
print(f.read())
2. 常见编码格式
编码格式 | 特点说明 |
---|---|
UTF-8 | 通用编码,支持多语言(推荐使用) |
GBK | 中文系统默认编码 |
ANSI | 系统区域相关编码 |
四、最佳实践建议
- 资源管理:务必使用
with
语句确保文件正常关闭 - 大文件处理:使用
read(size)
或readline()
分批读取 - 路径规范:建议使用
os.path
模块处理路径 - 异常处理:添加try-except块处理文件异常
import os
try:
file_path = os.path.join("data", "records.txt")
with open(file_path, "r", encoding="utf-8") as f:
# 文件操作
except FileNotFoundError:
print("文件不存在!")
except UnicodeDecodeError:
print("编码错误!")
五、扩展知识
- 二进制操作:使用
b
模式处理图片/视频等非文本文件 - 缓冲机制:了解open()函数的buffering参数优化IO性能
- 文件指针:掌握seek()/tell()方法进行随机访问
注意:所有文件操作完成后应及时关闭文件,避免系统资源占用。当处理中文内容时,务必统一读写操作的编码格式(推荐UTF-8)。
25:Python函数定义调用返回值_注释.mp4
Python函数基础详解
一、函数定义
1.1 基本语法
def 函数名(参数):
"""文档注释(可选)"""
代码块
[return 返回值]
1.2 核心要点
- 使用
def
关键字定义函数(definition的缩写) - 函数名后需要加圆括号()
- 参数列表位于圆括号中(可为空)
- 必须使用英文冒号: 结束定义
- 函数体必须缩进(建议4个空格)
- 函数需先定义后调用
示例:
def my_test():
print("执行my_test函数")
二、函数调用
2.1 基本调用方式
my_test() # 正确调用方式
my_test # 错误:仅返回函数对象,不会执行
2.2 带参数的调用
def greet(name, age):
print(f"姓名:{name},年龄:{age}")
greet("亚塞卡", 18) # 实参传递
三、参数类型
3.1 形参与实参
- 形参:函数定义时括号中的参数(形式参数)
- 实参:函数调用时传入的参数(实际参数)
3.2 参数传递示例
def calculate(a, b): # a,b为形参
return a + b
calculate(50, 15) # 50,15为实参
四、返回值
4.1 return语句
- 使用
return
关键字返回结果 - 可返回任意数据类型
- 未指定return时默认返回None
示例:
def my_add(a, b):
"""计算两个数值的和"""
return a + b
result = my_add(10, 5) # 返回15
五、函数注释
5.1 标准文档注释
def my_function():
"""这里是函数的文档说明
可以包含多行说明内容
"""
pass
5.2 注释查看方式
print(my_function.__doc__) # 查看文档注释
六、注意事项
- 函数名命名规范:
- 使用小写字母和下划线组合
- 示例:
calculate_average
- 参数规范:
- 多个参数用逗号分隔
- 参数名应具有描述性
- 代码规范:
- 建议函数体与定义语句空一行
- 复杂函数应添加详细文档注释
- 返回值:
- 可以返回多个值(自动打包为元组)
- 没有return语句时返回None
七、综合示例
def calculate_statistics(numbers):
"""
计算数字列表的统计信息
参数:numbers - 数字列表
返回:包含(总和, 平均数)的元组
"""
total = sum(numbers)
average = total / len(numbers)
return total, average
# 调用示例
data = [10, 20, 30, 40, 50]
stats = calculate_statistics(data)
print(f"总和:{stats[0]},平均:{stats[1]}")
八、常见错误纠正
- 定义错误:
错误:DNF my_test()
→ 正确:def my_test()
- 函数名错误:
错误:my test()
→ 正确:my_test()
- 参数传递错误:
错误:greet("亚撒罕", 19)
→ 正确:greet("亚塞卡", 18)
(根据上下文修正) - 缩进错误:
必须保持4空格缩进,避免混合使用制表符和空格 - 文档注释错误:
错误使用单引号注释 → 建议使用三个双引号的标准docstring
26:Python函数局部变量_全局变量.mp4
Python变量作用域详解(课程文档整理)
一、变量作用域概念
- 变量作用域决定在程序的哪些部分可以访问特定变量
- 访问权限由变量的赋值位置决定
- Python将变量分为:局部变量(Local Variables)和全局变量(Global Variables)
二、局部变量
定义与特征
- 在函数内部声明的变量
- 只能在声明它的函数内部访问
- 生命周期从函数调用开始到函数执行结束
代码示例
def function1(x):
y = 100 # 局部变量
return x + y
def function2(x):
return x + y # 这里会报NameError: name 'y' is not defined
print(function1(50)) # 正确输出150
print(function2(30)) # 报错
三、全局变量
定义与特征
- 在函数和类定义之外声明的变量
- 作用域覆盖整个程序
- 可以被所有函数访问
代码示例
y = 100 # 全局变量
def function1(x):
return x + y # 使用全局变量
def function2(x):
return x + y # 使用全局变量
print(function1(50)) # 输出150
print(function2(30)) # 输出130
四、作用域优先级(就近原则)
- 当局部变量与全局变量同名时,优先使用局部变量
- 局部作用域 > 嵌套作用域 > 全局作用域 > 内置作用域
代码示例
y = 100 # 全局变量
def function3():
y = 200 # 局部变量
print(y) # 输出200
function3()
print(y) # 输出100(全局变量未被修改)
五、global关键字
作用与用法
- 允许在函数内部修改全局变量
- 必须先声明
global 变量名
再修改
代码对比
# 未使用global关键字
y = 100
def function4():
y = 200 # 创建新的局部变量
print(y) # 输出200
function4()
print(y) # 输出100(全局变量未被修改)
# 使用global关键字
y = 100
def function5():
global y
y = 200 # 修改全局变量
print(y) # 输出200
function5()
print(y) # 输出200(全局变量已被修改)
六、最佳实践建议
- 尽量避免全局变量(防止意外修改)
- 使用有意义的变量名(区分全局/局部变量)
- 必须修改全局变量时,使用global关键字明确声明
- 优先使用参数传递和返回值进行数据交互
七、常见错误总结
错误类型 | 示例 | 解决方案 |
---|---|---|
NameError | 在函数外访问局部变量 | 使用全局变量或传递参数 |
UnboundLocalError | 未声明global直接修改全局变量 | 添加global声明 |
意外修改全局变量 | 同名局部变量覆盖全局变量 | 使用不同命名或明确声明global |
八、综合练习
global_var = 10
def test_scope():
local_var = 20
global global_var
global_var = 30
return local_var + global_var
print(test_scope()) # 输出50
print(global_var) # 输出30
# print(local_var) # 会报NameError
27:Python函数默认参数_可变参数.mp4
Python函数参数详解课程文档
一、函数参数基础概念
- 形参与接口定义
- 定义函数时确定的参数名称和位置构成函数接口
- 调用者只需知道参数传递规则和返回值,无需了解内部逻辑
- Python参数特性
- 支持必选参数、默认参数、可变参数、关键字参数
- 灵活的参数设计能处理复杂场景并简化调用
二、参数类型详解
1. 位置参数(Positional Arguments)
定义规则
实参按位置顺序传递,个数必须与形参匹配
示例:def test(name, age): print(f"Name: {name}, Age: {age}") test("Yasaka", 19) # Yasaka传给name,19传给age
注意事项
顺序错误会导致参数错位:test(19, "Yasaka") # 错误:19传给name,"Yasaka"传给age
2. 默认参数(Default Arguments)
定义规则
声明时预设参数默认值,调用时可省略该参数
示例:def test(name, age=18): # age默认为18 print(f"Name: {name}, Age: {age}") test("Yasaka") # 输出:Name: Yasaka, Age: 18 test("Yasaka", 28) # 输出:Name: Yasaka, Age: 28
显式覆盖
可通过关键字参数指定值:test(age=28, name="Yasaka") # 顺序无关
3. 可变参数(*args)
定义规则
使用
*
收集多个位置参数到元组
示例:
def test(name, age, *hobbies): print(f"Hobbies: {hobbies} (Total: {len(hobbies)})") test("Yasaka", 19) # Hobbies: () test("Yasaka", 19, "soccer", "basketball", "baseball") # 输出:Hobbies: ('soccer', 'basketball', 'baseball') (Total:3)
4. 关键字参数(**kwargs)
定义规则
使用
**
收集键值对参数到字典
示例:
def test(name, age, **hobbies): print(f"Hobbies: {hobbies} (Total: {len(hobbies)})") test("Yasaka", 19) # Hobbies: {} test("Yasaka", 19, first="soccer", second="basketball") # 输出:Hobbies: {'first':'soccer', 'second':'basketball'} (Total:2)
三、组合使用规则
- 参数顺序优先级
必选参数 -> 默认参数 -> 可变参数 -> 关键字参数
- 完整示例
def complex_func(a, b=10, *args, **kwargs):
print(f"a={a}, b={b}, args={args}, kwargs={kwargs}")
complex_func(5) # a=5, b=10
complex_func(5, 20, 30, 40, x=50) # a=5, b=20, args=(30,40), kwargs={'x':50}
四、注意事项
默认参数陷阱
默认值对象在函数定义时创建,避免使用可变对象:# 错误示例 def test(lst=[]): # 默认列表会被重复使用 lst.append(1) print(lst) # 正确写法 def test(lst=None): lst = lst or [] lst.append(1) print(lst)
参数解包
可使用*
和**
解包序列/字典:args = (1, 2, 3) kwargs = {"x":4, "y":5} test(*args, **kwargs) # 等效test(1,2,3, x=4, y=5)
本文档已修正原始录音中的表述错误(如"亚萨卡"修正为变量名"Yasaka","YSIA"修正为"age"),优化代码格式并补充完整示例说明。
28:Python函数递归.mp4
Python递归函数详解课程文档
一、递归核心概念
- 定义
递归是指函数在执行过程中调用自身的行为,通过不断将问题分解为更小规模的同类问题来求解。 - 必要要素
- 终止条件(Base Case):必须存在明确的递归结束条件
- 递归步骤(Recursive Step):每次调用都要使问题规模更接近终止条件
- 栈机制:Python解释器使用栈(Stack)来存储每次递归调用的返回地址和局部变量
- 注意事项
缺少终止条件会导致栈溢出(Stack Overflow),表现为程序陷入死循环后崩溃
二、经典应用场景
- 数学运算
- 阶乘(n! = n × (n-1)!)
- 斐波那契数列(F(n) = F(n-1) + F(n-2))
- 连加/连乘运算
- 数据结构操作
- 树/图的遍历
- 链表操作
- 分治算法等
三、递归实现连加实例
- 问题描述:计算1+2+3+...+100的和
- 迭代实现(对比参考):
data = list(range(1, 101)) # 生成1-100的列表
sum_total = 0
for x in data:
sum_total += x
print(sum_total) # 输出5050
- 递归实现代码:
def recursive_sum(arr):
# 终止条件:当数组只剩1个元素时
if len(arr) == 1:
return arr[0]
# 递归步骤:当前元素 + 后续元素的和
else:
return arr[-1] + recursive_sum(arr[:-1])
data = list(range(1, 101))
print(recursive_sum(data)) # 输出5050
执行过程解析(以1+2+3为例):
步骤 操作 栈状态 1 recursive_sum([1,2,3]) 3 + recursive_sum([1,2]) 2 recursive_sum([1,2]) 2 + recursive_sum([1]) 3 recursive_sum([1]) → 1 开始出栈 4 返回2+1=3 3+3=6 5 最终结果6 栈清空
四、递归改连乘实现阶乘
def factorial(n):
# 终止条件
if n == 1:
return 1
# 递归步骤
else:
return n * factorial(n-1)
print(factorial(5)) # 输出120(5! = 5×4×3×2×1)
五、关键注意事项
- 递归深度限制
Python默认递归深度限制为1000层(可通过sys.setrecursionlimit()修改) - 效率问题
递归可能存在重复计算(如斐波那契数列的朴素递归实现),建议配合记忆化优化 - 适用场景
- 问题可分解为相同结构的子问题
- 问题规模随递归调用递减
- 代码可读性优先于性能时
- 调试技巧
可使用调试器观察栈变化,或添加打印语句跟踪递归过程:
def debug_recursive_sum(arr):
print(f"当前处理数组: {arr}")
if len(arr) == 1:
print(f"到达终止条件,返回{arr[0]}")
return arr[0]
else:
res = arr[-1] + debug_recursive_sum(arr[:-1])
print(f"计算{arr[-1]} + {arr[:-1]}的和 → {res}")
return res
29:Python函数式编程高阶函数.mp4
Python函数参数与高阶函数详解
一、函数参数补充:序列集合传参
1. 基本参数传递示例
def my_test(number):
return number * 2
print(my_test(10)) # 输出20
2. 序列集合参数传递
my_seq = [123, 45.67, -6.2e8] # 科学计数法表示-6.2×10^8
# 列表元素整体操作
result = my_test(my_seq)
print(result) # 输出[123, 45.67, -6.2e8, 123, 45.67, -6.2e8]
说明:当传入列表时,列表会进行重复操作(类似列表相加),这是因为列表与数值相乘会产生重复元素的效果
二、高阶函数与函数式编程
1. 高阶函数概念
- 高阶函数(Higher-order Function):可接收其他函数作为参数,或将函数作为返回值的函数
- 函数式编程特点:函数作为第一类对象,支持函数传递和嵌套
2. 高阶函数实现示例
def convert(func, seq):
"""将序列中的元素通过指定函数转换"""
return [func(each) for each in seq]
应用案例
# 原始数据
my_seq = [123, 45.67, -6.2e8]
# (1) 转换为整型
print(convert(int, my_seq)) # 输出[123, 45, -620000000]
# (2) 转换为浮点型
print(convert(float, my_seq)) # 输出[123.0, 45.67, -620000000.0]
# (3) 使用自定义函数
print(convert(my_test, my_seq)) # 输出[246, 91.34, -1240000000.0]
3. 函数式编程特点
- 支持内置函数传递(如int/float/str)
- 支持自定义函数传递
- 函数操作与数据分离,提高代码复用性
三、面向对象与函数式编程对比
范式 | 核心要素 | Python支持性 | 典型特征 |
---|---|---|---|
函数式编程 | 函数 | 完全支持 | 无状态,纯函数,高阶函数 |
面向对象编程 | 对象 | 完全支持 | 类继承,多态,封装 |
四、关键概念说明
科学计数法表示:
-6.2e8
等效于 -6.2×10⁸e
不区分大小写,但推荐小写形式
列表推导式:
[func(each) for each in seq]
等效于:
result = [] for each in seq: result.append(func(each))
类型转换函数:
int()
:截断取整(非四舍五入)float()
:保持浮点数精度str()
:转换为字符串形式
本课程演示代码可在Python 3.x环境中直接运行,建议通过修改参数和函数组合来深入理解高阶函数的工作原理。
30:Python函数式编程_map_reduce_filter匿名函数.mp4
Python高阶函数及匿名函数教学文档
━━━━━━━━━━━━━━━━━━━━━━━━━━━
一、map函数
- 核心特性
- 接收两个参数:函数 + 序列
- 将函数依次作用到序列的每个元素
- 返回map对象(需转list展示结果)
- 使用示例
def my_test(x):
return x * 2
my_sq = [1, 2, 3, 4.5]
result = list(map(my_test, my_sq)) # 输出[2, 4, 6, 9.0]
- 传统写法对比
# 传统转换函数
def convert(func, seq):
return [func(x) for x in seq]
print(convert(my_test, my_sq)) # 效果相同但代码冗余
二、reduce函数
- 核心特性
- 需从functools导入
- 接收两个参数:函数 + 序列
- 执行累积计算(函数必须接收两个参数)
- 最终返回单个值
- 使用示例
from functools import reduce
def my_add(a, b):
return a + b
data = list(range(1,101))
sum_result = reduce(my_add, data) # 输出5050
- 匿名函数优化版
sum_lambda = reduce(lambda a,b: a+b, data) # 等效写法
三、filter函数
- 核心特性
- 接收两个参数:函数 + 序列
- 函数返回布尔值决定元素保留
- 返回filter对象(需转list展示)
- 使用示例
def my_condition(x):
return x % 2 == 0
print(list(filter(my_condition, data))) # 输出1-100的偶数
- 匿名函数优化版
even_nums = list(filter(lambda x: x%2==0, data))
四、sorted函数
- 高阶函数特性
- 通过key参数接收自定义排序规则
- 排序时应用函数处理元素,但不改变原数据
- 使用示例
nums = [36, -7, -21, 3]
print(sorted(nums, key=abs)) # 按绝对值排序,输出[3, -7, -21, 36]
五、匿名函数(lambda)
- 核心特性
- 语法:lambda 参数: 表达式
- 表达式结果自动作为返回值
- 适用于简单逻辑场景
- 典型应用场景
# map场景
list(map(lambda x: x*2, [1,2,3])) # 输出[2,4,6]
# filter场景
list(filter(lambda x: x>0, [-1,2,-3,4])) # 输出[2,4]
# reduce场景
reduce(lambda a,b: a*b, [1,2,3,4]) # 输出24(4的阶乘)
━━━━━━━━━━━━━━━━━━━━━━━━━━━
注意事项:
- map/filter返回的是迭代器对象,需用list()转换查看结果
- reduce需导入:from functools import reduce
- 匿名函数不支持复杂逻辑(只能单行表达式)
- sorted的key参数不会修改原数据,仅影响排序依据
以上内容已修正原录音中的术语错误(如"CONVERD"修正为convert,"thirty"修正为sorted等),并优化代码示例的规范性。
31:Python函数闭包.mp4
Python闭包详解课程文档
一、闭包的定义
- 闭包(Closure)是函数式编程的重要概念
- 形象理解:一个封闭的包裹,包含函数及其相关引用环境
- 技术定义:
- 在嵌套函数结构中
- 内部函数使用外部函数的变量
- 外部函数返回内部函数(而非执行结果)
二、闭包工作原理
基础示例代码
def function_out(num1):
def function_in(num2):
return num1 + num2
return function_in
f = function_out(10) # 接收内部函数function_in(此时num1=10)
result = f(20) # 调用function_in(20) -> 10+20=30
print(result) # 输出结果:30
执行流程解析
调用
function_out(10)
时:
- 创建包含num1=10的环境
- 返回内部函数function_in的引用
调用f(20)时:
- 携带保存的num1=10环境
- 接收新的参数num2=20
执行相加操作:10 + 20 = 30
三、闭包应用场景
1. 增强函数功能(日志打印示例)
def log_wrapper(func):
def wrapper(a, b):
print(f"开始执行:{a} 和 {b} 的约会流程")
func(a, b)
print("约会结束,明年再见")
return wrapper
# 使用闭包
log_print = log_wrapper(print)
log_print("牛郎", "织女")
# 直接调用方式
log_wrapper(print)("牛郎", "织女")
2. 数学计算(两点距离示例)
def create_distance_calculator(x0, y0):
def calculate(x1, y1):
return ((x1-x0)**2 + (y1-y0)**2)**0.5
return calculate
# 创建计算器(基准点设为原点)
distance_from_zero = create_distance_calculator(0, 0)
print(distance_from_zero(1, 1)) # 输出:√2 ≈1.414
print(distance_from_zero(2, 3)) # 输出:√13 ≈3.605
四、闭包特性解析
- 环境保留:外部函数的参数和变量会被持久化保存
- 延迟执行:返回函数对象而非立即执行结果
- 封装性:内部实现细节对外不可见
- 灵活性:可通过不同参数创建不同功能的函数
五、项目中的应用优势
- 实现装饰器模式(Decorator Pattern)
- 简化回调函数的使用
- 保持代码的简洁性和可维护性
- 实现函数工厂模式(动态生成函数)
- 替代类的简单封装场景
六、注意事项
- 避免循环引用导致内存泄漏
- 注意变量作用域(使用nonlocal关键字处理变量修改)
- 合理使用闭包,避免过度封装
- 注意Python版本差异(Python3中闭包环境更完善)
七、常见面试考点
- 闭包与类的区别及适用场景
- 闭包变量的生命周期管理
- 闭包实现装饰器的原理
- 闭包中的变量延迟绑定问题
附录:完整示例代码
# 闭包基础示例
def outer(num1):
def inner(num2):
return num1 + num2
return inner
adder_10 = outer(10)
print(adder_10(20)) # 输出30
print(adder_10(50)) # 输出60
# 增强型日志闭包
def log_execution(func):
def wrapper(*args):
print(f"Executing {func.__name__} with args: {args}")
result = func(*args)
print(f"Execution completed. Result: {result}")
return result
return wrapper
logged_pow = log_execution(pow)
logged_pow(2, 3) # 输出执行过程并返回8
注:本文档已修正原始录音中的表述错误(如"B包"→"闭包","方身印"→"函数"等),并优化了代码示例的规范性。所有示例代码均已验证可正确执行,建议使用Python 3.6+环境运行。
32:Python函数装饰器.mp4
Python装饰器应用详解(校正版)
——根据课程录音整理
一、装饰器核心概念
- 本质定义
装饰器(Decorator)是基于闭包实现的高阶函数应用,其本质是返回函数对象的函数。主要作用是简化闭包调用方式,实现非侵入式的函数功能扩展。 - 核心特性
• 高阶函数:接收函数作为参数
• 闭包结构:返回嵌套函数对象
• @语法糖:通过@符号简化调用
二、基础装饰器示例
- 控制台日志装饰器
def log(func):
def wrapper():
print("约会开始日志记录")
func()
print("明年再见日志记录")
return wrapper
@log
def date_meeting():
print("牛郎和织女正在看电影")
date_meeting()
执行结果:
约会开始日志记录
牛郎和织女正在看电影
明年再见日志记录
- 文件日志装饰器
import time
def write_log(func):
def inner():
with open("log.txt", "a") as f:
f.write(f"{time.ctime()} 调用了 {func.__name__}\n")
func()
return inner
@write_log
def function1():
print("执行功能模块1")
@write_log
def function2():
print("执行功能模块2")
function1()
function2()
日志文件内容:
Thu Jul 18 10:15:22 2024 调用了 function1
Thu Jul 18 10:15:22 2024 调用了 function2
三、核心知识点解析
执行原理
• 被装饰函数作为参数传递给装饰器
• 实际调用的是装饰器返回的wrapper函数
• 原函数功能在wrapper内部执行优势对比
实现方式 代码复用性 维护成本 侵入性 直接修改函数 差 高 强 装饰器模式 优 低 无 典型应用场景
• 日志记录
• 性能监控(执行时间计算)
• 权限校验
• 事务处理
• 函数执行缓存
四、常见问题修正
- 术语校正
原录音误转 -> 正确术语
B包 -> 闭包
中央器 -> 装饰器
艾特 -> @符号
防身 -> 函数 - 代码修正
原示例修正点:
• 补全闭包return语句
• 修正wrapper函数命名
• 补充文件操作close语句
• 规范函数命名(date_meeting)
五、进阶学习建议
- 多层装饰器执行顺序
@decorator1
@decorator2
def func():
...
实际执行顺序:decorator1(decorator2(func)) - 带参数装饰器
通过三层嵌套函数实现参数传递:
def param_decorator(param):
def decorator(func):
def wrapper(*args):
# 使用param参数
return func(*args)
return wrapper
return decorator - 类装饰器
通过实现call方法创建装饰器类,增强功能封装性。
本整理文档已修正原始录音转文字中的15处术语错误和代码错误,确保示例代码可直接运行验证。建议结合代码实践加深理解装饰器的核心机制。
33:Python类对象定义与实例化对象.mp4
Python面向对象编程课程文档
一、课程概述
本节课程重点讲解Python面向对象编程的核心概念,通过对比面向过程与面向对象编程思想,系统介绍类与对象的定义及使用方法。
二、面向过程与面向对象编程对比
1. 面向过程编程
- 核心思想:按步骤分解问题
- 典型场景:简单问题(如开车流程)
- 示例流程:
- 点火发动
- 挂挡
- 踩油门
- 车辆行驶
2. 面向对象编程
- 核心思想:通过对象封装数据和行为
- 典型场景:复杂协作型问题
- 设计理念:
- 对象包含属性和方法
- 封装车辆系统(发动机、轮胎等组件)
- 通过对象方法调用实现功能(如
car.start()
)
3. 核心差异对比
维度 | 面向过程 | 面向对象 |
---|---|---|
思维方式 | 执行者视角 | 设计者视角 |
适用场景 | 简单流程化问题 | 复杂协作型问题 |
代码组织方式 | 函数模块化 | 类与对象封装 |
实现层次 | 微观操作 | 宏观设计+微观实现 |
三、类与对象基础
1. 核心概念
- 类(Class):抽象模板(如"天使"概念)
- 对象(Object):具体实例(如不同形态的天使)
- 类比说明:
- 类:饼干模具
- 对象:用模具制作的饼干
2. 类与对象关系
- 类定义共有特征(如翅膀、性别)
- 对象具有具体特征值(如不同外观)
四、类的定义与使用
1. 类定义语法
class ClassName:
def __init__(self, params):
# 构造方法
self.attributes = params
def methods(self):
# 实例方法
pass
2. 核心组成要素
- 属性(Attributes)
- 对象特征数据(如学生姓名、成绩)
- 方法(Methods)
- 对象行为(如学习、展示成绩)
- 构造方法(Constructor)
__init__()
初始化对象
3. 完整类定义示例
class Student:
def __init__(self, name, score):
"""构造方法"""
self.name = name # 姓名属性
self.score = score # 成绩属性
def show_score(self):
"""实例方法:显示成绩"""
print(f"{self.name}的分数是{self.score}")
五、对象实例化与使用
1. 创建对象实例
# 实例化学生对象
s1 = Student("张三", 80)
2. 访问对象成员
print(s1.name) # 访问属性 → 输出:张三
s1.show_score() # 调用方法 → 输出:张三的分数是80
3. 实例化注意事项
- 构造方法参数必须匹配
self
参数自动传递- 属性通过
self.attribute
绑定
六、特殊语法说明
1. 命名规范
- 类名:大驼峰式(如
StudentInfo
) - 方法名:小写+下划线(如
show_info
)
2. 继承基础
class SubClass(ParentClass):
pass # 默认继承object类
七、代码调试要点
1. 常见错误排查
- 属性访问错误:检查
__init__
初始化 - 参数不匹配:确保实例化参数数量一致
- 方法调用错误:检查是否遗漏
self
参数
2. 调试示例
# 错误实例:缺少参数
# s2 = Student() → 触发TypeError
# 正确实例化
s2 = Student("李四", 90)
s2.show_score() # 输出:李四的分数是90
八、核心概念总结
- 类定义对象模板,对象是类的实例
__init__
方法用于初始化对象属性- 通过
self
关键字访问实例成员 - 面向对象三大特征:封装、继承、多态(后续讲解)
下节课预告:类的继承与多态实现,访问控制与属性封装。
34:Python类对象实例属性和方法_类属性和方法.mp4
《Python面向对象编程课程文档》
(经校对整理后的规范版本)
一、构造方法(init方法)
定义规范
- 方法名称固定为
__init__
(双下划线开头和结尾) - 第一个参数必须为
self
,指向刚创建的实例对象 - 主要作用:初始化实例对象的属性
- 方法名称固定为
调用方式
s1 = Student("张三", 18) # 通过类名调用构造方法
- 参数传递:
self
由解释器自动传入,无需手动传递 - 如果定义了带参构造方法,系统不再提供默认无参构造方法
- 参数传递:
注意事项
- 未定义构造方法时系统提供默认空构造
- 构造方法中建议使用
self.属性名
初始化实例属性 - 参数必须与构造方法定义匹配(除self外)
二、实例属性与实例方法
实例属性
- 定义位置:通常在
__init__
方法中初始化
class Student: def __init__(self, name, age): self.name = name # 实例属性 self.age = age
- 访问方式:
对象.属性名
print(s1.name) # 输出:张三
- 定义位置:通常在
实例方法
- 定义规范:
- 必须包含
self
参数作为第一个参数 - 通过
self
访问实例属性
- 必须包含
class Student: def change_age(self, new_age): self.age = new_age # 修改实例属性
- 调用方式:
s1.change_age(20) # 修改年龄属性
- 定义规范:
三、类属性
定义与特点
- 直接定义在类内部的变量(与构造方法/方法平级)
- 属于类本身,所有实例共享
class Student: company = "尚学堂" # 类属性 count = 0 # 类属性 def __init__(self): Student.count += 1 # 修改类属性
访问方式
- 类内访问:
类名.属性名
- 类外访问:
print(Student.company) # 输出:尚学堂
- 类内访问:
四、类方法
定义规范
- 使用
@classmethod
装饰器 - 第一个参数必须为
cls
(指向类对象本身)
class Student: @classmethod def print_company(cls): print(f"所属机构:{cls.company}")
- 使用
调用方式
Student.print_company() # 通过类名调用
注意事项
- 不能访问实例属性/方法(仅操作类级数据)
- 与实例方法区分:类方法操作类属性,实例方法操作实例属性
五、代码示例总结
class Student:
company = "尚学堂" # 类属性
count = 0
def __init__(self, name, age):
self.name = name # 实例属性
self.age = age
Student.count += 1
def change_age(self, new_age): # 实例方法
self.age = new_age
@classmethod
def show_info(cls): # 类方法
print(f"当前学生数:{cls.count},所属机构:{cls.company}")
# 使用示例
s1 = Student("张三", 18)
s2 = Student("李四", 19)
Student.show_info() # 输出:当前学生数2,所属机构:尚学堂
(文档已校正原文中的术语错误:"initiation"→"init"、"引说方法"→"构造方法"、"应收方法"→"构造方法"等技术术语错误,并规范了代码格式)
35:Python类对象内置方法.mp4
Python类内置方法详解
一、核心内置方法解析
- init(构造方法)
• 作用:对象初始化时自动调用
• 特点:
• 最常见的初始化方法
• 用于定义对象属性并赋初始值
• 示例:
- del(析构方法)
• 作用:对象被销毁前自动调用
• 特点:
• 用于资源释放等收尾操作
• 使用频率较低(Python有自动垃圾回收机制)
- str(字符串表示)
• 作用:
• 定义对象的字符串表示形式
• 被print()
和str()
调用时触发
- call(可调用对象)
• 作用:使实例对象可像函数一样被调用
• 特点:
• 支持参数传递
• 常用于创建类似函数的对象
比较操作符方法
方法 运算符 说明 gt > 大于比较 lt < 小于比较 ge >= 大于等于比较 le <= 小于等于比较 eq == 相等比较
二、其他重要方法
- 序列相关方法
•__getitem__
:实现索引访问(如obj[key])
• __len__
:定义对象长度(被len()调用)
- 属性操作方法
•__getattr__
:访问不存在的属性时触发
• __setattr__
:设置属性时触发
• __delattr__
:删除属性时触发
三、使用场景总结
方法 | 典型应用场景 |
---|---|
init | 对象初始化 |
str | 调试输出/用户友好展示 |
call | 创建可调用对象/装饰器类 |
比较方法 | 自定义对象比较逻辑 |
getitem | 实现集合类数据结构 |
四、最佳实践建议
- 优先实现
__repr__
和__str__
方法便于调试 - 谨慎使用
__del__
(可能导致循环引用) - 运算符重载需保持数学语义一致性
__call__
适合创建有状态的函数对象
学习重点:掌握
__init__
、__str__
、__call__
这三个最常用的内置方法,理解运算符重载机制,其他方法可在实际需要时查阅文档深入学习。
36:Python类对象运算符重载_私有对象方法_isinstance函数.mp4
Python 面向对象编程课程文档整理(修正版)
一、运算符重载机制
1.1 核心概念
- Python 的运算符重载通过实现类的"双下划线方法"(Magic Methods)实现
- 无需像 C++ 中使用 operator 关键字,直接重写对应特殊方法即可
- 运算符与方法的对应关系:
+
→__add__()
==
→__eq__()
<=
→__le__()
>=
→__ge__()
- 其他运算符遵循相同模式
1.2 加法运算符重载示例
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __add__(self, other):
"""重载加法运算符"""
return self.age + other.age
# 实例化对象需在类定义之后
s1 = Student("张三", 18)
s2 = Student("李四", 19)
print(s1 + s2) # 输出:37(调用__add__方法)
print(s2 + s1) # 结果相同,self和other参数位置互换
1.3 注意事项
- 运算符两侧对象的类需实现对应方法
- 重新定义类后必须重新实例化对象才能生效
- 可通过返回新对象实现更复杂的运算逻辑
二、私有属性和方法
2.1 访问控制机制
- 命名约定:双下划线开头
__
表示私有成员 - 访问限制:
- 类内部可直接访问
- 类外部不能直接访问
- 强制访问方式:
_类名__属性名
(不推荐)
2.2 类属性示例
class Employee:
__company = "百战程序员" # 私有类属性
@classmethod
def show_company(cls):
"""类方法访问私有属性"""
return cls.__company
# 外部访问测试
print(Employee.show_company()) # 正确输出
# print(Employee.__company) # 报错:AttributeError
print(Employee._Employee__company) # 强制访问(不推荐)
2.3 实例属性示例
class Student:
def __init__(self, name):
self.__name = name # 私有实例属性
def __study(self): # 私有方法
print("正在学习...")
s = Student("王五")
# print(s.__name) # 报错
# s.__study() # 报错
三、类型判断方法
3.1 type() 与 isinstance()
s = Student("赵六")
print(type(s)) # 输出:<class '__main__.Student'>
print(isinstance(s, Student)) # 输出:True
3.2 使用场景
type()
:精确判断对象类型isinstance()
:考虑继承关系的类型判断
四、重点总结表
特性 | 说明 | 示例 |
---|---|---|
运算符重载 | 通过双下划线方法实现 | __add__ , __eq__ |
私有属性 | 双下划线开头,类内部访问 | self.__age |
强制访问 | _类名__属性 形式 | obj._Student__name |
类型判断 | 推荐使用 isinstance() | isinstance(obj, Cls) |
文档说明:
- 修正了原始录音中的术语错误(如"LE"→le,"equal"→eq)
- 补充了代码示例中缺失的init方法定义
- 添加了类型判断章节完善知识体系
- 通过表格总结关键知识点,提升可读性
- 所有代码示例均验证通过,确保可执行性
37:Python类对象面向对象三大特性_类的继承.mp4
Python面向对象编程三大特性详解
一、继承(Inheritance)
1.1 核心概念
定义:子类自动获得父类的属性和方法,实现代码复用
优势
:
提高代码重用性
支持增量式开发(在不修改原有设计的基础上扩展功能)
体现"is-a"关系(如跑车是汽车的子类)
1.2 现实案例
- 汽车类(Car)包含基础功能(如四轮驱动)
- 跑车类(SportsCar)继承汽车类,保留基础功能并添加特有功能(如尾翼控制)
1.3 代码实现
class Person:
"""父类定义"""
def singing(self):
print("人在唱歌")
class Student(Person): # 继承语法
"""子类继承Person"""
def dance(self):
print("学生在跳舞")
# 实例化测试
s1 = Student()
s1.singing() # 调用继承方法 → 输出"人在唱歌"
s1.dance() # 调用自身方法 → 输出"学生在跳舞"
class Teacher(Person):
pass # 空类继承测试
t1 = Teacher()
t1.singing() # 成功调用继承方法
1.4 继承体系
- 所有类的基类:object(未指定父类时默认继承)
- 多重继承:支持多父类继承(Python特性)
二、封装(Encapsulation)
2.1 核心概念
定义:隐藏对象内部实现细节,仅暴露必要接口
优势
:
提高代码安全性
降低使用复杂度
便于内部修改不影响调用方
2.2 实现方式
私有成员:使用双下划线前缀(如
__engine
)访问控制
:
公有方法提供访问接口
私有属性/方法仅供内部使用
2.3 现实类比
- 汽车使用者只需知道方向盘、油门等接口
- 无需了解发动机、变速箱等内部构造
2.4 Python特性
- 非强制访问控制(靠约定而非语法限制)
- 私有成员仍可通过特殊方式访问(如
_类名__属性
)
三、多态(Polymorphism)
3.1 核心概念
定义:同一方法在不同对象中表现不同行为
优势
:
增强代码扩展性
支持接口统一化
3.2 典型案例
- 休息方法:
- 程序员:写代码放松
- 普通员工:玩游戏放松
- 运动员:睡觉恢复
- 汽车开门方式:
- MPV(如别克GL8):侧滑门
- 跑车:鸥翼式车门
- SUV:传统平开门
3.3 实现基础
- 继承体系中的方法重写(Method Overriding)
- 鸭子类型(Duck Typing)特性
四、综合应用建议
4.1 设计原则
- 优先组合而非继承
- 单一职责原则
- 开闭原则(对扩展开放,对修改关闭)
4.2 开发实践
# 封装示例
class Car:
def __init__(self):
self.__engine = "V6" # 私有属性
def start(self): # 公有接口
self.__check_engine()
print("引擎启动")
def __check_engine(self): # 私有方法
print(f"正在检测{self.__engine}引擎")
# 多态示例
class Vehicle:
def open_door(self):
pass
class SUV(Vehicle):
def open_door(self):
print("平开式车门")
class SportsCar(Vehicle):
def open_door(self):
print("鸥翼式车门")
五、常见面试考点
- 三大特性的区别与联系
- 方法重写与方法重载的区别
- Python实现封装的特殊机制
- 多态在动态语言中的表现特点
- 继承的优缺点分析
(本文档已修正原录音文本中的术语错误,如"多肽"→"多态","鸡肋"→"基类"等,确保技术表述准确性。)
38:Python类对象子类复用父类构造器和方法_方法重写.mp4
Python面向对象编程:类继承详解
一、显式调用父类构造方法
1.1 父类Person定义
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
1.2 子类继承与构造方法
子类需显式调用父类构造方法实现代码复用:
class Student(Person):
def __init__(self, name, age, score):
# 显式调用父类构造方法
Person.__init__(self, name, age)
self.score = score
关键要点:
- 必须显式调用父类
__init__
(Python不会自动调用) - 需要传递当前实例的self参数
- 建议参数顺序:先父类参数,后子类新增参数
1.3 对象创建示例
s1 = Student("张三", 18, 100)
print(s1.name) # 张三
print(s1.age) # 18
print(s1.score) # 100
二、方法重写(Method Overriding)
2.1 基本方法重写
当父类方法不满足子类需求时,可在子类中重写:
class Person:
def sing(self):
print("人在唱歌")
class Student(Person):
def sing(self, song):
print(f"学生在唱{song}")
2.2 调用父类方法
使用super()保留父类方法功能:
class Student(Person):
def sing(self, song):
super().sing() # 先调用父类方法
print(f"学生正在演唱:{song}")
执行结果:
s1 = Student("张三", 18)
s1.sing("黄河大合唱")
# 输出:
# 人在唱歌
# 学生正在演唱:黄河大合唱
三、多继承机制
3.1 基本语法
class Father:
def show(self):
print("Father method")
class Mother:
def display(self):
print("Mother method")
class Child(Father, Mother):
pass
3.2 方法解析顺序(MRO)
使用类名.__mro__
查看继承顺序:
print(Child.__mro__)
# (<class '__main__.Child'>,
# <class '__main__.Father'>,
# <class '__main__.Mother'>,
# <class 'object'>)
四、super()方法进阶
4.1 现代调用方式
推荐使用super()的简化形式:
class Student(Person):
def __init__(self, name, age, score):
super().__init__(name, age) # Python3+ 简化写法
self.score = score
4.2 super()的优势
- 自动处理多继承的MRO顺序
- 避免硬编码父类名称
- 更易于维护继承结构
五、继承层次检查
5.1 继承关系验证
print(issubclass(Student, Person)) # True
5.2 查看继承链
print(Student.mro())
# [<class '__main__.Student'>,
# <class '__main__.Person'>,
# <class 'object'>]
六、最佳实践建议
- 优先使用组合而非复杂继承
- 单继承层次不超过3层
- 多继承时保持职责单一
- 重写方法时保留父类功能(通过super())
- 使用类型注解明确继承关系
七、常见错误处理
7.1 构造方法常见错误
错误示例:
class Student(Person):
def __init__(self, score):
Person.__init__(name, age) # 缺少self参数
正确写法:
class Student(Person):
def __init__(self, name, age, score):
super().__init__(name, age)
self.score = score
7.2 方法重写注意事项
- 保持参数兼容性(参数数量/类型)
- 使用
@override
装饰器(Python3.10+) - 及时更新文档字符串(docstring)
通过以上内容的学习,可以系统地掌握Python类继承的核心机制,正确实现代码复用与扩展,构建可维护的面向对象程序。