T0FV404 / Python语法速记

Created Sun, 07 Dec 2025 16:44:48 +0800 Modified Sun, 07 Dec 2025 20:16:30 +0800
8975 Words

碎碎念

以小甲鱼的视频为主, https://space.bilibili.com/314076440。虽然他讲得不能算很好,但对于当时的我来说已经很好了。

代码风格

暂不考虑

模块

模块导入方式

语法形式 含义 特点 / 风险 记忆示例
import 模块名 导入整个模块 使用时需 模块名.对象,不易冲突 import math; math.sqrt(4)
import 模块名 as 别名 导入模块并起别名 名字更短;便于更换实现 import numpy as np
from 模块名 import 名称 只导入指定对象 直接用对象名,易与本地变量同名 from math import sqrt
from 模块名 import * 导入模块中“公开的全部名称” 极易命名冲突,通常不推荐 from os import *

注意: 导入模块时,其顶层代码会立刻执行一次。

导入包主函数入口

典型控制入口代码(防止被导入时执行脚本逻辑):

if __name__ == "__main__":
    main()      # 仅在当前文件作为脚本执行时运行

当文件被当脚本运行时:__name__ == "__main__"

当文件被当模块导入时:__name__ == "模块名"

包(Package)

定义:包是一个 目录(文件夹),里面包含多个模块文件,用于组织命名空间。

基本用法

语法 含义 示例
import 包名.模块名 导入包中某个模块 import mypkg.utils
from 包名 import 模块名 从包中导入模块对象 from mypkg import utils

__init__.py(包初始化模块)

在包目录下的 __init__.py 文件本身就是 包的模块

  • Python 3.3 之前:存在 __init__.py 才会被识别为包。
  • 常用用途:
    • 初始化包级别的全局变量
    • 统一对外暴露的接口
    • 在导入包时做一次性初始化操作

示例:

# mypkg/__init__.py
version = "1.0"

from .utils import func  # 对外直接提供 mypkg.func

__all__(控制 from 包 import * 的导出内容)

在包或模块中定义 __all__,用于指定 from 包 import * 时能导出的名称:

# mypkg/__init__.py
__all__ = ["utils", "models"]   # 只允许导出这两个子模块

效果:

from mypkg import *
# 只会导入 mypkg.utils 和 mypkg.models

同理,对于单个模块里也可以用 __all__ 限制 import * 时的可见对象。

数据类型

简单类型

字符串

普通字符串

' 或者 " 包裹起来的字符串。

字符串可以通过加法拼接,可以通过乘法复制。

转义字符 描述
\(在行尾时) 续行符(行连接)
\\ 反斜杠字符本身
\' 单引号
\" 双引号
\a 响铃(Bell)
\b 退格(Backspace)
\000 空字符(NUL,八进制写法示例)
\n 换行
\v 纵向制表符(vertical tab)
\t 横向制表符(tab)
\r 回车
\f 换页
\0yy 八进制数,yy 表示的字符。例如:\012 表示换行(前导 0 是字母 o 还是数字 0 要看上下文,这里通常是数字 0)。
\xYY 十六进制数,YY 表示的字符。例如:\x0a 表示换行
\other 其他字符以普通形式输出(\ 后面不是合法转义序列时的情况)

原始字符串

在字符串前面加个 r 字面量为原始字符串, 但如果里面有引号仍然需要转义.不能在输出尾端带有 " \ “, 系统会认为还没结束.

长字符串

用三个双或者单引号可以实现长字符串(真正意义上的原始字符串)

整型

python 由于是把 int 型当作字符存入故而可以有无限大的精度,这点也决定了它的速度注定慢。

另外用整形相除它返回浮点型。

浮点型

python 是以 IEEE754 的标准存储浮点数的, 故而同 C 语言一样会有误差。

支持科学记数法

虚数

可用 x+yj 或者(x+yj)来表示

对虚数对象是用方式 real 可查看实部, imag 是虚部.

布尔类型

函数 bool() 可以判断真假

false 的对象:

None False 0 0.0 0j Decimal(0) Fraction(0,1) '' () [] {} set() range(0)

列表(List)

定义

可变、可包含任意类型、可嵌套。

