我们将列出相关的学习目标,并且对之前的python0基础学习,进行简单的回顾
整体按 Python 3 的主流行为组织,采用高信息密度、逐章递进的方式。每一讲都包含概念原理、关键源码、运行结果、常见陷阱,以及 1~3 道编程题和完整标准答案。
课程不会只停留在语法表面,还会逐步深入对象模型、内存管理、函数调用机制、装饰器、迭代器、生成器、多线程、异步编程等重点。
Python 核心知识体系
| 阶段 | 章节 | 核心内容 |
|---|---|---|
| 基础篇 | 01--04 | 变量与对象、数据类型、运算符、字符串与类型转换 |
| 容器篇 | 05--09 | list、tuple、dict、set、切片、推导式、哈希机制 |
| 函数篇 | 10--14 | 参数传递、可变参数、作用域、LEGB、闭包、lambda |
| 进阶篇 | 15--19 | 装饰器、迭代器、生成器、yield、上下文管理器 |
| 面向对象篇 | 20--25 | 类与实例、继承、多态、MRO、super、魔术方法 |
| 内存机制篇 | 26--29 | 引用计数、垃圾回收、深浅拷贝、可变对象、生命周期 |
| 并发篇 | 30--34 | 进程、线程、GIL、锁、线程池、asyncio、协程 |
| 工程篇 | 35--39 | 模块与包、异常、文件、JSON、类型注解、测试 |
| 高阶篇 | 40--44 | 描述符、元类、数据模型、性能优化、常用设计模式 |
| 综合篇 | 45+ | 高频代码分析、算法实现、工程编程与综合问题 |
章节编号是初始规划,必要时会拆分专题,确保重要知识不被省略。
第 01 讲:Python 变量、对象、数据类型与内存引用
一、Python 变量的本质
先看代码:
a = 10b = aa = 20print(a)print(b)
运行结果:
20
10
为什么修改 a 没有影响 b?
因为 Python 变量更准确地说是绑定到对象的名称,而不是直接存放数据的固定内存盒子。
最初:
a ─────┐
├────> 整数对象 10
b ─────┘
执行 a = 20 后:
a ──────────> 整数对象 20
b ──────────> 整数对象 10
这里发生的是 a 重新绑定,而不是把整数对象 10 修改成 20。
这是理解后续函数传参、列表修改、深浅拷贝和内存管理的基础。
二、Python 的六种常见内置类型
| 类型 | 示例 | 可变性 | 作用 |
|---|---|---|---|
int |
10 |
不可变 | 整数 |
float |
3.14 |
不可变 | 浮点数 |
bool |
True |
不可变 | 布尔值 |
str |
"robot" |
不可变 | 字符串 |
list |
[1, 2, 3] |
可变 | 列表 |
dict |
{"x": 10} |
可变 | 字典 |
另外,tuple(元组)、set(集合)、NoneType 也非常重要,后续会分别展开。
Python 具有两个基本特性:
动态类型:同一个变量名称可以在不同时间绑定不同类型的对象。
x = 10
x = "robot"
x = [1, 2, 3]
强类型:不会为了完成所有运算而自动进行不合理的类型转换。
a = "10"
b = 20
print(a + b)
会抛出:
TypeError
需要显式转换:
print(int(a) + b) # 30
三、== 和 is 有什么区别?
这是两个含义完全不同的运算符。
-
==:比较对象的值是否相等。 -
is:判断两个名称是否引用同一个对象。
例如:
a = [1, 2, 3]
b = [1, 2, 3]
c = a
print(a == b)
print(a is b)
print(a == c)
print(a is c)
输出:
True
False
True
True
用图表示:

特别注意:对于整数和字符串,Python 可能复用某些对象,因此不要依赖 is 比较普通数值。与 None 比较则应使用 is None。
四、可变对象与不可变对象
看看下面这段:
a = [10, 20]b = ab.append(30)print(a)print(b)
运行结果:
[10, 20, 30]
[10, 20, 30]
append() 修改的是列表对象本身,而 a 和 b 引用的是同一对象。
再比较:
a = [10, 20]b = a.copy()b.append(30)print(a)print(b)
输出:
[10, 20]
[10, 20, 30]
.copy() 创建了新的外层列表,但这是浅拷贝。当列表内部还有嵌套的可变对象时,仍然可能相互影响。
五、运算符与容易忽略的规则
a = 17b = 5print(a / b) # 3.4print(a // b) # 3print(a % b) # 2print(a ** b) # 1419857
其中:
| 运算符 | 含义 | 关键特征 |
|---|---|---|
/ |
真除法 | 通常返回 float |
// |
向下取整除法 | 向负无穷方向取整 |
% |
取模 | 余数与向下取整配合 |
** |
幂运算 | 计算乘方 |
特别注意负数:
print(-17 // 5) # -4print(-17 % 5) # 3
因为:
\ -17=(-4)\\times5+3 \\
另一个常见问题是浮点精度:
print(0.1 + 0.2 == 0.3)
结果为 False。
原因在于常见的二进制浮点格式无法精确表示部分十进制小数。对于精确十进制运算,可以使用 decimal.Decimal。
六、布尔值与隐式判断
以下表达式都是 False:
bool(0)bool(0.0)bool("")bool([])bool({})bool(None)
但是:
print(bool("False")) # Trueprint(bool("0")) # True
因为非空字符串通常为真,字符串内容是不是 "False" 并不影响这一规则。
还有一个比较特殊的细节:
print(isinstance(True, int)) # Trueprint(True + 1) # 2
Python 中 bool 是 int 的子类,但在业务代码中依然应该区分布尔逻辑和数字计算。
本讲编程训练
三道题目按基础应用、边界处理、引用机制递增。每题下方均提供可以直接运行的标准实现。
第 1 题:数值转换与格式化输出
要求编写程序,输入机械臂某关节的角度(单位:度),将其转换为弧度并保留四位小数。
公式:
\ \\text{弧度}=\\text{角度}\\times\\frac{\\pi}{180} \\
标准答案
import mathangle = float(input("请输入角度:"))radian = angle * math.pi / 180print(f"角度:{angle:.2f}°")print(f"弧度:{radian:.4f} rad")
输入 90,得到:
角度:90.00°
弧度:1.5708 rad
关键点:input() 返回字符串,float() 负责转换,:.4f 控制输出四位小数,不会改变原变量的数值。
第 2 题:关节角度限幅
要求输入目标角度,并将结果限制在 -180° 到 180° 之间。
例如输入 230 输出 180,输入 -200 输出 -180,输入 45 输出 45。
标准答案
angle = float(input("目标角度:"))lower = -180upper = 180result = max(lower, min(angle, upper))print(f"限幅结果:{result:.1f}°")
关键点:min() 负责限制上界,max() 负责限制下界。这种写法常称为 clamp(限幅)。它只是数值限幅,并不等于完整的机械臂安全控制。
第 3 题:变量引用与列表复制
编写程序,实现以下要求:初始列表是 [0, 0, 0],创建两个新变量,其中一个与原列表共享对象,另一个拥有独立的列表;通过修改元素,验证二者区别。
标准答案
original = [0, 0, 0]a = originalb = original.copy()a[1] = 90b[2] = 45print("original:", original)print("a:", a)print("b:", b)print("a is original:", a is original)print("b is original:", b is original)
运行结果:
original: [0, 90, 0]
a: [0, 90, 0]
b: [0, 0, 45]
a is original: True
b is original: False
这个例子对应了一个非常重要的原理:赋值不会自动复制对象,改变可变对象与重新绑定变量是两件不同的事。
本讲核心知识检查
| 问题 | 结论 |
|---|---|
| Python 变量保存的是什么? | 对对象的引用绑定 |
== 和 is 的区别? |
值相等与对象身份相同 |
| list 和 tuple 的关键区别? | list 可变,tuple 不可变 |
a = b 会创建副本吗? |
不会 |
/ 和 // 的区别? |
真除法与向下取整除法 |
bool("False") 是什么? |
True |
0.1 + 0.2 == 0.3 是什么? |
False |
.copy() 一定能复制所有嵌套对象吗? |
不能,通常是浅拷贝 |