
前言Python 的内置函数built-in function是解释器启动时就注入命名空间的一批函数不需要任何import就能调用。数量不多每个 3.x 版本也就几十个但覆盖了输入输出、类型转换、判断检查、迭代聚合、数学运算这些最常见的动作。一个普遍的误解是内置函数很多要背下来。实际上日常代码里反复出现的也就二十来个剩下的多数有更清晰的替代写法mapfilterlambda往往不如一个列表推导式好读__import__()几乎永远应该写成import语句。本文按功能分组梳理常用内置函数给出可运行示例并明确哪几个应该少用。本文面向 Python 33.8 及以上均可运行。Python 2 的print语句、raw_input()、xrange()在 Python 3 中都已不复存在print变成函数raw_input改名inputxrange被range取代Python 2.7 自 2020 年 1 月 1 日起停止维护本文一律按 Python 3 写。一、内置函数存放在哪里它们都在builtins模块里解释器把该模块的所有公开名字预先放进每个作用域的全局命名空间所以你不用 import 就能用。# 适用于 Python 3.8import builtinsnames sorted(n for n in dir(builtins) if not n.startswith(_))print(len(names))print(names)因为只是普通名字你完全可以用自己的变量覆盖它们——这既是灵活性也是坑详见常见坑点。另外help()虽属内置命名空间但它其实是site模块在启动时添加的用python -S启动后就调用不到。二、输入输出与表示函数签名要点返回printprint(*objects, sep , end\n, fileNone, flushFalse)Noneinputinput(prompt, /)str永远是字符串openopen(file, moder, buffering-1, encodingNone, errorsNone, newlineNone, closefdTrue, openerNone)文件对象formatformat(value, format_spec, /)strreprrepr(object, /)str面向调试的可读表示# 适用于 Python 3.8print(a, b, sep-, end!\n) # a-b!name input(请输入名字: ) # 返回值永远是 strprint(format(3.14159, .2f)) # 3.14print(repr(a\tb)) # a\tbprint(str(a\tb)) # 制表符被真实展开input()永远返回字符串需要数字必须自己转换repr()与str()的区别在于前者尽量给出能重新构造该对象的表示调试打印容器时用repr()或!r格式化信息更完整。三、类型转换与构造int/float/str/list/tuple/dict/set/bytes/bool既是类型也是可调用对象调用它们就是构造新对象。# 适用于 Python 3.8print(int(2a, 16)) # 42第二参数是进制print(list(abc)) # [a, b, c]print(tuple([1, 2])) # (1, 2)print(set([1, 1, 2])) # {1, 2}print(bool(0), bool()) # False Falseprint(str(12) x) # 12x# int(abc) 会抛 ValueError# int(None) 会抛 TypeError注意int()对浮点是截断而非四舍五入int(3.99)得3要四舍五入用round(3.99)但注意银行家舍入。四、判断与检查函数用途关键点isinstance(obj, classinfo)类型判断考虑继承推荐首选issubclass(cls, classinfo)继承判断只看类callable(obj)能否调用有__call__即可hasattr(obj, name)属性是否存在会触发属性访问getattr(obj, name, default)取属性带默认值更安全all(iterable)/any(iterable)全体 / 任一为真空序列时all为True、any为False# 适用于 Python 3.8print(isinstance(True, int)) # Truebool 是 int 的子类print(all([]), any([])) # True Falseprint(callable(len), callable(1)) # True Falseclass C:x 1c C()print(getattr(c, y, 默认)) # 默认print(hasattr(c, x)) # Trueall()和any()都是短路的any遇到第一个真值就停all遇到第一个假值就停因此它们可以配合生成器做惰性判断。五、迭代、序列与聚合函数返回惰性len(obj)int—range(stop)/range(start, stop[, step])range对象是enumerate(iterable, start0)迭代器是zip(*iterables, strictFalse)迭代器是map(function, iterable, *iterables)迭代器是filter(function, iterable)迭代器是reversed(obj)迭代器是sorted(iterable, *, keyNone, reverseFalse)新list否sum(iterable, start0)数值否min/max元素否# 适用于 Python 3.8nums [3, 1, 4, 1, 5, 9]print(sorted(nums)) # [1, 1, 3, 4, 5, 9]print(sorted(set(nums), reverseTrue)) # [9, 5, 4, 3, 1]print(sum(nums), max(nums), min(nums)) # 23 9 1pairs [(b, 2), (a, 1)]print(max(pairs, keylambda p: p[1])) # (b, 2)for i, ch in enumerate(abc, start1):print(i, ch)print(list(reversed(abc))) # [c, b, a]zip()的strict参数需要3.10 及以上map()的strict参数需要3.14 及以上写兼容 3.8 的代码时不要使用。六、数学与进制函数说明abs(x)绝对值round(number, ndigitsNone)银行家舍入round half to evendivmod(a, b)返回(a // b, a % b)pow(base, exp, modNone)三参数时做模幂比(base ** exp) % mod高效bin/oct/hex转成带前缀的字符串chr/ord码点与单字符互转# 适用于 Python 3.8print(round(2.5), round(3.5)) # 2 4银行家舍入print(divmod(-7, 3)) # (-3, 2)print(pow(2, 10, 1000)) # 24等价于 1024 % 1000print(bin(10), oct(10), hex(10)) # 0b1010 0o12 0xaprint(ord(中), chr(20013)) # 20013 中常见坑点坑 1用变量名覆盖内置函数。❌list [1, 2, 3]之后再想list(abc)就报TypeError因为list已被绑成列表。✅ 换个名字如items [1, 2, 3]。同理不要用id、type、sum、format、input当变量名。坑 2以为input()返回数字。❌age input(年龄: ); print(age 1)—— 字符串加整数抛TypeError。✅age int(input(年龄: ))并做好ValueError的兜底。坑 3sorted()返回None❌nums nums.sort()——nums变None后面全崩。✅nums sorted(nums)或nums.sort()后者原地排序不要接返回值。坑 4sorted()把key当位置参数。❌sorted(data, lambda x: x[1])—— 抛TypeErrorkey和reverse是仅关键字参数。✅sorted(data, keylambda x: x[1])。坑 5对迭代器求两次值。❌nums [1, 2, 3]it filter(lambda x: x % 2, nums)print(sum(it)) # 2print(list(it)) # []已被消费完✅ 需要重复用就先lst list(it)之后都用lst。坑 6all([])与any([])想当然。❌ 以为空序列都返回False。✅all([])是True无假值即全真any([])是False无真值即全假这是数学上的约定。坑 7max()/min()对空序列直接调用。❌max([])—— 抛ValueError: max() arg is an empty sequence。✅max([], defaultNone)default仅在单个可迭代参数形式下可用。坑 8str()和repr()混用做调试输出。❌ 打印嵌套结构时用print(str(nested))字符串值看不出引号1与1分不清。✅ 用print(repr(nested))或 f-string 里的{nested!r}。总结分组常用函数一句话提醒输入输出print、input、openinput返回stropen要写encoding类型转换int、float、str、list、set、dictint()是截断不是四舍五入判断检查isinstance、hasattr、getattr、all、any优先isinstance而非type迭代序列len、range、enumerate、zip、sorted惰性的那几个返回迭代器数学进制abs、round、divmod、pow、hexround是银行家舍入真正要记的其实就一句话惰性函数返回迭代器只能消费一次原地方法list.sort返回None而sorted返回新列表。拿不准签名时在解释器里help(函数名)一敲参数名和默认值都清清楚楚比任何清单都可靠。