a = [1,2,3,4,5,6]
# 下面为切片
a[0:3]   # [1,2,3]
a[:3]    # [1,2,3]
a[3:]    # [4,5,6]
a[::-1]  # 反转

[1,2,3] + [4,5]  # 拼接
[1,2,3] * 2      # [1,2,3,1,2,3]

方法

方法 说明
x.append(obj) 末尾追加一个元素
x.extend(iterable) 末尾追加多个元素
x.insert(i, obj) 在下标 i 插入元素
x.remove(obj) 删除首个等于 obj 的元素
del x[i] / del x[i:j:k] 删除指定下标/切片
x.pop(i=-1) 弹出并返回指定(默认末尾)元素
x.clear() 清空列表
x.sort(key=None, reverse=False) 就地排序
x.reverse() 就地反转
x.count(obj) 统计元素出现次数
x.index(obj, start=0, end=...) 查找首个下标,不存在抛异常
x.copy() 浅拷贝

列表拷贝与二维列表初始化

# 推荐
A = [[0] * 3 for _ in range(3)]

# 不推荐:三行引用同一子列表,这是浅拷贝,等于复制指针
A = [[0] * 3] * 3

列表推导式

[expr for item in iterable]
[expr for item in iterable if cond]
[expr for i in A for j in B if cond]

元组(Tuple)

特性与创建

元组与列表的差别是不支持修改,故而它只用查的功能,其余差别不大。

可包含可变对象(如列表);修改的是内部对象。

t = (1, 2, 3)
t = 1, 2, 3          # 省略括号
single = (12,)       # 单元素元组

字符串(String)

基本特性与切片

  • 不可变序列。
s[::-1]   # 反转,可用于回文判断

大小写转换

方法 说明
s.capitalize() 首字母大写,其余小写
s.casefold() 更强的小写化(多语言)
s.title() 每个单词首字母大写
s.swapcase() 大小写反转
s.upper() 全大写
s.lower() 全小写(主要英文)

对齐与填充

方法 说明
s.center(width, fill=' ') 居中
s.ljust(width, fill=' ') 左对齐
s.rjust(width, fill=' ') 右对齐
s.zfill(width) 左侧补 0,保留正负号

查找与替换

方法 说明
s.count(sub, start=0, end=...) 统计子串出现次数
s.find(sub, start=0, end=...) 左到右第一个位置,找不到 -1
s.rfind(sub, start=0, end=...) 右到左第一个位置,找不到 -1
s.expandtabs(tabsize=8) \t 转为空格
s.replace(old, new, count=-1) 替换子串
s.translate(table) + str.maketrans 按映射表替换 / 删除字符

判断类方法

方法/函数 说明
s.startswith(prefix) 是否以 prefix 开头(可传元组)
s.endswith(suffix) 是否以 suffix 结尾(可传元组)
s.istitle() 是否标题格式
s.isupper() / s.islower() 是否全大写 / 全小写
s.isalpha() 是否只包含字母
s.isspace() 是否全空白字符
s.isprintable() 是否全为可打印字符
s.isdecimal() 十进制数字
s.isdigit() 数字(含上标等)
s.isnumeric() 数字(范围最大)
s.isalnum() 字母或数字
s.isidentifier() 合法标识符
keyword.iskeyword(s) 是否 Python 关键字

去除两端 / 前后缀

方法 说明
s.lstrip(chars=None) 去左侧匹配 chars 中任一字符
s.rstrip(chars=None) 去右侧
s.strip(chars=None) 去左右两侧
s.removeprefix(prefix) 删除前缀(3.9+)
s.removesuffix(suffix) 删除后缀(3.9+)

分割与拼接

方法 说明
s.partition(sep) / s.rpartition (head, sep, tail)
s.split(sep=None, maxsplit=-1) 从左分割为列表
s.rsplit(sep=None, maxsplit=-1) 从右分割为列表
s.splitlines(keepends=False) 按各种换行符分割
'sep'.join(iterable) 用分隔符拼接字符串序列

格式化字符串(format / f-string)

str.format

"1+2={}".format(1+2)
"{1}看到{0}".format("小甲鱼", "小姐姐")
"{name}{fav}".format(name="甲鱼", fav="Python")
"{:.2f}".format(3.1415)

f-string(推荐,3.6+):

x = -520
f"{x:010}"          # -000000520
f"{3.1415:.2f}"     # 3.14

