碎碎念
以小甲鱼的视频为主, 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]) |
双端队列,支持高效的从头/尾添加或删除。 |