资讯动态

Python 十大特性

发布时间:2026/10/8 22:25:19 来源:尧图企业网站定制
前言「Python 十大特性」是一个典型的榜单式说法Python 官方文档里并没有任何一份叫「十大特性」的清单它多半是教程作者按自己的偏好挑出来的十条。这不代表这类文章没价值但要先纠正榜单里反复出现的三类错误把「解释型语言」说成「没有编译过程」把「动态类型」说成「弱类型」把 GIL 说成「Python 不能做多线程」。这三条本文都会逐一讲清。本文以 CPython 3.14 的行为为准。凡是「语言规范保证」和「当前实现恰好如此」这两类我会明确区分——因为前者你可以依赖后者明天就可能变。Python 2.7 已于 2020 年 1 月 1 日停止维护本文所有示例都是 Python 3 写法。另外本文出现的所有版本号3.8 / 3.9 / 3.10 / 3.11 / 3.12 / 3.13 / 3.14指的是Python 3 的某个小版本。「Python3」不是一个独立产品它只是 Python 3.x 的非正式简称。一、语言设计可读性与执行方式缩进即语法可读性优先Python 用缩进表达代码块而不是花括号。这不是「风格建议」而是语法强制缩进不一致会直接抛IndentationError。# 适用于 Python 3.8def classify(n):if n 0:return positiveelif n 0:return negativeelse:return zeroprint(classify(3), classify(-3), classify(0))缩进可以只用空格或只用制表符但不要混用。CPython 3 里混用制表符和空格通常会直接报TabError而不是像 Python 2 那样悄悄按 8 列的制表符宽度猜。PEP 8 建议每层缩进 4 个空格。先编译成字节码再由虚拟机执行「解释型语言」是一个不精确的标签。CPython 的实际流程是源代码 → 编译成字节码bytecode→ 由 CPython 虚拟机执行。字节码会缓存进__pycache__目录下的.pyc文件。# 适用于 Python 3.8import disdef add(a, b):return a bdis.dis(add)dis.dis会打印出LOAD_FAST、BINARY_OP这类字节码指令。这解释了为什么「Python 没有编译」是错的——编译一直在发生只是不产出机器码而产出字节码。需要注意.pyc缓存只对 import 的模块生效直接python script.py运行的主脚本不会生成.pyc。另外__pycache__里的.pyc会因为源文件 mtime 或大小变化而失效重建。二、数据模型动态类型、一切皆对象动态类型但强类型这是最容易被说错的一条。Python 同时满足两个看似矛盾的属性动态类型dynamically typed变量本身没有类型类型附着在对象上同一个名字可以先后绑定不同类型的对象。强类型strongly typed不同类型之间的隐式转换极少1 1会直接报TypeError不会像 JavaScript 那样悄悄给出11。# 适用于 Python 3.8x 1x 现在 x 是字符串了 # 合法名字重新绑定print(x)try:print(1 1) # 触发 TypeErrorexcept TypeError as e:print(TypeError:, e)所以「Python 是弱类型语言」的说法是错的。它动态但不弱。一切皆对象整数、函数、类、模块在 Python 里都是对象都有type、id都能被赋值给变量、放进容器、当参数传递。# 适用于 Python 3.8print(type(3), type(len), type(type))print(type(3) is int)f len # 函数可以像普通值一样绑定到名字print(f([1, 2, 3])) # 6print(type(len), callable(len))正因为函数是一等对象first-class object才有了装饰器、map、functools.partial这些工具。也正因为整数是对象小整数在 CPython 里会被缓存复用-5 到 256这就是a is b对小整数可能为True的原因——这是实现细节不要依赖。内置的四种核心容器Python 把最常用的四种容器直接做进语言list、tuple、dict、set。其中字典从 3.7 起由语言规范保证插入顺序3.6 只是 CPython 的实现细节不要依赖 3.6 的行为。容器是否可变是否有序是否可哈希作键典型用途list可变有序否有序序列频繁增删改tuple不可变有序元素可哈希时才可以固定记录、多返回值dict可变插入有序3.7键必须可哈希映射、计数、缓存set可变无序否去重、成员判断# 适用于 Python 3.8d {b: 2, a: 1, c: 3}print(list(d)) # [b, a, c]插入顺序print(sorted(d)) # [a, b, c]排序后print({1, 2, 2, 3}) # {1, 2, 3}自动去重注意d.keys()、d.values()、d.items()返回的是视图view不是列表会随字典变化而变。这是 Python 3 与 Python 2 的一个重要区别——2 里的d.iteritems()在 3 里已经被移除直接写d.items()即可。自动内存管理CPython 用引用计数为主、标记清除分代回收为辅管理内存。对象引用数归零就立刻回收循环引用靠 GC 兜底。# 适用于 Python 3.8import sys, gca [1, 2, 3]print(sys.getrefcount(a)) # 通常比 1 大因为 getrefcount 的参数本身也持有一份引用print(gc.isenabled())del a要记住的是del只是删除名字到对象的绑定不等于立刻释放内存——只要还有别的引用对象就活着。同理函数返回后局部变量消失但如果被闭包捕获对象会继续存活。三、工程能力异常、标准库与生态异常处理是一等公民Python 用异常表达错误而不是返回错误码。try / except / else / finally四件套的执行顺序是明确规定的# 适用于 Python 3.8def divide(a, b):try:result a / bexcept ZeroDivisionError:return division by zeroelse:return result # 没有异常时才执行finally:print(finally 总会执行)print(divide(6, 3))print(divide(6, 0))顺序是try无异常 →else→finallytry有异常且被捕获 →except→finally。永远不要写裸except:它会连KeyboardInterruptCtrlC和SystemExit一起吞掉让程序无法正常中断。标准库「自带电池」Python 官方标准库覆盖面极广无需第三方依赖就能做很多事。举几个确定存在的# 适用于 Python 3.8import json, re, pathlib, collections, itertools, datetimeprint(json.dumps({b: 1}, ensure_asciiFalse))print(re.findall(r\d, a1b22c333))print(pathlib.Path(.).name)print(collections.Counter(abracadabra).most_common(2))print(list(itertools.islice(itertools.count(10, 5), 3)))print(datetime.date(2020, 1, 1).isoformat())3.11 还加入了tomllib只读 TOML 解析此前解析 TOML 需要装第三方库。标准库的定位是「常用、稳定、跨平台」不是「万能」——科学计算、数据框、HTTP 客户端的高级封装仍然属于第三方生态。多范式与 GIL 的真相Python 支持过程式、面向对象、函数式三种风格。但有一点必须讲准GIL全局解释器锁让同一进程内同一时刻只有一个线程执行 Python 字节码。任务类型多线程是否加速原因I/O 密集网络、磁盘通常有效等待 I/O 时会释放 GILCPU 密集纯计算通常无效GIL 让字节码无法真正并行CPU 密集任务应该用multiprocessing多进程各自有独立 GIL或者把热点交给 C 扩展 / 原生扩展。这里不给出任何「提速 N 倍」的数字因为具体倍数完全取决于任务和机器。CPython 3.13 起提供了实验性的自由线程free-threaded俗称 no-GIL构建但它不是默认构建需要单独安装3.13 / 3.14 里的 JIT 同样是实验性的。所以说「Python 已经没有 GIL 了」是错的默认构建仍然有 GIL。# 适用于 Python 3.8import sysprint(sys._is_gil_enabled() if hasattr(sys, _is_gil_enabled) else 该版本无此接口)sys._is_gil_enabled()是 3.13 才加入的带下划线前缀说明它是实现相关接口用hasattr先探测才不会在旧版本上崩。庞大的第三方生态与跨平台PyPI 上有海量第三方包pip install即可安装。但要注意pip不在标准库里需要单独安装python -m ensurepip可以引导。建议用虚拟环境隔离依赖python -m venv .venv而不是往全局环境里装。不要写import requests之后假装它能跑——requests是第三方库没装就是ModuleNotFoundError。python -m venv .venv# Windows.venv\Scripts\activate# macOS / Linuxsource .venv/bin/activatepip install 你的包名跨平台方面同一个.py文件在 Windows / macOS / Linux 上通常都能跑但有几处需要留意open()不写encoding会用平台默认编码Windows 上常是本地代码页容易读文件乱码路径分隔符不要硬编码用pathlib换行符用文本模式时会被自动转换。四、实战一段代码过一遍十项特性# 适用于 Python 3.8一段代码把本文提到的十项特性串起来。import disimport sysfrom collections import Counterclass Basket:def __init__(self, items()):self.items list(items)def __repr__(self):return fBasket({self.items!r})def summarize(names):返回 {名字: 出现次数}按键排序。counter Counter(names) # 标准库自带电池return dict(sorted(counter.items())) # 3.7 字典保持插入顺序def first_negative(values):for v in values:if v 0:return velse: # 循环未被 break 时执行return Noneif __name__ __main__:basket Basket([apple, pear])print(basket) # 一切皆对象 reprtry:basket.items[0] 1 # 强类型抛 TypeErrorexcept TypeError as exc:print(TypeError:, exc) # 异常是一等公民print(summarize([b, a, b])) # {a: 1, b: 2}print(first_negative([1, 2, -3])) # -3print(first_negative([1, 2, 3])) # Nonedis.dis(summarize) # 字节码编译一直在发生gil getattr(sys, _is_gil_enabled, lambda: 该版本无此接口)print(GIL 是否开启, gil())几点说明getattr(sys, _is_gil_enabled, ...)用了默认值兜底因为sys._is_gil_enabled()是3.13才加入的实现相关接口在旧版本上直接调用会抛AttributeError。默认构建下它会打印True——这正是「Python 已经没有 GIL 了」这个说法的反例。另外dis.dis()的输出量较大实际阅读时可以只关注前几条指令。常见坑点❌ 认为「Python 是弱类型语言1 1会得到11」 ✅1 1抛TypeErrorPython 是动态但强类型需要显式转换int(1) 1。❌ 认为「Python 没有编译过程所以很慢是理所当然」 ✅ CPython 会先把源码编译成字节码再执行dis.dis()能看到指令速度瓶颈主要在解释执行的虚拟机循环和对象模型而不是「没编译」。❌ 依赖「字典在小规模时顺序随机」或「3.6 的字典顺序」 ✅3.7 起插入顺序是语言保证想排序请显式调用sorted(d)不要在 3.6 上赌顺序。❌ 写except:捕获所有异常 ✅ 写except Exception:或精确到except (ValueError, TypeError):否则 CtrlC 都会失效。❌ 用a is b判断两个整数或字符串是否相等 ✅ 用a b比较值小整数缓存-5 到 256和字符串驻留都是 CPython 实现细节不能依赖。❌ 认为「Python 有 GIL所以多线程和并发都没用」 ✅ GIL 只限制同一进程内的字节码并行I/O 密集用线程仍然有效CPU 密集用多进程。❌ 在 Python 3 里写d.iteritems()或print x✅ 用d.items()和print(x)iteritems在 Python 3 中已移除print语句在 Python 3 中已经不是语法。❌ 在读取文件时省略encoding以为跨平台一致 ✅ 显式写open(path, encodingutf-8)避免 Windows 上按本地代码页解码导致乱码。总结特性一句话本质是否语言保证缩进即语法代码块由缩进决定是编译到字节码源码先编译再执行是实现细节可见动态强类型类型在对象上隐式转换极少是一切皆对象函数、类、模块都是对象是四大容器list / tuple / dict / set是dict 插入有序3.7 起保证是自动内存管理引用计数 分代 GC实现细节异常优先错误用异常表达是标准库丰富内置电池是有 GIL同进程内字节码不并行是3.13 实验性构建除外把这十条记住的关键是分清「语言规范保证」和「CPython 当前这么做」。前者写进代码里可以放心依赖后者一旦当成保证升个版本就可能翻车。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