常用格式字段:

部分 说明
[[fill]align] <>^ 居中 = 符号后对齐
sign + 显示正负号,- 仅负号,空格为正数留空
0 数字前补 0,如 {:010d}
width 总宽度
, / _ 千分位分隔
.precision 小数位数或有效位数
type b o d x X e E f g % c n
# 显示进制前缀(如 0b, 0x

字典(Dict)

创建与基本用法

d = {"1": "x", "2": "y"}
d["3"] = "z"
d = dict(a=1, b=2)
d = dict([("a", 1), ("b", 2)])
d = dict(zip(keys, values))

增删改查方法表

操作/方法 说明
dict.fromkeys(iterable, value) 用同一默认值批量生成键
d[key] 取值,键不存在抛 KeyError
d.get(key, default=None) 取值,不存在返回 default
d.setdefault(key, default=None) 若无此键则添加并返回 default,否则返回原值
d.update(other) 批量更新 / 合并
d.pop(key, default=...) 删除并返回值
d.popitem() 删除并返回最后插入项(3.7+ 有序)
del d[key] 删除键
d.clear() 清空
d.copy() 浅拷贝

视图与遍历

方法 说明
d.keys() 键视图,随字典更新
d.values() 值视图
d.items() (key, value) 视图
for k, v in d.items(): ...
len(d)
key in d
list(d)        # 所有 key

字典推导式

{k: v for k, v in d.items()}
{v: k for k, v in d.items()}
{x: ord(x) for x in "FishC"}

集合(Set)

特性与用途

  • 无序、不重复;不支持索引。
  • 去重示例:
len(s) == len(set(s))   # 是否有重复

集合常用方法与运算

方法 / 运算 说明
set(iterable) 创建集合
s.add(elem) 添加元素
s.remove(elem) 删除元素,不存在抛异常
s.discard(elem) 删除元素,不存在也不报错
s.clear() 清空
s.isdisjoint(t) 是否无交集
s.issubset(t) / s <= t 是否子集
s.issuperset(t) / s >= t 是否超集
s.union(t) / `s t`
s.intersection(t) / s & t 交集
s.difference(t) / s - t 差集
s.symmetric_difference(t) / s ^ t 对称差集

序列与迭代

序列解包与星号解包

t = (1, 2, 3)
x, y, z = t          # 完全解包,数量必须一致
x, *y = t            # x = 1, y = [2, 3],星号收集多余元素

拷贝与增量运算

  • 列表:[0]*3 复制元素引用;[[0]*3]*3 三行指向同一子列表。
  • 元组:(1,2,3)*2 得到新元组,id 不同。

浅拷贝 / 深拷贝:

y = x[:]            # 浅拷贝
y = x.copy()        # 浅拷贝
import copy
y = copy.deepcopy(x)  # 深拷贝

del 与切片删除

x = [1, 2, 3, 4, 5]
del x[1:4]       # [1, 5]
x[1:4] = []      # 同样效果
del x[::2]       # 可按步长删除

迭代器与可迭代对象

  • 可迭代:list/tuple/str/dict/set/range 等,可用于 for
  • 迭代器:实现 __iter____next__;一次性消耗。
it = iter(obj)   # 可迭代 -> 迭代器
next(it)         # 依次取值,耗尽抛 StopIteration

序列通用函数速查表:

函数 / 类型转换 说明
list(x) / tuple(x) / str(x) 可迭代对象互转
max(...) / min(...) 多个参数或单个序列;支持 default=
len(x) 元素个数
sum(iterable, start=0) start 开始累加
sorted(iterable, key=None, reverse=False) 返回新列表
reversed(seq) 反向迭代器(原对象需支持反向)
all(iterable) 所有元素为真则 True
any(iterable) 至少一个元素为真则 True
enumerate(iterable, start=0) (index, value) 迭代器
zip(*iterables) 聚合为元组序列,按最短序列截断
itertools.zip_longest 类似 zip,可用 fillvalue 补齐
map(func, *iterables) 逐元素映射,按最短序列长度
filter(func, iterable) 保留 func(x) 为真值的元素

运算符

以下假设变量: a = 10,b = 20

算术运算符

