Python 内置函数详解

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 是预绑定位置/关键字参数,不改变函数签名检查

这个系列的其他文档

暂无评论

发送评论 编辑评论

|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