# python_learn **Repository Path**: hzhmcu/python_learn ## Basic Information - **Project Name**: python_learn - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-17 - **Last Updated**: 2026-07-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Python 学习笔记 > 从零开始的 Python 学习之旅 --- ## 一、学习路线总览 | 阶段 | 编号 | 技术点 | 说明 | |------|------|--------|------| | 基础篇 | 01 | Python介绍与环境搭建 | Python简介、安装配置、IDE使用、运行方式 | | 基础篇 | 02 | 变量与数据类型 | 变量命名、整数/浮点/字符串/布尔/None、类型转换 | | 基础篇 | 03 | 运算符 | 算术/比较/逻辑/赋值/位/成员/身份运算符、优先级 | | 基础篇 | 04 | 字符串操作 | 创建、索引切片、常用方法、格式化 | | 基础篇 | 05 | 流程控制 - 条件判断 | if/elif/else、三元表达式、嵌套判断 | | 基础篇 | 06 | 流程控制 - 循环语句 | while、for、range()、break/continue/pass、循环else | | 基础篇 | 07 | 列表 | 创建访问、增删改查、切片、列表推导式、嵌套列表 | | 基础篇 | 08 | 元组与集合 | 元组拆包、namedtuple、集合运算、去重应用 | | 基础篇 | 09 | 字典 | 键值对操作、字典推导式、defaultdict、遍历技巧 | | 基础篇 | 10 | 函数基础 | 定义调用、参数类型、返回值、作用域、文档字符串 | | 基础篇 | 11 | 函数进阶 | 递归、lambda、map/filter/reduce、装饰器入门 | | 基础篇 | 12 | 数字处理与数学运算 | math/random/decimal/fractions、进制转换 | | 进阶篇 | 13 | 文件操作 | 文件读写、上下文管理器、目录操作、pathlib | | 进阶篇 | 14 | 异常处理 | try/except、自定义异常、断言、异常链 | | 进阶篇 | 15 | 面向对象编程 | 类、继承、多态、封装、特殊方法 | | 进阶篇 | 16 | 模块与包 | 模块导入、包管理 pip、虚拟环境 | | 进阶篇 | 17 | 迭代器与生成器 | 可迭代对象、yield、生成器表达式、itertools | | 进阶篇 | 18 | 装饰器 | 闭包、函数装饰器、类装饰器、常用装饰器 | | 进阶篇 | 19 | 上下文管理器 | with语句、__enter__/__exit__、contextlib | | 高级篇 | 20 | 常用标准库(上) | os、sys、datetime、json、re | | 高级篇 | 21 | 常用标准库(下) | math进阶、random、collections、pathlib、itertools、functools | | 高级篇 | 22 | 函数式编程 | map/filter/reduce、偏函数、函数组合 | | 高级篇 | 23 | 并发编程入门 | threading、multiprocessing、asyncio | | 高级篇 | 24 | 网络编程 | socket、HTTP协议、requests库 | | 高级篇 | 25 | 正则表达式进阶 | 元字符、分组、前瞻后顾、re模块详解 | | 高级篇 | 26 | 测试与调试 | unittest、pytest、logging、pdb调试 | | 高级篇 | 27 | 数据库操作 | SQLite、MySQL入门、ORM基础 | | 工具链 | 28 | Git版本控制 | 基本命令、分支管理、远程仓库 | | 工具链 | 29 | 开发工具与规范 | VSCode配置、PEP8、类型注解 | | 实战篇 | 30 | 综合项目实践 | 综合运用所学知识完成项目 | --- ## 二、技术点详细介绍 --- ### 📘 基础篇 #### 01_Python介绍与环境搭建 - **Python简介** - Python的历史与特点(1991年诞生、解释型语言、优雅简洁) - Python之禅:`import this` 查看设计哲学 - Python 2 vs Python 3 的区别与选择 - Python的应用领域(Web开发、数据科学、人工智能、自动化、爬虫等) - **环境搭建** - 从官网(python.org)下载安装Python - 验证安装:`python --version` 和 `pip --version` - pip包管理工具的基本使用 - 配置国内镜像源(清华、阿里云等)加速下载 - **开发工具** - VSCode安装与Python扩展配置 - PyCharm安装与基本使用(社区版免费) - Jupyter Notebook简介与安装 - 在线编程工具(Google Colab等) - **运行Python代码** - 交互式解释器(REPL):直接在终端输入 `python` - 运行.py文件:`python 文件名.py` - 使用VSCode运行代码(快捷键) - 使用Jupyter Notebook运行代码块 - **第一个Python程序** - `print("Hello, World!")` 经典入门 - 代码注释:`#` 单行注释、`'''` / `"""` 多行注释 - 文档字符串 docstring 的概念 - **帮助系统** - `help()` 函数查看帮助 - `dir()` 函数查看对象属性和方法 - **练习** - 安装Python并打印"你好,世界!" - 用多种方式运行同一段代码(REPL、文件、IDE) - 在REPL中执行 `import this` 查看Python之禅 - 使用 `help(print)` 查看print函数的帮助文档 - 用注释写一段自我介绍 --- #### 02_变量与数据类型 - **变量** - 变量的命名规则(字母/下划线开头、区分大小写、不能是关键字) - 动态类型特性(变量可以重新赋值为不同类型) - 多重赋值:`a, b = 1, 2` - 变量交换:`a, b = b, a`(Python特有的优雅写法) - 链式赋值:`a = b = c = 0` - 删除变量:`del` - 变量的内存模型(变量是对象的引用) - 小整数缓存机制(-5到256的整数复用同一对象) - **基本数据类型** - `int` 整数:十进制、二进制`0b`、八进制`0o`、十六进制`0x` - `float` 浮点数:科学计数法、浮点数精度问题(`0.1 + 0.2 != 0.3`) - `str` 字符串:单引号、双引号、三引号 - `bool` 布尔值:`True` / `False`、布尔与整数的关系(True=1, False=0) - `None` 空值:表示"没有值"、None的类型是NoneType - `bytes` 字节串:`b"hello"`、与str的转换 - `complex` 复数:`3+4j`、实部 `.real`、虚部 `.imag` - **类型检查与转换** - `type()` 查看类型 - `isinstance()` 判断类型(推荐使用,支持继承判断) - `int()`、`float()`、`str()`、`bool()`、`complex()` 强制转换 - 隐式类型转换(如整数+浮点数→浮点数) - 转换的常见陷阱(如 `bool("False")` 结果是 True) - **常量** - Python没有真正的常量,用全大写命名约定 - 示例:`PI = 3.14159`、`MAX_SIZE = 100` - **关键字** - Python的保留关键字列表 - `keyword` 模块:`kwlist` 查看所有关键字 - **练习** - 定义不同类型变量并打印 type() 结果 - 练习变量交换(传统方式 vs Python方式) - 练习各种进制转换(十进制转二进制/八进制/十六进制) - 写一个程序:输入两个数字,计算它们的和、差、积、商、整除、取余 - 验证浮点数精度问题:`0.1 + 0.2 == 0.3` 是 True 还是 False? - 创建一个复数并分别打印实部和虚部 - 使用 isinstance 判断不同类型 - 尝试把 "123abc" 转为整数,观察报错 --- #### 03_运算符 - **算术运算符** - `+` 加法、`-` 减法、`*` 乘法、`/` 除法(结果为浮点数) - `//` 整除(向下取整,注意负数:`-3 // 2 = -2`) - `%` 取余(结果的符号与除数相同) - `**` 幂运算(`2 ** 3 = 8`、`9 ** 0.5 = 3.0`) - 算术运算符的优先级规则 - **比较运算符** - `==` 等于、`!=` 不等于、`>` 大于、`<` 小于、`>=` 大于等于、`<=` 小于等于 - 链式比较:`1 < x < 10`(比 `x > 1 and x < 10` 更简洁) - 浮点数比较的陷阱:应使用 `abs(a - b) < 1e-9` 而非 `a == b` - **逻辑运算符** - `and` 与、`or` 或、`not` 非 - 短路求值:`and` 遇到False停止、`or` 遇到True停止 - 逻辑运算符的返回值(不一定是布尔值,返回最后一个计算的操作数) - 实际应用:`value = user_input or "默认值"` - **赋值运算符** - `=` 基本赋值 - 复合赋值:`+=` `-=` `*=` `/=` `//=` `%=` `**=` `&=` `|=` `^=` `<<=` `>>=` - 海象运算符 `:=`(赋值表达式,Python 3.8+):`if (n := len(a)) > 10:` - **位运算符** - `&` 按位与、`|` 按位或、`^` 按位异或 - `~` 按位取反、`<<` 左移(相当于乘以2^n)、`>>` 右移(相当于除以2^n) - 位运算的应用(权限控制、标志位、奇偶判断、颜色值分解) - **成员运算符** - `in`、`not in` 判断是否在序列中 - 应用:`"a" in "abc"`、`3 in [1, 2, 3]`、`"key" in {"key": 1}` - **身份运算符** - `is`、`is not` 判断是否为同一对象(内存地址) - `is` vs `==` 的区别:`is` 比身份,`==` 比值 - 常用场景:`if x is None:` 而非 `if x == None:` - **运算符优先级** - 完整优先级表(从高到低:`**` > `~` > `* / // %` > `+ -` > `>> <<` > `&` > `^` > `|` > 比较 > `not` > `and` > `or`) - 使用括号 `()` 明确优先级(推荐) - **operator模块** - `operator.add`、`operator.sub`、`operator.mul` 等函数式运算 - `operator.itemgetter`、`operator.attrgetter` 用于排序 - **练习** - 计算器:输入两个数,展示所有算术运算结果 - 判断闰年:能被4整除但不能被100整除,或能被400整除 - 判断一个字符是否为元音字母 - 用位运算判断奇偶性 - 用海象运算符重写"输入密码直到正确"的循环 - 链式比较:判断一个数是否在0到100之间 - 用逻辑运算符的短路特性实现"如果列表不为空则取第一个元素" - 验证 `is` 和 `==` 在整数比较上的区别(小整数 vs 大整数) - 使用位运算分解RGB颜色值(如0xFF8800各分量提取) --- #### 04_字符串操作 - **字符串创建** - 单引号 `'...'`、双引号 `"..."`、三引号 `'''...'''` / `"""..."""` - 转义字符:`\n` 换行、`\t` 制表符、`\\` 反斜杠、`\'` 单引号、`\"` 双引号、`\r` 回车 - 原始字符串:`r"C:\path\to\file"` 忽略转义(常用于正则和路径) - 格式化字符串 f-string:`f"hello {name}"` - 字符串拼接:`+` 拼接、`*` 重复 - **字符串索引与切片** - 正索引:从0开始 - 负索引:从-1开始(最后一个字符) - 切片 `[start:stop:step]`:`s[::-1]` 反转字符串 - 字符串不可变性:不能修改已有字符串,只能创建新字符串 - **字符串编码** - ASCII、Unicode、UTF-8 编码概念 - `encode()` 编码:`"你好".encode("utf-8")` - `decode()` 解码:`b'\xe4\xbd\xa0'.decode("utf-8")` - `ord()` 字符转Unicode码点:`ord("中") = 20013` - `chr()` Unicode码点转字符:`chr(65) = "A"` - **字符串常用方法** - 大小写转换:`upper()`、`lower()`、`title()`、`capitalize()`、`swapcase()` - 查找与统计:`find()`(找不到返回-1)、`index()`(找不到抛异常)、`rfind()`、`count()` - 判断方法:`startswith()`、`endswith()`、`isdigit()`、`isalpha()`、`isalnum()`、`isspace()`、`isdecimal()`、`isnumeric()` - 替换与分割:`replace()`、`split()`(返回列表)、`rsplit()`(从右分割)、`splitlines()`(按行分割) - 合并与连接:`join()`(重要!`" ".join(list)` 比 `+` 拼接高效) - 去除空白:`strip()`、`lstrip()`、`rstrip()` - 填充对齐:`center()`、`ljust()`、`rjust()`、`zfill()`(数字补零) - **字符串格式化(三种方式)** - `%` 格式化:`"%s 今年 %d 岁" % ("小明", 18)` - `str.format()` 格式化:`"{} 今年 {} 岁".format("小明", 18)` - f-string(Python 3.6+,推荐):`f"{name} 今年 {age} 岁"` - f-string 表达式:`f"2 + 3 = {2 + 3}"`、`f"小数:{3.14159:.2f}"` - 格式化对齐与精度:`{:<10}` 左对齐、`{:>10}` 右对齐、`{:^10}` 居中、`{:.2f}` 保留两位小数 - f-string 的 `=` 调试(Python 3.8+):`f"{name = }"` - **字符串模板** - `string.Template`:`Template("$name is $age").substitute(name="小明", age=18)` - **文本处理模块** - `textwrap.wrap()` 自动换行 - `textwrap.fill()` 填充文本 - `textwrap.indent()` 添加缩进 - `textwrap.dedent()` 去除缩进 - **字符串常量** - `string.ascii_letters`、`string.ascii_lowercase`、`string.ascii_uppercase` - `string.digits`、`string.hexdigits`、`string.octdigits` - `string.punctuation`、`string.printable`、`string.whitespace` - **练习** - 反转字符串(用切片一行搞定) - 判断回文字符串("上海自来水来自海上") - 统计字符串中字母、数字、空格、其他字符的个数 - 将字符串中的每个单词首字母大写 - 生成随机密码(使用 string 常量和 random 模块) - 格式化输出学生成绩表(用 f-string 对齐) - 编写凯撒密码加密/解密程序 - 判断一个字符串是否由纯数字组成 - 将 "hello_world_python" 转为驼峰命名 "helloWorldPython" - 使用 join 将列表 `["a", "b", "c"]` 拼接为 "a-b-c" - 使用 split 将 "1,2,3,4,5" 按逗号分割为列表 - 使用 encode/decode 进行编码转换 - 用 textwrap 将一段长文本按指定宽度换行输出 --- #### 05_流程控制 - 条件判断 - **if语句基础** - `if` 单分支:只有条件为真时执行 - `if / else` 双分支:二选一 - `if / elif / else` 多分支:多个条件依次判断 - 条件判断的缩进规则(4个空格) - **条件表达式** - 三元运算符:`x if 条件 else y` - 嵌套条件判断(注意可读性) - 三元运算符的链式使用:`a if c1 else b if c2 else c` - **match语句(Python 3.10+)** - 基本语法:`match 值: case 模式:` - 通配模式 `_`(类似default) - 字面量匹配、变量绑定 - 守卫条件:`case 模式 if 条件:` - **布尔逻辑与条件简化** - 真值表与布尔代数基础 - 利用短路求值简化代码 - 用字典替代多个if-elif:`{条件1: 结果1, 条件2: 结果2}.get(值, 默认)` - 德摩根定律简化复杂条件:`not (a and b) == (not a) or (not b)` - **条件判断的最佳实践** - 避免过深的嵌套(超过3层应考虑重构) - 先处理异常/边界情况(卫语句) - 使用 `in` 简化多个or条件:`if x in (1, 2, 3):` - **练习** - 判断一个数是正数、负数还是零 - 判断一个年份是否为闰年 - 成绩等级转换:90以上A、80-89B、70-79C、60-69D、60以下E - 简单的计算器(两个数+运算符,输出结果) - 判断三角形的类型(等边、等腰、直角、普通、不能构成三角形) - 猜数字小游戏(if版本) - 判断一个日期是一年中的第几天(考虑闰年) - 用字典替代if-elif实现星期几的中英文转换 - 模拟自动售货机:选择商品编号,输出价格 - 输入三个数,按从大到小排序输出(仅用if语句) --- #### 06_流程控制 - 循环语句 - **while循环** - 基本while循环:`while 条件:` - while / else 结构(else在循环正常结束时执行,break退出时不执行) - 无限循环:`while True:` 配合内部break退出 - 哨兵循环模式:`while (data := input()) != "退出":` - **for循环** - for遍历字符串、列表、元组、字典(默认遍历key)、集合 - `range()` 函数的三种用法:`range(stop)`、`range(start, stop)`、`range(start, stop, step)` - for / else 结构(else在循环正常结束时执行) - 嵌套循环:外循环执行一次,内循环执行一轮 - 提前终止嵌套循环的方法(标志变量、for-else、封装函数return) - **循环控制** - `break` 跳出整个循环 - `continue` 跳过当前迭代,进入下一次 - `pass` 占位语句(什么都不做) - 三者对比与使用场景 - **enumerate函数** - 同时获取索引和值:`for i, v in enumerate(iterable)` - 指定起始索引:`enumerate(iterable, start=1)` - **zip函数** - 并行遍历多个序列:`for a, b in zip(seq1, seq2):` - zip 的"最短"原则 - `itertools.zip_longest` 以最长为准 - zip 解包:`list(zip(*pairs))` - **列表推导式基础** - 基本形式:`[x**2 for x in range(10)]` - 带条件:`[x for x in range(10) if x % 2 == 0]` - 嵌套循环推导式:`[x*y for x in range(3) for y in range(3)]` - **循环的优化技巧** - 避免在循环中重复计算不变量 - 使用局部变量加速(将方法赋值给局部变量) - 使用推导式替代简单for循环 - **练习** - 打印九九乘法表 - 打印菱形图案(用循环控制空格和星号) - 判断素数(优化:只需检查到平方根) - 求最大公约数和最小公倍数(辗转相除法) - 斐波那契数列前n项 - 水仙花数(三位数,各位立方和等于本身) - 猜数字游戏(带猜测次数限制) - 百钱百鸡问题(公鸡5元、母鸡3元、小鸡1/3元) - 用for循环实现"逢7过"游戏(包含7或7的倍数跳过) - 用while实现交互式菜单(选择1-3执行不同功能,0退出) - 打印杨辉三角前n行 - 使用 enumerate 重写"猜数字"(显示第几次猜测) - 使用 zip 将两个列表合并为字典 --- #### 07_列表 - **列表创建** - `[]` 直接创建:`[1, 2, 3]` - `list()` 构造函数:`list("abc")` → `["a", "b", "c"]` - 列表推导式 `[表达式 for 变量 in 可迭代对象 if 条件]` - 列表的拆分:`*list` 解包 - **索引与切片** - 正索引访问:从0开始 - 负索引访问:从-1开始 - 切片操作 `[start:stop:step]`:`list[1:4]`、`list[::-1]` - 切片赋值:`list[1:3] = [a, b]`(可以改变列表长度) - 删除切片:`list[1:3] = []` - **列表常用方法** - 添加元素:`append()`(末尾添加一个)、`extend()`(末尾添加多个)、`insert()`(指定位置插入) - 删除元素:`remove()`(按值删除第一个)、`pop()`(按索引删除并返回)、`clear()`(清空) - 查找元素:`index()`(返回索引)、`count()`(统计出现次数) - 排序与反转:`sort()`(原地排序)、`reverse()`(原地反转)、`sorted()`(返回新列表)、`reversed()`(返回迭代器) - 复制:`copy()`、`[:]`(都是浅拷贝) - **列表运算** - `+` 拼接:`[1, 2] + [3, 4]` → `[1, 2, 3, 4]` - `*` 重复:`[1, 2] * 3` → `[1, 2, 1, 2, 1, 2]` - `in` / `not in` 成员检查 - `len()` 长度、`max()`、`min()`、`sum()` - **列表作为数据结构** - 栈(Stack):`append()` 入栈、`pop()` 出栈(LIFO) - 队列(Queue):`append()` 入队、`pop(0)` 出队(FIFO,但效率低) - 使用 `collections.deque` 实现高效队列 - **嵌套列表** - 二维列表的创建与访问:`matrix[row][col]` - 矩阵运算基础 - 使用列表推导式创建二维列表 - 嵌套列表的遍历 - **列表的复制** - 浅拷贝 vs 深拷贝 - `copy` 模块的 `copy()` 和 `deepcopy()` - 浅拷贝的陷阱:嵌套列表的修改会影响副本 - **排序进阶** - `sort(key=len)` 按长度排序 - `sort(key=lambda x: x[1])` 按第二个元素排序 - `sort(reverse=True)` 降序 - 稳定性:Python排序是稳定的(相同key保持原顺序) - **列表的性能特点** - 索引访问 O(1) - 末尾添加/删除 O(1)(均摊) - 中间插入/删除 O(n) - 查找 O(n) - **练习** - 列表去重(保持顺序 vs 不保持顺序) - 列表排序(升序/降序、按绝对值排序) - 找出列表中的最大值和最小值 - 计算列表的平均值、中位数、众数 - 合并两个有序列表为一个有序列表 - 使用列表推导式生成平方数列表、偶数列表 - 矩阵转置(二维列表操作) - 约瑟夫环问题 - 用列表实现一个简单的栈(支持push/pop/peek/is_empty) - 列表分组:将 `[1,2,3,4,5,6]` 分成 `[[1,2],[3,4],[5,6]]` - 找出列表中的重复元素 - 两个列表的交集、并集、差集(不用集合) - 将嵌套列表展平为单层列表 --- #### 08_元组与集合 - **元组(tuple)** - 创建元组:`()`、`tuple()`、单元素元组必须加逗号 `(1,)` - 元组的不可变性(不能增删改元素) - 索引与切片操作(与列表相同) - 元组方法:`count()`、`index()` - 元组拼接与重复:`+`、`*` - 元组作为字典键(因为可哈希) - 元组的性能优势(比列表占用更少内存) - **元组拆包** - 基本拆包:`a, b = (1, 2)` - `*` 运算符拆包:`a, *b = (1, 2, 3, 4)`(a=1, b=[2,3,4]) - `*_` 忽略不需要的值:`a, *_ = (1, 2, 3, 4)` - 交换变量:`a, b = b, a`(本质也是元组拆包) - 函数多返回值拆包 - 遍历时拆包:`for x, y in [(1,2), (3,4)]:` - **具名元组** - `collections.namedtuple` 定义 - 通过属性名访问:`point.x`、`point.y` - 具名元组的不可变性 - 适用场景(配置文件、数据库记录) - **集合(set)** - 创建集合:`{}`、`set()` - **空集合必须用 `set()`**(`{}` 是空字典) - 集合的特性:无序、唯一(自动去重)、元素必须可哈希 - 集合推导式:`{x**2 for x in range(10)}` - **集合操作** - 添加元素:`add()` - 删除元素:`remove()`(不存在抛异常)、`discard()`(不存在不抛异常)、`pop()`(随机删除)、`clear()` - 集合运算:交集 `&`(或`.intersection()`)、并集 `|`(或`.union()`)、差集 `-`(或`.difference()`)、对称差集 `^`(或`.symmetric_difference()`) - 集合判断:`issubset()`、`issuperset()`、`isdisjoint()`(是否没有交集) - 原地操作:`update()`、`intersection_update()`、`difference_update()`、`symmetric_difference_update()` - **集合的应用场景** - 列表去重:`list(set(list))` - 快速成员检查(O(1) vs 列表O(n)) - 数据挖掘(共同好友、推荐系统) - 差异比较(两个版本的差异) - **frozenset** - 不可变集合(可哈希,可作为字典键) - 创建:`frozenset([1, 2, 3])` - **练习** - 使用集合去除列表中的重复元素(保持顺序 vs 不保持顺序) - 找出两个列表的共同元素、不同元素、全部元素 - 模拟投票统计(统计每个选项的票数) - 元组拆包练习:交换变量、获取多个返回值、忽略不需要的值 - 使用namedtuple表示坐标点,计算两点之间的距离 - 词频统计(用集合配合字典) - 检查两个字符串是否为变位词(如 "listen" 和 "silent") - 找出两个文件夹的共同文件和差异文件(用集合运算) - 用frozenset作为字典键实现"数组组合→值"的映射 --- #### 09_字典 - **字典创建** - `{}` 直接创建:`{"name": "小明", "age": 18}` - `dict()` 构造函数:`dict(name="小明", age=18)` - 字典推导式 `{k: v for k, v in iterable}` - `dict.fromkeys(keys, value)` 创建默认值字典 - 使用 `zip` 创建字典:`dict(zip(keys, values))` - **字典基本操作** - 访问:`d[key]`(键不存在抛异常)、`d.get(key, default)`(键不存在返回默认值) - 添加/修改:`d[key] = value` - 删除:`del d[key]`、`d.pop(key)`(删除并返回值)、`d.popitem()`(删除最后插入的键值对,Python 3.7+)、`d.clear()` - **字典常用方法** - 视图:`d.keys()`、`d.values()`、`d.items()`(视图动态反映字典变化) - 合并:`d.update(other_dict)` 或 `d |= other_dict`(Python 3.9+) - 合并为新字典:`{**d1, **d2}` 或 `d1 | d2`(Python 3.9+) - 默认值:`d.setdefault(key, default)`(键不存在时设置默认值并返回) - 复制:`d.copy()`(浅拷贝) - **字典遍历** - 遍历键:`for k in d:`(等价于 `for k in d.keys():`) - 遍历值:`for v in d.values():` - 遍历键值对:`for k, v in d.items():` - 遍历时修改字典(注意:不能在遍历时增删字典项,应转为列表遍历) - **字典的键** - 必须是可哈希类型(不可变类型:str、int、tuple、frozenset) - 常见错误:尝试用列表作为字典键 - **高级字典** - `collections.defaultdict`:自动处理缺失键(可指定默认值类型) - `dd = defaultdict(list)` → `dd["a"].append(1)` 不需要先创建空列表 - `dd = defaultdict(int)` → `dd["a"] += 1` 自动初始化为0 - `dd = defaultdict(set)` → 自动初始化为空集合 - `collections.OrderedDict`:有序字典(Python 3.7+ 普通字典也保持插入顺序) - `collections.Counter`:计数器 - `Counter("abracadabra")` 统计字符出现次数 - `most_common(n)` 出现最多的前n个 - 计数器加减运算 - **字典的应用** - 词频统计 - 缓存/记忆化(记忆化递归) - 配置管理 - 数据分组 - 作为switch-case的替代(映射表) - JSON数据的解析与操作 - **练习** - 词频统计:统计一篇文章中每个单词出现的次数,输出前10个最常出现的词 - 电话簿管理:添加、删除、查找联系人,支持模糊搜索 - 学生成绩字典:按姓名查找成绩、计算平均分、按分数排名 - 使用defaultdict统计分类数据(如按首字母对单词分组) - 使用Counter统计序列元素出现次数、求最常出现的元素 - 合并多个字典(用 update、**解包、| 三种方式) - 字典嵌套:创建一个多级菜单的数据结构 - 用字典实现一个简易缓存的斐波那契数列计算 - 将两个列表 `["name", "age", "city"]` 和 `["小明", 18, "北京"]` 转为字典 - 找出字典中值最大的键(如学生成绩最高分对应的人名) --- #### 10_函数基础 - **函数定义与调用** - `def` 关键字定义函数 - 函数命名规范(小写+下划线) - 函数文档字符串(docstring):写在函数体内的第一个字符串 - 函数是一等公民(可赋值给变量、作为参数传递、作为返回值) - 函数调用:`函数名(参数)` - **参数类型** - 位置参数(必填参数):按位置顺序传递 - 默认参数:`def func(a, b=1)` — **注意默认参数的可变对象陷阱**:`def func(lst=[])` 会导致所有调用共享同一个列表,应改为 `def func(lst=None)` - 关键字参数:`func(a=1, b=2)` 按参数名传递,顺序可调换 - 可变位置参数:`*args`(接收任意数量位置参数,打包为元组) - 可变关键字参数:`**kwargs`(接收任意数量关键字参数,打包为字典) - 参数顺序规则:位置参数 → 默认参数 → `*args` → 强制关键字参数 → `**kwargs` - 强制关键字参数(`*` 后的参数必须用关键字传参):`def func(a, *, b):` - 参数解包:`func(*list)`、`func(**dict)` - **返回值** - `return` 语句 - 多个返回值(实质是返回元组):`return a, b` - 返回 `None`(函数没有return语句时默认返回None) - 提前退出函数:`return`(不带返回值) - **作用域(LEGB规则)** - Local(局部作用域):函数内部 - Enclosing(外层函数作用域):嵌套函数的外层函数 - Global(全局作用域):模块顶层 - Built-in(内建作用域):Python内置的名称 - 变量查找顺序:局部 → 外层 → 全局 → 内建 - `global` 关键字:在函数内声明并修改全局变量 - `nonlocal` 关键字:在嵌套函数中声明并修改外层函数的变量 - **函数注解(Type Hints基础)** - 参数类型注解:`def add(x: int, y: int) -> int:` - 注解不影响运行,仅用于文档和类型检查工具 - **练习** - 编写函数计算圆的面积和周长 - 编写函数判断一个数是否为素数 - 编写函数计算阶乘(普通版,非递归) - 编写函数 `sum_all(*args)` 接受任意数量参数并求和 - 编写函数返回多个值(最大值、最小值、平均值) - 编写一个简单的计算器函数(接收两个数和运算符) - 演示默认参数的可变对象陷阱并修正 - 编写一个带参数注解的函数 - 用 global 关键字实现一个计数器函数 - 编写函数接收一个字典的键列表,返回对应的值列表 --- #### 11_函数进阶 - **递归函数** - 递归三要素:终止条件(base case)、递推关系、返回值 - 递归实现阶乘:`factorial(n) = n * factorial(n-1)` - 递归实现斐波那契数列:`fib(n) = fib(n-1) + fib(n-2)` - 递归实现汉诺塔:`hanoi(n, A, B, C)` - 递归实现二分查找 - 递归遍历嵌套数据结构(如嵌套列表、树形结构) - 递归的深度限制:默认1000层,`sys.setrecursionlimit(n)` 可修改 - 递归 vs 循环(递归代码简洁但性能较差,循环性能好但代码复杂) - 记忆化递归(用字典缓存已计算结果,极大提升性能) - **匿名函数 lambda** - lambda语法:`lambda 参数: 表达式` - lambda 只能包含表达式,不能包含语句 - lambda与 `sorted()` 的key参数:`sorted(list, key=lambda x: x[1])` - lambda与 `map()`、`filter()` 结合 - lambda的局限性(不适合复杂逻辑) - **内建高阶函数** - `map(func, iterable)` 映射:对每个元素应用函数 - `filter(func, iterable)` 过滤:筛选使函数返回True的元素 - `sorted(iterable, key=func)` 自定义排序 - `max()` / `min()` 的key参数:`max(list, key=len)` - `functools.reduce(func, iterable)` 累积计算:`reduce(lambda a, b: a * b, [1, 2, 3, 4])` - `all()` / `any()`:检查所有/任意元素是否满足条件 - **列表推导式 vs map/filter** - 列表推导式通常更Pythonic:`[x**2 for x in range(10)]` - map/filter 更适合与lambda配合进行函数式编程 - 性能对比:列表推导式略快 - **装饰器入门** - 什么是装饰器:不修改原函数代码而增强其功能 - 最简单的计时装饰器 - 装饰器的 `@` 语法糖 - 装饰器执行时机:模块导入时(而非调用时) - `functools.wraps` 保留原函数的元信息 - **练习** - 递归:求斐波那契数列第n项(普通版 + 记忆化优化版) - 递归:汉诺塔移动步骤(打印每一步) - 递归:遍历嵌套列表并求和 - 递归:二分查找 - lambda + sorted:按字符串长度排序、按字典值排序 - map:将列表中的数字转为字符串 - filter:筛选出列表中的偶数、回文字符串 - reduce:计算列表的乘积、连接字符串 - 综合:用map/filter/lambda处理学生成绩数据 - 编写一个简单的计时器装饰器 - 编写一个日志装饰器(在函数调用前后打印日志) --- #### 12_数字处理与数学运算 - **数字类型深入** - `int` 整数的进制转换:`bin()`、`oct()`、`hex()`、`int("FF", 16)` - `int` 的位长度:`(255).bit_length()` → 8 - `float` 浮点数精度问题(`0.1 + 0.2 != 0.3`)与解决方案 - `float` 的特殊值:`inf`(无穷大)、`nan`(非数字) - `complex` 复数:`3+4j`、实部 `.real`、虚部 `.imag`、共轭 `.conjugate()` - 数字的哈希值与不可变性 - **math模块** - 常量:`math.pi`(π)、`math.e`(自然常数e)、`math.inf`、`math.nan`、`math.tau`(τ=2π) - 取整函数:`math.ceil()`(向上取整)、`math.floor()`(向下取整)、`math.trunc()`(截断取整)、`round()`(四舍五入、内置函数) - 幂与对数:`math.pow()`、`math.sqrt()`、`math.log()`、`math.log10()`、`math.log2()` - 三角函数:`math.sin()`、`math.cos()`、`math.tan()`、`math.asin()`、`math.acos()`、`math.atan()` - 角度转换:`math.radians()`(角度→弧度)、`math.degrees()`(弧度→角度) - 其他:`math.gcd()`(最大公约数)、`math.lcm()`(最小公倍数,Python 3.9+)、`math.factorial()`、`math.fabs()`(绝对值)、`math.fsum()`(高精度求和)、`math.isclose()`(浮点数比较) - **random模块** - `random.random()` 返回[0.0, 1.0)的随机浮点数 - `random.randint(a, b)` 返回[a, b]的随机整数 - `random.uniform(a, b)` 返回[a, b]的随机浮点数 - `random.choice(seq)` 从序列中随机选择一个元素 - `random.choices(pop, k)` 有放回抽样 - `random.sample(pop, k)` 不重复抽样 - `random.shuffle(list)` 打乱列表顺序(原地操作) - `random.seed(n)` 设置随机种子(相同种子产生相同随机序列,用于可复现) - `random.getrandbits(k)` 生成k位随机整数 - 应用:随机验证码、随机密码、抽奖程序、游戏随机事件 - **statistics模块(Python 3.4+)** - `statistics.mean()` 算术平均数 - `statistics.median()` 中位数 - `statistics.mode()` 众数 - `statistics.stdev()` 标准差 - `statistics.variance()` 方差 - **decimal模块** - `Decimal` 精确十进制数:`Decimal("0.1")` 而非 `Decimal(0.1)` - 解决浮点数精度问题(金融计算必备) - 设置精度:`getcontext().prec = 6` - 取整模式:`ROUND_HALF_UP`、`ROUND_DOWN` 等 - **fractions模块** - `Fraction` 分数:`Fraction(1, 3)`、`Fraction("1/3")` - 分数运算(自动约分) - 分数与十进制互转 - **cmath模块(复数数学)** - `cmath.sqrt()` 复数平方根 - `cmath.phase()` 相位角 - `cmath.polar()` / `cmath.rect()` 极坐标转换 - **练习** - 猜数字游戏(random实现,支持难度选择) - 生成随机验证码(字母+数字,指定长度) - 模拟掷骰子1000次,统计各面出现次数,绘制柱状图 - 计算圆的面积和周长(使用math.pi) - 浮点数精度问题演示与Decimal解决 - 求两个数的最大公约数和最小公倍数 - 随机密码生成器(指定长度、包含大小写字母+数字+特殊字符) - 模拟抽奖程序(从名单中抽取一等奖1人、二等奖2人、三等奖3人) - 计算一组数据的平均值、中位数、众数、标准差 - 使用random.seed() 实现可复现的随机测试数据 - 使用 math.isclose() 比较浮点数 - 分数的加减乘除运算 --- ### 📗 进阶篇 #### 13_文件操作 - **文件打开与关闭** - `open()` 函数 - `close()` 手动关闭 - `with` 上下文管理器自动关闭 - **文件读取** - `read()` 读取全部 - `readline()` 读取一行 - `readlines()` 读取所有行到列表 - 逐行读取的推荐方式(for循环) - **文件写入** - `write()` 写入字符串 - `writelines()` 写入字符串列表 - 追加写入 - **文件模式** - 文本模式:`r` `w` `a` `x` - 二进制模式:`rb` `wb` `ab` - 读写模式:`r+` `w+` `a+` - **文件指针操作** - `tell()` 获取指针位置 - `seek()` 移动指针 - **目录操作(os模块)** - `os.getcwd()`、`os.chdir()` - `os.listdir()`、`os.mkdir()`、`os.makedirs()` - `os.remove()`、`os.rmdir()`、`os.rename()` - **pathlib模块(现代方式)** - `Path` 对象 - `Path.read_text()`、`Path.write_text()` - `Path.iterdir()`、`Path.glob()` - `Path.mkdir()`、`Path.rename()`、`Path.unlink()` --- #### 14_异常处理 - **异常基础** - 什么是异常 - 常见异常类型:`ValueError`、`TypeError`、`IndexError`、`KeyError`、`FileNotFoundError`、`ZeroDivisionError` - **try/except结构** - 捕获单个异常 - 捕获多个异常(元组形式) - 捕获所有异常(`except Exception`) - `as` 获取异常对象 - **完整的异常处理结构** - `try / except / else` - `try / except / finally` - `try / except / else / finally` - **主动抛出异常** - `raise` 语句 - 重新抛出异常 - 自定义异常类 - **断言** - `assert` 语句 - 断言与异常的区别 - **异常链** - `raise ... from ...` - **异常处理最佳实践** - 不要捕获所有异常 - 尽量精确捕获 - 避免空的except块 - 使用finally释放资源 --- #### 15_面向对象编程 - **类与对象基础** - `class` 定义类 - 创建对象(实例化) - `__init__` 构造方法 - `self` 参数的含义 - **属性** - 实例属性 - 类属性 - 私有属性 `__attr`(名称修饰) - `@property` 属性装饰器 - `setter` 与 `deleter` - **方法** - 实例方法 - 类方法 `@classmethod` - 静态方法 `@staticmethod` - 魔术方法(特殊方法) - **继承** - 单继承 - 方法重写(override) - `super()` 调用父类方法 - 多重继承与MRO(方法解析顺序) - **封装** - 访问控制(公有、私有、保护) - 属性封装的意义 - **多态** - 鸭子类型 - 抽象基类 `ABC` - `@abstractmethod` - **特殊方法一览** - `__str__` / `__repr__`:字符串表示 - `__len__`:长度 - `__eq__` / `__lt__` / `__hash__`:比较与哈希 - `__getitem__` / `__setitem__` / `__delitem__`:索引操作 - `__iter__` / `__next__`:迭代器 - `__call__`:可调用对象 - `__enter__` / `__exit__`:上下文管理器 - `__add__` / `__sub__` / `__mul__`:运算符重载 - **类的最佳实践** - 何时使用类 vs 函数 - 类设计原则 - 组合优于继承 --- #### 16_模块与包 - **模块基础** - `import` 导入模块 - `from ... import ...` 导入特定内容 - `import ... as ...` 别名 - `from ... import *`(不推荐) - **模块搜索路径** - `sys.path` - PYTHONPATH环境变量 - **模块的特殊属性** - `__name__` 与 `__main__` - `__file__` - `__all__` - **包(Package)** - 包的目录结构 - `__init__.py` 的作用 - 相对导入 `from . import ...` - 绝对导入 vs 相对导入 - **pip包管理** - `pip install` 安装包 - `pip uninstall` 卸载包 - `pip list` 列出已安装包 - `pip freeze > requirements.txt` - `pip install -r requirements.txt` - 国内镜像源配置 - **虚拟环境** - `venv` 创建虚拟环境 - 激活与退出虚拟环境 - 虚拟环境的作用 - `conda` 环境管理简介 --- #### 17_迭代器与生成器 - **可迭代对象** - `__iter__()` 方法 - 可迭代对象 vs 迭代器 - `for` 循环的工作原理 - **迭代器** - `__iter__()` 与 `__next__()` - `StopIteration` 异常 - 自定义迭代器 - `iter()` 与 `next()` 内建函数 - **生成器** - `yield` 关键字 - 生成器函数 vs 普通函数 - 生成器表达式 `(x for x in iterable)` - 生成器的惰性求值 - 生成器的应用:处理大数据流 - **生成器的高级用法** - `yield from` 委托 - 生成器与协程入门 - `send()`、`throw()`、`close()` 方法 - **itertools模块** - `count`、`cycle`、`repeat` - `chain`、`zip_longest` - `groupby` - `product`、`permutations`、`combinations` --- #### 18_装饰器 - **闭包** - 嵌套函数 - 闭包的定义与作用 - `nonlocal` 关键字 - **函数装饰器** - 装饰器基本结构 - `@` 语法糖 - 被装饰函数的元信息丢失(`functools.wraps`) - **装饰器参数** - 带参数的装饰器(三层嵌套) - 多个装饰器的叠加(执行顺序) - **类装饰器** - `__call__` 实现类装饰器 - **常用装饰器** - 计时装饰器 - 日志装饰器 - 权限验证装饰器 - 重试装饰器 - 缓存装饰器(`functools.lru_cache`) - **Python内置装饰器** - `@property` - `@staticmethod` - `@classmethod` - `@functools.wraps` - `@functools.lru_cache` --- #### 19_上下文管理器 - **with语句** - with语句的基本用法 - 文件操作中的with - **自定义上下文管理器** - 类方式:`__enter__` 与 `__exit__` - `__exit__` 的参数(exc_type, exc_val, exc_tb) - 函数方式:`@contextlib.contextmanager` - `yield` 在上下文管理器中的作用 - **contextlib模块** - `@contextmanager` - `closing()` - `suppress()` - `redirect_stdout()` / `redirect_stderr()` - **上下文管理器的应用场景** - 资源自动释放 - 事务操作 - 临时环境修改 --- ### 📙 高级篇 #### 20_常用标准库(上) - **os模块 — 操作系统接口** - 文件操作:`rename`、`remove`、`listdir` - 目录操作:`mkdir`、`makedirs`、`rmdir`、`chdir`、`getcwd` - 路径操作:`path.join`、`path.exists`、`path.isdir`、`path.isfile`、`path.abspath` - 环境变量:`environ` - 运行系统命令:`system`、`popen` - 获取文件信息:`stat`、`path.getsize`、`path.getmtime` - **sys模块 — Python解释器交互** - `sys.argv` 命令行参数 - `sys.path` 模块搜索路径 - `sys.exit()` 退出程序 - `sys.version` Python版本信息 - `sys.platform` 操作系统平台 - `sys.stdin` / `sys.stdout` / `sys.stderr` - `sys.getrecursionlimit()` / `sys.setrecursionlimit()` - **datetime模块 — 日期时间处理** - `date` 类:年、月、日 - `time` 类:时、分、秒、微秒 - `datetime` 类:日期+时间 - `timedelta` 时间差计算 - 日期格式化 `strftime` / `strptime` - 时区处理 `timezone` - **json模块 — JSON数据处理** - `json.dumps()` Python → JSON字符串 - `json.dump()` Python → JSON文件 - `json.loads()` JSON字符串 → Python - `json.load()` JSON文件 → Python - 中文编码处理 `ensure_ascii=False` - 自定义JSON编码器 - **re模块 — 正则表达式** - `re.match()` 从头匹配 - `re.search()` 搜索匹配 - `re.findall()` 查找所有 - `re.finditer()` 迭代匹配 - `re.sub()` 替换 - `re.split()` 分割 - `re.compile()` 编译正则 --- #### 21_常用标准库(下) - **math模块 — 数学运算** - 常量:`pi`、`e`、`inf`、`nan` - 取整:`ceil`、`floor`、`trunc` - 幂与对数:`pow`、`sqrt`、`log`、`log10` - 三角函数:`sin`、`cos`、`tan` - 其他:`gcd`、`factorial`、`fabs` - **random模块 — 随机数** - `random()` 0-1随机浮点数 - `randint(a, b)` 整数随机 - `uniform(a, b)` 浮点数随机 - `choice(seq)` 随机选择 - `sample(pop, k)` 不重复抽样 - `shuffle(list)` 打乱顺序 - `seed()` 设置随机种子 - **collections模块 — 高级容器** - `namedtuple` 具名元组 - `deque` 双端队列 - `Counter` 计数器 - `defaultdict` 默认值字典 - `OrderedDict` 有序字典 - `ChainMap` 链式映射 - **pathlib模块 — 面向对象路径操作** - `Path` 对象创建 - 路径操作:`/` 拼接、`parent`、`name`、`stem`、`suffix` - 文件操作:`read_text`、`write_text`、`read_bytes`、`write_bytes` - 目录遍历:`iterdir`、`glob`、`rglob` - 文件信息:`stat`、`exists`、`is_file`、`is_dir` - **itertools模块 — 迭代器工具** - 无限迭代器:`count`、`cycle`、`repeat` - 组合迭代器:`product`、`permutations`、`combinations`、`combinations_with_replacement` - 分组与聚合:`chain`、`groupby`、`accumulate` - 筛选:`filterfalse`、`dropwhile`、`takewhile`、`compress` - 拉链:`zip_longest` - **functools模块 — 高阶函数工具** - `partial` 偏函数 - `wraps` 保留元信息 - `lru_cache` 缓存 - `reduce` 累积计算 - `singledispatch` 单分派泛函数 --- #### 22_函数式编程 - **map函数** - `map(func, iterable)` - 多个可迭代对象的map - **filter函数** - `filter(func, iterable)` - 筛选条件的应用 - **reduce函数** - `functools.reduce(func, iterable)` - reduce实现累积运算 - **列表推导式 vs map/filter** - 性能对比 - 可读性对比 - **functools.partial** - 偏函数应用 - 冻结函数参数 - **函数组合** - 自定义compose函数 - 管道模式 --- #### 23_并发编程入门 - **threading多线程** - `Thread` 类创建线程 - 继承Thread类 - 线程同步:`Lock`、`RLock` - 线程间通信:`Queue` - 守护线程 `daemon` - GIL全局解释器锁 - **multiprocessing多进程** - `Process` 类创建进程 - 进程池 `Pool` - 进程间通信:`Queue`、`Pipe` - 进程同步:`Lock`、`Semaphore` - 共享内存:`Value`、`Array` - **asyncio异步编程** - `async` / `await` 语法 - 协程函数与协程对象 - 事件循环 `asyncio.run()` - 创建任务 `asyncio.create_task()` - 并发运行 `asyncio.gather()` - 异步上下文管理器 - 异步迭代器 - aiohttp异步HTTP请求 - **并发模型对比** - 多线程 vs 多进程 vs 异步 - 适用场景分析 --- #### 24_网络编程 - **socket编程基础** - TCP客户端/服务器模型 - UDP通信 - `socket` 模块基本用法 - **HTTP协议基础** - HTTP请求方法(GET、POST等) - HTTP状态码 - 请求头与响应头 - **urllib模块** - `urllib.request` 发送请求 - `urllib.parse` URL解析 - **requests库** - GET / POST请求 - 请求参数与请求头 - 会话与Cookie - 超时与重试 - 文件上传与下载 --- #### 25_正则表达式进阶 - **元字符详解** - `.` `^` `$` `*` `+` `?` `{}` `[]` `\` `|` `()` - **字符类与预定义字符集** - `\d` `\D` `\w` `\W` `\s` `\S` - 自定义字符类 `[abc]` `[a-z]` `[^abc]` - **量词与贪婪模式** - 贪婪匹配 vs 懒惰匹配 `*?` `+?` `??` - **分组与捕获** - 普通分组 `()` - 命名分组 `(?P...)` - 非捕获分组 `(?:...)` - 反向引用 `\1` `(?P=name)` - **前瞻与后顾** - 正向前瞻 `(?=...)` - 负向前瞻 `(?!...)` - 正向后顾 `(?<=...)` - 负向后顾 `(?