运算符 描述 实例
+ 加 - 两个对象相加 a + b 输出结果 30
- 减 - 得到负数或是一个数减去另一个数 a - b 输出结果 -10
* 乘 - 两个数相乘或是返回一个被重复若干次的字符串 a * b 输出结果 200
/ 除 - x 除以 y b / a 输出结果 2.0
% 取模 - 返回除法的余数 b % a 输出结果 0
** 幂 - 返回 x 的 y 次幂 a** b 为 10 的 20 次方, 输出结果 100000000000000000000
// 取整除 - 返回商的整数部分(向下取整 >>> 9//2 4 >>> -9//2 -5

一些算术函数:

  • divmod(x, y) 返回 x//y 和 x%y 的余数
  • abs(x) 取绝对值, 还有虚数的模长
  • pow(x, y, z) 有个功能, 就是加上第三个参数, 可以让结果与第三个参数取余
  • int() 转化为整数, 截断小数
  • float 转化为浮点数
  • complex("x+yj") 转化为虚数, 字符串中间不能有空格

比较运算符

运算符 描述 实例
== 等于 - 比较对象是否相等 (a == b) 返回 False。
!= 不等于 - 比较两个对象是否不相等 (a != b) 返回 True。
<> 不等于 - 比较两个对象是否不相等。python3 已废弃。 (a <> b) 返回 True。这个运算符类似 != 。
> 大于 - 返回 x 是否大于 y (a > b) 返回 False。
< 小于 - 返回 x 是否小于 y。所有比较运算符返回 1 表示真,返回 0 表示假。这分别与特殊的变量 True 和 False 等价。 (a < b) 返回 True。
>= 大于等于 - 返回 x 是否大于等于 y。 (a >= b) 返回 False。
<= 小于等于 - 返回 x 是否小于等于 y。 (a <= b) 返回 True。

赋值运算符

运算符 描述 实例
= 简单的赋值运算符 (可以令 x, y = y, x 实现替换) c = a + b 将 a + b 的运算结果赋值为 c
+= 加法赋值运算符 c += a 等效于 c = c + a
-= 减法赋值运算符 c -= a 等效于 c = c - a
*= 乘法赋值运算符 c * = a 等效于 c = c * a
/= 除法赋值运算符 c /= a 等效于 c = c / a
%= 取模赋值运算符 c %= a 等效于 c = c % a
**= 幂赋值运算符 c ** = a 等效于 c = c ** a
//= 取整除赋值运算符 c //= a 等效于 c = c // a

位运算符

运算符 描述 实例
& 按位与运算符:参与运算的两个值, 如果两个相应位都为 1, 则该位的结果为 1, 否则为 0 (a & b) 输出结果 12 ,二进制解释: 0000 1100
| 按位或运算符:只要对应的二个二进位有一个为 1 时,结果位就为 1。 (a| b) 输出结果 61 ,二进制解释: 0011 1101
^ 按位异或运算符:当两对应的二进位相异时,结果为 1 (a ^ b) 输出结果 49 ,二进制解释: 0011 0001
~ 按位取反运算符:将二进制表示中的每一位取反,0 变为 1,1 变为 0。~x 类似于 -x-1 (~a ) 输出结果 -61 ,二进制解释: 1100 0011 (以补码形式表示),在一个有符号二进制数的补码形式。
« 左移动运算符:运算数的各二进位全部左移若干位,由 « 右边的数字指定了移动的位数,高位丢弃,低位补 0。 a « 2 输出结果 240 ,二进制解释: 1111 0000
» 右移动运算符:把 “»” 左边的运算数的各二进位全部右移若干位,» 右边的数字指定了移动的位数 a » 2 输出结果 15 ,二进制解释: 0000 1111

逻辑运算符

运算符 逻辑表达式 描述 实例
and x and y 布尔 “与” - 如果 x 为 False,x and y 返回 False,否则它返回 y 的计算值。 (a and b) 返回 20。
or x or y 布尔 “或” - 如果 x 是非 0,它返回 x 的计算值,否则它返回 y 的计算值。 (a or b) 返回 10。
not not x 布尔 “非” - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。 not(a and b) 返回 False

注意: 返回值不像 C 语言, 而是有可能返回数值本身.它也是短路逻辑.

成员运算符

除了以上的一些运算符之外,Python 还支持成员运算符,测试实例中包含了一系列的成员,包括字符串,列表或元组。

