代码风格
模仿 go 的写法即可。
包
python 中有大量的模块,我们用下面方式导入:
| 语法形式 | 含义 | 特点 / 风险 | 记忆示例 |
|---|---|---|---|
import 模块名 | 导入整个模块 | 使用时需 模块名.对象,不易冲突 | import math; math.sqrt(4) |
import 模块名 as 别名 | 导入模块并起别名 | 名字更短;便于更换实现 | import numpy as np |
from 模块名 import 名称 | 只导入指定对象 | 直接用对象名,易与本地变量同名 | from math import sqrt |
from 模块名 import * | 导入模块中“公开的全部名称” | 极易命名冲突,通常不推荐 | from os import * |
包是一个目录(文件夹),里面包含多个模块文件,用于组织命名空间。我们用下面方式导入:
| 语法 | 含义 | 示例 |
|---|---|---|
import 包名.模块名 | 导入包中某个模块 | import mypkg.utils |
from 包名 import 模块名 | 从包中导入模块对象 | from mypkg import utils |
在 python 中为了防止被导入时执行脚本逻辑,一般用下面代码控制入口:
# 当文件被当脚本运行时:`__name__ == "__main__"`;当文件被当模块导入时:`__name__ == "模块名"`。
if __name__ == "__main__":
main() # 仅在当前文件作为脚本执行时运行除了导入的模块和自己写的模块,包目录下的 __init__.py 文件也是包的模块,甚至在 Python 3.3 之前存在 __init__.py 才会被识别为包。它常用来:
- 初始化包级别的全局变量
- 统一对外暴露的接口
- 在导入包时会自动执行该文件代码做一次性初始化操作
包中会有想暴露的 API,可以通过在包或模块中定义 __all__,用于指定 from 包 import * 时能导出的名称:
# mypkg/__init__.py
__all__ = ["utils", "models"] # 只允许导出这两个子模块同理,对于单个模块里也可以用 __all__ 限制 import * 时的可见对象。
类型
字面量
字符串
用 ' 或者 " 包裹起来的字符串。可以通过加法拼接,可以通过乘法复制。
在字符串前面加个 r 字面量为原始字符串, 但如果里面有引号仍然需要转义.不能在输出尾端带有\, 系统会认为还没结束。
用三个双或者单引号可以实现长字符串(真正意义上的原始字符串),常常放在函数下面作为注释,lsp 也会读取相关内容作为提醒。
转义字符:
| 转义字符 | 描述 |
|---|---|
\(在行尾时) | 续行符(行连接) |
\\ | 反斜杠字符本身 |
\' | 单引号 |
\" | 双引号 |
\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 | 其他字符以普通形式输出(\ 后面不是合法转义序列时的情况) |
数字
支持科学记数法
虚数
可用 x+yj 或者 (x+yj) 来表示,对虚数对象是用方式 real 可查看实部, imag 是虚部。
基础类型
- 整形:python 由于是把 int 型当作字符存入故而可以有无限大的精度,这点也决定了它的速度注定慢,但很适合大数计算。另外用整形相除它自己返回的是浮点型。
- 浮点型:同其他语言无区别
- 布尔类型:函数
bool()可以判断真假,None False 0 0.0 0j Decimal(0) Fraction(0,1) '' () [] {} set() range(0)都是false对象
复合数据类型
列表(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]
# 多维列表
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]方法:
| 方法 | 说明 |
|---|---|
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() | 浅拷贝 |
元组(Tuple)
元组与列表的差别是不支持修改,故而它只用查的功能,其余差别不大。
t = (1, 2, 3)
t = 1, 2, 3 # 省略括号
single = (12,) # 单元素元组字符串(String)
与列表相差不大,不可变。不多阐述
大小写转换:
| 方法 | 说明 |
|---|---|
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) | 用分隔符拼接字符串序列 |
格式化字符串:
# 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))
# 字典推导式
{k: v for k, v in d.items()}
{v: k for k, v in d.items()}
{x: ord(x) for x in "FishC"}增删改查方法表:
| 操作/方法 | 说明 |
|---|---|
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集合(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。
运算符优先级:
| 运算符 | 描述 |
|---|---|
| * | 指数 (最高优先级) |
| + - | 按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@) |
* / % // | 乘,除,取模和取整除 |
| + - | 加法减法 |
| >> << | 右移,左移运算符 |
| & | 位 ‘AND’ |
^| | 位运算符 |
| <= < > >= | 比较运算符 |
| <> == != | 等于运算符 |
= %= /= //= -= += *= *= | 赋值运算符 |
| is is not | 身份运算符 |
| in not in | 成员运算符 |
| not and or | 逻辑运算符 |
算术运算符:
| 运算符 | 描述 | 实例 |
|---|---|---|
+ | 加 - 两个对象相加 | 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)返回 xabs(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 |
成员运算符:
| 运算符 | 描述 | 实例 |
|---|---|---|
| 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() 函数用于获取对象内存地址。
控制流
# 条件判断
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可以为负数,只不过开头和结尾要倒序了)
# 模式匹配
match ... # 用到再补充函数
定义:
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__ 查看。
类与对象
基础定义与实例化
类 (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) |
异常
try:
xxxxx #检测
except (error1,error2,error3) as e:#如果有相应 error 就执行, 一个 error 就不用元组形式, 可以不写直接识别全部, as e 是指相应的 error 描述结果输出到 e 中
pass
except error4:
pass
else:
pass #这里是没触发异常回调到的地方
finally:
无论有没有异常都会触发,必须经过的一环由于您提供的文本内容完全是关于 “类与对象” (Class & Object) 的(包含继承、多态、魔术方法等),而标题要求为“函数”可能是复制粘贴上一个指令时的笔误。为了确保文档的准确性和可用性,我将标题修正为 类与对象,并按照您的格式要求进行整理。
常用函数
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]) | 双端队列,支持高效的从头/尾添加或删除。 |