Python 内置函数字典:按功能分组,每组给签名、多场景示例与常见坑。覆盖 Python 3 全部高频 builtins。
1. 类型转换与构造:int / float / str / bool / bytes / complex
描述
六个基础类型构造器。int 支持进制与字符串解析,float 支持科学计数法,str 面向阅读而 repr 面向开发者。
语法和示例
int('123'); int('1010', 2); int(3.99) # 3(向零截断)
int('0x1f', 16); int('1f', 16) # 都是 31
float('1e-3'); float(123) # 0.001 / 123.0
str([1,2,3]) # '[1, 2, 3]'
repr([1,2,3]) # '[1, 2, 3]'(可还原)
bool([]); bool('0'); bool(0.0) # 只有这些是 False
bytes('中文', 'utf-8'); bytearray(b'ab')
complex(1, 2) # (1+2j)注意事项
- int(‘3.14’) 抛 ValueError——要先 float 再 int
- int 的 base 必须在 2-36,且字符串不能带 base 范围外的字符
- bool 的假值全集:0 0.0 0j ” [] {} () set() None False(’0′ 是真值!)
- bytes 与 str 不可混比:’a’ == b’a’ 恒为 False
2. 序列与迭代:len / range / enumerate / zip / reversed / sorted
描述
序列操作六件套。enumerate 同时给索引与值;zip 并行迭代(3.10+ 可 strict=True);sorted 返回新列表。 这六个是循环与序列处理的骨架。sorted 稳定排序且返回新列表,enumerate/zip 提供索引与并行,range 是不可变惰性序列。
语法和示例
len([1,2]); len('abc')
list(range(3)); list(range(2, 8, 2))
for i, v in enumerate(['a','b'], start=1): ...
list(zip([1,2], ['a','b'])) # [(1,'a'), (2,'b')]
list(zip(a, b, strict=True)) # 长度不等抛 ValueError(3.10+)
list(reversed([1,2,3]))
sorted([3,1,2], key=lambda x: -x)
sorted(words, key=len, reverse=True)
1. sorted 与 sort 的区别
xs = [3, 1, 2]
sorted(xs) # 新列表 [1,2,3]
xs.sort() # 原地,返回 None
1. 多级排序
sorted(rows, key=lambda r: (r['dept'], -r['score']))
1. zip 长度不等(旧版静默截断,3.10+ 可 strict)
list(zip([1,2], 'ab', strict=True))
1. range 的三种形态
range(5); range(2, 5); range(1, 10, 3)
list(range(5))[::-1] # 倒序
注意事项
- sorted 稳定排序且返回新列表;list.sort() 原地修改返回 None(常见坑:x = lst.sort())
- zip 在最短序列耗尽时停止(旧行为),要严格用 strict=True
- range 只接受整数,不接受浮点
- reversed 要求对象实现 __reversed__ 或支持序列协议(生成器不支持)
3. 映射与过滤:map / filter / iter / next / all / any
描述
函数式工具。map/filter 返回迭代器(惰性),all/any 短路求值。 函数式三件套中的 map/filter 返回惰性迭代器;all/any 短路求值(遇到第一个决定结果就停)。
语法和示例
list(map(str.upper, ['a','b'])) # ['A','B']
list(filter(None, [0,1,'',2])) # [1, 2](None 保真值)
list(map(lambda a,b: a+b, [1,2], [10,20]))
next(iter([1,2])) # 1
next(it, 'default') # 耗尽时返回默认值
all([1, 1]); all([]) # True(空序列为真)
any([0, '']); any([]) # False
1. 短路的行为
def side(n):
print('检查', n); return n > 0
all(side(x) for x in [1, -1, 0]) # 只检查前两个
any(side(x) for x in [0, 1, 2]) # 检查到第两个停
1. map 多序列
list(map(pow, [2,3], [2,3])) # [4, 27]
1. filter 与推导式对比
list(filter(str.isupper, 'aBcD')) # ['B','D']
[c for c in 'aBcD' if c.isupper()]
注意事项
- map/filter 返回惰性迭代器,只能消费一次——需要多次用 list() 落地
- all([]) 是 True、any([]) 是 False(空序列语义相反)
- filter(None, x) 是「保留真值」的简写,等价 filter(bool, x)
- next 不给默认值时耗尽抛 StopIteration
4. 数值计算:abs / round / divmod / pow / sum / min / max
描述
数学与聚合。round 是「银行家舍入」(.5 到偶数),与直觉不同。 聚合与数学函数。特别记住 round 是银行家舍入(.5 转向偶数),与 C 的 printf 不同。
语法和示例
abs(-3); round(2.5); round(3.5) # 3, 2, 4(.5 舍到偶数)
round(1.955, 2) # 1.95(二进制浮点表示误差)
divmod(7, 2) # (3, 1) 商与余
pow(2, 10); pow(2, 10, 100) # 1024 / 24(模幂)
sum([1,2,3]); sum(xs, start=0)
min([1,5], key=abs); max([1,5], key=abs)
min([], default=0) # 空序列必须给 default
1. 银行家舍入的影响
round(0.5), round(1.5), round(2.5) # (0, 2, 2)
1. 精确小数用 Decimal
from decimal import Decimal, ROUND_HALF_UP
Decimal('2.5').quantize(Decimal('1'), rounding=ROUND_HALF_UP)
1. min/max 的多参数与 key
min(3, 1, 2); min([3,1,2])
min(rows, key=lambda r: r['price'])
1. sum 的类型陷阱
sum([1, 2], 0) # 3
sum([[1], [2]], []) # [1, 2](列表累加,慢)
注意事项
- round(2.5)==2 而非 3——Python 用银行家舍入,与 printf 的四舍五入不同
- round 的第二个参数是小数位,但对二进制浮点不保证精确(1.955 得 1.95)
- min/max 对空序列抛 ValueError,除非给 default
- sum 不能用于字符串拼接(>3.12 会报错,用 ”.join)
5. 输入输出与格式化:print / input / format / f-string
描述
print 支持 sep/end/file;f-string(3.6+)是最推荐的格式化方式,支持表达式与格式说明符。 f-string 是最推荐的格式化方式:可嵌入表达式、支持格式说明符、3.8+ 支持 = 调试语法。
语法和示例
print('a', 'b', sep='-', end='!')
print('err', file=sys.stderr)
name = 'X'; n = 42
f'{name} {n:0>5}' # 'X 00042'
f'{3.14159:.2f}'; f'{0.25:.1%}' # '3.14' / '25.0%'
f'{n=}' # 'n=42'(调试)
format(255, 'x'), format(255, '08b')
1. 格式说明符速查
f'{x:>8}' # 右对齐宽 8
f'{x:<8}' # 左对齐
f'{x:^8}' # 居中
f'{x:08.2f}' # 补零 + 两位小数
f'{n:,}' # 千分位
f'{p:.1%}' # 百分比
1. 调试用 =
uid = 42; f'{uid=}' # 'uid=42'
1. 多行 f-string(3.12 前需拼接)
msg = (f'name={name} ' f'age={age}')
注意事项
- print 默认 sep=’ ‘、end=’\n’,调 end=” 可取消换行
- f-string 里不能有反斜杠(3.12 前)——需要换行先算到变量
- 格式说明符 : 后不能有空格
- input() 永远返回 str,数字要自己 int() 转
6. 对象自省:type / isinstance / callable / hasattr / getattr / dir / id / hash
描述
运行时反射。isinstance 支持元组多类型;getattr 支持默认值;dir 列出可用名称。
语法和示例
type(1); type('a').__name__
isinstance(x, (int, float))
callable(len); callable(lambda: 1)
hasattr(obj, 'name')
getattr(obj, 'name', 'default')
setattr(obj, 'name', v)
dir(obj) # 所有可访问名称
id(x) # 内存地址
hash('a') # 可作 dict 键则需可哈希注意事项
- type() 严格判类型,isinstance 会算继承——鸭子类型场景用 hasattr
- id() 在 CPython 是内存地址,对象释放后可能复用
- hash 要求对象实现 __hash__(可变对象如 list 不可哈希)
- getattr 取不存在属性会抛 AttributeError,除非给第三参
7. 字符与编码:chr / ord / ascii / bin / hex / oct
描述
码点与进制转换。chr/ord 互为逆运算,只处理 Unicode 码点。
语法和示例
chr(65); ord('A') # 'A' / 65
ord('中') # 20013
ascii('中') # "'\u4e2d'"(非 ASCII 转义)
bin(10); hex(255); oct(8) # '0b1010' '0xff' '0o10'
int('ff', 16) # 255(反向)注意事项
- chr 的参数必须 0-0x10FFFF,越界抛 ValueError
- ord 只接受长度为 1 的字符串
- bin/hex/oct 返回带前缀的字符串,要纯数字需切片 [2:]
- ascii() 与 repr() 类似,但把所有非 ASCII 转义
8. 迭代器工具:iter / next / aiter / anext
描述
iter 取迭代器(或配合 sentinel 做「读直到某值」);next 取下个元素。aiter/anext(3.10+)是异步版。
语法和示例
it = iter([1, 2])
next(it); next(it)
1. 双参 iter:读到 sentinel 停止
for line in iter(f.readline, ''): ...
async for x in aiter(aiterable): ...
anext(aiterable, 'default')注意事项
- 双参 iter(callable, sentinel) 常用于读文件直到空行
- aiter/anext 是 3.10+ 新增,低版本手动调 __aiter__
- 迭代器耗尽后 next 一直抛 StopIteration
9. 执行与编译:eval / exec / compile / __import__
描述
动态执行代码。eval 求值表达式,exec 执行语句。两者都有严重安全风险。
语法和示例
eval('1 + 2') # 3
exec('x = 1 + 2') # 执行语句
compile('1+2', '<s>', 'eval')
__import__('os') # 等价 importlib.import_module注意事项
- 永远不要对用户输入用 eval/exec——等同远程代码执行漏洞
- eval 只能单个表达式,exec 可多语句(exec 无返回值)
- 动态导入优先用 importlib.import_module,而非 __import__
- 沙箱化 eval(传空 __builtins__)并不可靠,可被绕过
10. 调试与开发:breakpoint / help / vars / globals / locals
描述
开发期工具。breakpoint()(3.7+)进 pdb;vars 取 __dict__。
语法和示例
breakpoint() # 进 pdb(等价 import pdb; pdb.set_trace())
vars(obj); vars() # 对象/当前作用域字典
globals()['x']; locals()
help(str.split)注意事项
- breakpoint 会读环境变量 PYTHONBREAKPOINT,生产可设 0 禁用
- locals() 在函数内返回快照,修改不保证生效
- 生产代码里别留 breakpoint()(会挂住进程)
11. 内存与垃圾:del / gc / weakref(配 sys.getrefcount)
描述
引用计数 + 分代 GC。del 删绑定,weakref 避免循环引用。
语法和示例
import sys, gc
sys.getrefcount(obj) # 引用数(含参数本身 +1)
del obj
gc.collect() # 手动触发
import weakref
r = weakref.ref(target)注意事项
- CPython 用引用计数 + 循环 GC;PyPy 不同
- getrefcount 返回值总比预期多 1(调用本身临时引用)
- 循环引用靠 GC 回收,非循环靠引用计数立即回收
- weakref 只支持部分类型(不能弱引用 int/str 等内建不可变)
12. 高阶函数与装饰:property / classmethod / staticmethod / functools
描述
装饰器工具集。property 做属性化访问;functools 提供 wraps/lru_cache/partial。
语法和示例
from functools import lru_cache, partial, wraps
@lru_cache(maxsize=None)
def fib(n): return n if n < 2 else fib(n-1)+fib(n-2)
inc = partial(pow, exp=2) # 预绑定
def deco(f):
@wraps(f) # 保留元信息
def wrapper(*a, **k): return f(*a, **k)
return wrapper注意事项
- lru_cache 的参数必须可哈希——列表作参数会报错
- 装饰器不加 @wraps 会丢失 __name__/__doc__,影响调试与文档
- property 无 setter 时赋值抛 AttributeError
- partial 是预绑定位置/关键字参数,不改变函数签名检查
这个系列的其他文档
- Python 35 个关键字详解——35 个关键字
- Python 标准库详解——标准库模块
- 完整学习路线——按顺序学完这个系列