运算符 描述 实例
in 如果在指定的序列中找到值返回 True,否则返回 False。 x 在 y 序列中 , 如果 x 在 y 序列中返回 True。
not in 如果在指定的序列中没有找到值返回 True,否则返回 False。 x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。

身份运算符

身份运算符用于比较两个对象的存储单元

运算符 描述 实例
is is 是判断两个标识符是不是引用自一个对象 x is y, 类似 id(x) == id(y) , 如果引用的是同一个对象则返回 True,否则返回 False
is not is not 是判断两个标识符是不是引用自不同对象 x is not y , 类似 id(a) != id(b)。如果引用的不是同一个对象则返回结果 True,否则返回 False。

注: id() 函数用于获取对象内存地址。

运算符优先级

以下表格列出了从最高到最低优先级的所有运算符:

运算符 描述
** 指数 (最高优先级)
~ + - 按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@)
* / % // 乘,除,取模和取整除
+ - 加法减法
» « 右移,左移运算符
& 位 ‘AND’
^| 位运算符
<= < > >= 比较运算符
<> == != 等于运算符
= %= /= //= -= += *= **= 赋值运算符
is is not 身份运算符
in not in 成员运算符
not and or 逻辑运算符

控制流

if-else

if 条件:
    语句1
    语句2
elif:
    语句3
else:
    语句4
level = ('D'if 0<=score <60 else
        'C' if 60 <= score <80 else
        "sdfjkslfjs")
等同于 
if 0<=score <60:
    level='D'
elif 60 <= score < 80:
    level='C'
else:
    level="sdfjkslfjs"
// 但是没啥用,因为明显不好看,而且也没省多少力.

循环

while 条件:
    break //打破循环可使用break
    continue //跳过本次循环回到循环头
else:
    语句1 //这里else看起来没什么用,但是如果break跳出,如果条件仍为真,那么就不会执行else.这个就可以检测break有无被启用.
for 变量 in 可迭代对象:
// 这里需要说明一个函数:range(start,stop,step) (start默认为0,stop不包含,step可以为负数,只不过开头和结尾要倒序了)

函数

定义

def function(args):
	pass # pass 语句用于占位(空函数)
	return 1,2 # 若返回多个值,Python 自动将其打包为 **元组 (Tuple)**。

参数机制

参数类型表

参数类型 语法示例 说明 备注
位置参数 func(a, b) 按顺序位置对应传参 必须放在关键字参数之前。
关键字参数 func(k=v) 指定形参名进行传参 顺序可打乱,提高代码可读性。
默认参数 def f(a=1) 定义时赋初值 定义规则:必须位于非默认参数(位置参数)之后。若不传则使用默认值。
可变位置参数 def f(*args) 形参前加 * 打包:收集多余的位置实参为 元组
可变关键字参数 def f(**kwargs) 形参前加 ** 打包:收集多余的关键字实参为 字典

参数解包与分隔符

  • 解包 (Unpacking):在 实参 中使用 *(列表/元组)或 **(字典),将集合拆解为独立的参数传入函数。
  • 限定符 (特殊形参)
    • /:左侧仅限位置参数。
    • *:右侧仅限关键字参数。
    • 示例:def f(pos_only, /, standard, *, kw_only):
  • 传参约束
    • 位置参数必须在关键字参数之前。
    • 不能对同一个形参多次赋值。

作用域与命名空间

LEGB 规则

Python 查找变量的顺序遵循 LEGB 原则:

  • L (Local):本地作用域(函数内部)。
  • E (Enclosed):嵌套函数的外层函数作用域(闭包)。
  • G (Global):全局作用域(模块级别)。
  • B (Built-in):内置作用域(如 print, sum 等)。

作用域关键字

  • global:在局部作用域中声明并修改全局变量。
  • nonlocal:在嵌套函数中声明并修改外层(非全局)变量,常用于闭包。

闭包 (Closure)

核心:函数 + 环境变量。即使外层函数结束,内部函数依然能访问外层的局部变量。

def make_power(exponent):
    """ 外层函数:决定次方数(环境) """
    
    def power(base):
        """ 内层函数:使用外层的 exponent """
        return base ** exponent  # 引用了外部变量
    
    return power  # 返回函数对象,而非结果

# --- 调用示例 ---
square = make_power(2)  # 创建一个计算平方的闭包,记住了 exponent = 2
cube = make_power(3)    # 创建一个计算立方的闭包,记住了 exponent = 3

print(square(5))  # 输出: 25 (5^2)
print(cube(5))    # 输出: 125 (5^3)

# 进阶:使用 nonlocal 修改外部变量(带记忆功能的计数器)
def counter():
    count = 0
    def inc():
        nonlocal count  # 声明使用外层变量
        count += 1
        return count
    return inc

c = counter()
print(c(), c())  # 输出: 1 2

装饰器 (Decorator)

核心:不修改原代码,动态增加功能

无参装饰器 (两层嵌套)

def logger(func):
    """ 接收目标函数 func """
    def wrapper(*args, **kwargs):
        print(f"[日志] 正在执行: {func.__name__}")
        result = func(*args, **kwargs)  # 执行原函数
        print("[日志] 执行完毕")
        return result
    return wrapper  # 返回包装后的函数

# --- 语法糖写法 ---
@logger
def add(x, y):
    return x + y

# 等同于: add = logger(add)

add(1, 2)
# 输出:
# [日志] 正在执行: add
# [日志] 执行完毕

带参装饰器 (三层嵌套)

def repeat(n):
    """ 第一层:接收装饰器的参数 """
    def decorator(func):
        """ 第二层:接收目标函数 """
        def wrapper(*args, **kwargs):
            """ 第三层:执行逻辑 """
            for _ in range(n):
                func(*args, **kwargs)
        return wrapper
    return decorator

# --- 调用示例 ---
@repeat(3)  # 先执行 repeat(3) 返回 decorator,再 @decorator
def say_hi():
    print("Hi~")

say_hi()
# 输出: (打印三次 Hi~)

匿名函数 (Lambda)

lambda arguments: expression
# 语法: lambda 参数: 表达式 (自动 return)

生成器 (Generator)

  • 定义:使用 yield 语句代替 return 的函数。
  • 机制:保存执行状态(挂起),每次调用 next() 或迭代时从上次暂停处继续执行。
  • 表达式(x for x in data)(将列表推导式的方括号换为圆括号)。
  • 优势:惰性求值,节省内存。

函数式编程工具

  • 高阶函数:以函数为参数或返回值的函数。
  • functools 模块
    • reduce(func, iterable):累积计算。将函数作用于序列的前两个元素,结果与下一个元素继续作用,直至结束。
    • partial(func, ...):偏函数。固定函数的部分参数,生成一个新的可调用对象(类似闭包原理)。

工程化规范

  • 文档字符串 (Docstring):函数体内首行使用三引号 """...""" 定义,用于说明函数功能,可通过 help().__doc__ 查看。
  • 函数注解 (Type Hints)
    • 语法:def func(arg: type, arg2: type = default) -> return_type:
    • 内省:仅作提示,不强制类型检查,解释器运行时忽略。可通过 .__annotations__ 查看。

异常

try:
    xxxxx #检测
except (error1,error2,error3) as e:#如果有相应 error 就执行, 一个 error 就不用元组形式, 可以不写直接识别全部, as e 是指相应的 error 描述结果输出到 e 中
    pass
except error4:
    pass
else:
    pass #这里是没触发异常回调到的地方
finally:
    无论有没有异常都会触发,必须经过的一环

由于您提供的文本内容完全是关于 “类与对象” (Class & Object) 的(包含继承、多态、魔术方法等),而标题要求为“函数”可能是复制粘贴上一个指令时的笔误。为了确保文档的准确性和可用性,我将标题修正为 类与对象,并按照您的格式要求进行整理。

类与对象

基础定义与实例化

类 (Class) 是对象的蓝图,对象 (Object) 是类的实例化。属性默认存储在 __dict__ 字典中。

class ClassName:
    class_attr = 1  # 类属性(所有实例共享,除非被实例属性覆盖)

    # self: 实例自身的引用,必须作为方法的第一个参数
    def method(self):
        print(self.class_attr)

# 实例化
obj = ClassName()
obj.instance_attr = 2  # 动态绑定实例属性
# obj.__dict__  >> {'instance_attr': 2}

面向对象特性

特性 说明 抽象示例
封装 将数据和操作捆绑,隐藏内部实现细节。 class A: pass (基础结构)
继承 子类自动获取父类的属性和方法。支持多重继承。 class B(A): pass
组合 在一个类中实例化另一个类,建立依赖关系。 self.obj = OtherClass()
多态 不同类的对象对同一消息做出响应(同名方法,不同实现)。 obj.say() (具体行为取决于 obj 是猫还是狗)

代码示例:继承与组合

# --- 继承 (Is-a 关系) ---
class Father:
    def hello(self): print("Father")

class Son(Father):  # 子类
    def hello(self): print("Son") # 重写 (Override)

# --- 组合 (Has-a 关系) ---
class Dog:
    def bark(self): print("汪")

class Garden:
    def __init__(self):
        self.d = Dog()  # 组合:花园里有狗
    def noise(self):
        self.d.bark()   # 委托调用

继承进阶:MRO 与 钻石继承

钻石继承 (Diamond Inheritance):多个子类继承同一个父类,而这些子类又被同一个孙类继承。 MRO (Method Resolution Order):方法解析顺序,Python 使用 C3 算法(广度优先策略)解决调用冲突。

  • 查看顺序ClassName.__mro__
  • Super 函数super() 按照 MRO 顺序调用下一个父类,避免父类被重复初始化,并解决多重继承问题。
class Base:
    def __init__(self): print("Base init")

class A(Base):
    def __init__(self):
        super().__init__()  # 自动查找 MRO 中的下一级
        print("A init")

class B(Base):
    def __init__(self):
        super().__init__()
        print("B init")

class C(A, B): # 多重继承
    def __init__(self):
        super().__init__()
        print("C init")

# c = C() 
# MRO 顺序: C -> A -> B -> Base -> object
# 确保 Base 只被初始化一次

属性控制与内省

机制 语法 说明
私有变量 __var 名字改编 (Name Mangling) 为 _ClassName__var,伪私有,约定不应从外部访问。
受保护变量 _var 约定俗成的内部变量(非强制)。
插槽 __slots__ = ['x'] 限制实例只能有固定的属性。作用:节省内存(不创建 __dict__),禁止动态添加属性。
内省 isinstance(o, Cls) 检查对象是否属于某类(或其子类)。
内省 issubclass(Sub, Sup) 检查类是否是另一个类的子类。

魔术方法 (Magic Methods)

魔术方法是双下划线包围的方法,用于拦截 Python 的内置操作(如运算、打印、索引)。

构造与表现

方法 调用场景 示例代码
__new__(cls, ...) 创建实例时(早于 init)。常用于不可变类型继承或元类。 return super().__new__(cls, val)
__init__(self, ...) 初始化实例时。 self.x = x
__str__(self) print(obj)str(obj)。面向用户,可读性强。 return f"User: {self.name}"
__repr__(self) repr(obj) 或 交互式命令行。面向开发者,准确性强。 return f"Class(id={id(self)})"

运算符重载 (算术与比较)

将对象像数字一样进行运算。

class Vector:
    def __init__(self, x, y):
        self.x, self.y = x, y

    # + 运算符: obj + other
    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)
    
    # * 运算符: obj * other
    def __mul__(self, other):
        return self.x * other.x + self.y * other.y
    
    # == 运算符: obj == other
    def __eq__(self, other):
        return self.x == other.x and self.y == other.y
        
    # 其他常用: __sub__ (-), __lt__ (<), __gt__ (>), __abs__ (abs())

容器与类型转换

将对象像列表或字典一样操作。

方法 调用场景 抽象示例
__len__(self) len(obj) return len(self.data)
__getitem__(self, k) obj[k] (索引/切片) return self.data[k]
__int__(self) int(obj) return int(self.val)
__index__(self) 用于切片/进制转换 hex() return int(self.val)

常用函数

Built-in (内置函数)

无需 import,直接使用。

函数名 示例 作用
print() print("Hello", end="") 输出信息到控制台,默认换行。
input() name = input("请输入:") 获取用户输入的字符串。
len() len([1, 2, 3]) -> 3 返回容器(列表、字符串等)的长度。
type() type(10) -> <class 'int'> 返回对象的类型。
id() id(obj) 返回对象的内存地址。
range() for i in range(0, 10, 2): 生成整数序列(起始, 结束, 步长)。
enumerate() for i, v in enumerate(seq): 遍历时同时获取 索引元素
zip() zip([1,2], ['a','b']) 将多个序列对应元素打包成元组。
sorted() sorted([3,1,2]) -> [1,2,3] 返回排序后的新列表(不修改原对象)。
open() with open('f.txt', 'w') as f: 打开文件(推荐配合 with 上下文管理器)。
help() help(str) 查看函数或模块的帮助文档。
dir() dir(list) 列出对象的所有属性和方法。

random 模块

用于生成伪随机数。 import random

函数名 示例 作用
random() random.random() 生成 [0.0, 1.0) 的随机浮点数。
randint() random.randint(1, 10) 生成 [a, b] 的随机整数(含边界)。
uniform() random.uniform(1.5, 3.0) 生成指定范围内的随机浮点数。
choice() random.choice(['a', 'b']) 从序列中随机选取一个元素。
sample() random.sample(list, 2) 无放回随机抽取 k 个元素(截取片段)。
shuffle() random.shuffle(list) 原地打乱列表顺序。
seed() random.seed(42) 初始化种子,保证随机结果可复现。

math & decimal 模块

数学运算与高精度计算。 import math, import decimal

函数名 示例 作用
math.ceil() math.ceil(3.1) -> 4 向上取整。
math.floor() math.floor(3.9) -> 3 向下取整。
math.sqrt() math.sqrt(16) -> 4.0 计算平方根。
math.pow() math.pow(2, 3) -> 8.0 计算 x 的 y 次方(返回浮点)。
decimal.Decimal() Decimal('0.1') 创建高精度十进制数(务必传字符串)。

time & datetime 模块

时间处理与格式化。 import time, from datetime import datetime

函数名 示例 作用
time.time() t = time.time() 获取当前时间戳(1970年至今的秒数)。
time.sleep() time.sleep(2) 程序暂停(休眠)指定秒数。
datetime.now() datetime.now() 获取当前日期和时间对象。
strftime() now.strftime("%Y-%m-%d") 对象转字符串(Format Time)。
strptime() datetime.strptime(s, fmt) 字符串转对象(Parse Time)。

os & sys 模块

操作系统交互与系统参数。 import os, import sys

函数名 示例 作用
os.getcwd() os.getcwd() 获取当前工作目录路径。
os.listdir() os.listdir('.') 列出指定目录下的所有文件/文件夹名。
os.mkdir() os.mkdir('new_dir') 创建单级目录。
os.makedirs() os.makedirs('a/b/c') 递归创建多级目录。
os.path.join() os.path.join('user', 'bin') 智能拼接文件路径(适配 Win/Linux 分隔符)。
os.path.exists() os.path.exists('file.txt') 判断文件或路径是否存在。
sys.argv args = sys.argv 获取命令行运行时的参数列表。
sys.exit() sys.exit(0) 退出程序(0为正常,非0为异常)。
sys.path sys.path.append(...) 模块搜索路径列表(可动态添加)。

json 模块

JSON 数据交换。 import json

函数名 示例 作用
dumps() s = json.dumps(dict_obj) Python 对象(字典) -> JSON 字符串。
loads() d = json.loads(json_str) JSON 字符串 -> Python 对象(字典)。
dump() json.dump(data, f) 直接将对象写入 JSON 文件。
load() data = json.load(f) 直接读取 JSON 文件为对象。

re 模块

正则表达式 (Regular Expression)。 import re

函数名 示例 作用
re.search() re.search(r'\d', 'a1b') 扫描并返回第一个匹配对象。
re.findall() re.findall(r'\d', 'a1b2') 返回所有匹配的子串列表。
re.sub() re.sub(r'\d', '', 'a1b2') 替换字符串中的匹配项。
re.compile() p = re.compile(r'\d') 编译正则模式,提高重复使用的效率。

collections 模块

增强型数据容器。 from collections import ...

类名 示例 作用
Counter Counter(['a','b','a']) 统计元素频次,返回字典 {元素: 次数}
defaultdict d = defaultdict(int) 访问不存在的 key 时自动赋默认值,不报错。
deque q = deque([1,2]) 双端队列,支持高效的从头/尾添加或删除。