1. Python的发展历史
1.1 Python是什么?
Python 是由荷兰程序员 Guido van Rossum 创造的一种 解释型、交互式、面向对象 的编程语言。
它包含了模块、异常、动态类型、高层级动态数据类型以及类等特性。
支持面向对象编程、过程式编程和函数式编程,能用 C 或 C++ 来进行扩展,非常易于移植,
可以在包括 Linux 和 macOS 在内的许多 Unix 变种以及 Windows 上运行。
| Python 官网 | 链接 |
|---|---|
| Python 官方主页 | python.org |
| Python 下载地址 | python.org/downloads/ |
| Python 文档中心 | docs.python.org |
| Python 包索引中心 | pypi.org |
| Python 软件基金会 | python.org/psf-landing/ |
| Python 推荐书籍 | python.org/moin/PythonBooks |
1.2 Python 的起源
Python 的创造最初源于荷兰程序员 Guido van Rossum(吉多·范罗苏姆) 对已有编程语言 ABC 的不满和对分布式操作系统 Amoeba 需求的回应。
Guido 在 1980 年代 参与了荷兰 CWI(国家数学与计算机科学研究所) 的 ABC 语言开发。
荷兰 CWI 的研究团队希望设计一种更适合教学的编程语言,替代当时流行的 BASIC 和 Pascal,
目的是让非计算机专业的学生和教师更容易学习编程。
但 ABC 刻意回避系统级功能(如文件操作、进程管理),导致它只能用于教学,无法用于真实项目。
(补充:1990 年代后,Python 逐渐取代 ABC,成为教学和实际开发的首选。)
后来 Guido 参与了 Vrije Universiteit Amsterdam(阿姆斯特丹自由大学) Amoeba 分布式操作系统 项目。
Amoeba 的核心目标是构建一个高性能、透明的分布式系统,将多台计算机虚拟化成单一计算资源。
Guido 在 Amoeba 项目中需要编写大量系统管理脚本(如任务调度、日志分析),
由于当时用 Bourne Shell 语法晦涩,复杂逻辑难以维护和 C 语言开发慢,内存管理容易出错,
所以需要一种能替代 Shell 脚本 和 C 语言 的工具。
(补充:1990 年代中期因 Linux 崛起 和分布式计算技术变革,Amoeba 的科研价值下降,1996 年项目基本停止维护。)
Guido 曾尝试改进 ABC,但 ABC 团队拒绝添加系统功能(认为会破坏教学定位)。
在 1989 年的圣诞假期中,Guido 决定另起炉灶,编写一种具有全面可扩展性的语言,
保留 ABC 的易读性,同时加入 Amoeba 所需的实用特性:
文件 I/O、进程控制、系统调用等。
所以 ABC 的失败经验 + Amoeba 的工程需求 → 催生了 Python 的设计哲学。
1.3 发版时间线
| 年份 | 描述 |
|---|---|
| 1991 | Python 0.9.0 发布(首个公开版本),支持类、异常处理、函数式编程工具(如 map、filter)。 |
| 1994 | Python 1.0 发布,新增函数式编程特性(如 lambda、reduce)。 |
| 2000 | Python 2.0 发布,引入垃圾回收机制、Unicode 支持和列表推导式。 |
| 2006 | Python 2.5 发布,加入 with 语句(上下文管理器)和条件表达式(x if cond else y)。 |
| 2008 | Python 3.0 发布,不兼容 Python 2,重点解决设计缺陷。 (如统一 Unicode 字符串、移除 print 语句)。 |
| 2009 | Python 2.6 和 3.1 同步发布,提供过渡工具(如 2to3 转换器)。 |
| 2014 | Python 3.4 发布,引入 asyncio 库(异步 I/O 支持)。 |
| 2015 | Python 3.5 发布,支持 async/await 语法和类型注解(Type Hints)。 |
| 2016 | Python 3.6 发布,新增 f-strings 字面量、异步生成器。 |
| 2018 | Python 3.7 发布,加入 dataclasses 模块和 breakpoint() 内置函数。 |
| 2019 | Python 2.7 正式终止支持(EOL),标志 Python 2 时代结束。 |
| 2020 | Python 3.9 发布,引入字典合并操作符和字符串前缀后缀方法。 |
| 2021 | Python 3.10 发布,新增模式匹配(match-case)和更清晰的错误提示。 |
| 2022 | Python 3.11 发布,性能显著提升(比 3.10 快 10–60%)。 |
| 2023 | Python 3.12 发布,改进错误信息、支持更灵活的 f-strings 语法。 |
1.4 Python 的发展生态
1.4.1 Python 软件基金会(PSF)
PSF 是非营利组织,负责 Python 的法律、财务和社区支持。
核心职能:
- 维护 Python 知识产权(如商标、版权)。
- 组织全球活动(如 PyCon)。
- 资助核心开发者和关键项目(如性能优化、文档改进)。
影响:
- 确保 Python 的中立性,避免被单一公司控制(对比 Java/Oracle)。
- 通过社区捐赠和赞助推动长期发展。
1.4.2 PEP(Python Enhancement Proposal)
PEP 是 Python 改进提案,是语言特性、标准库变更或流程规范的正式文档。
流程:
- 提案提交:社区成员起草 PEP,提交至 Python 邮件列表或 GitHub。
- 讨论与修订:核心开发者(Python Steering Council)和社区公开评审。
- 决策:通过投票或 BDFL(早期)/ Steering Council(现在)裁定。
- 实施:合并到 CPython 代码库(参考实现)。
影响:
- 确保变更透明化,避免独断专行。
- 重大特性(如异步编程、模式匹配)均通过 PEP 流程确定。
1.4.3 Python的社区和文化
Python 社区采用 “开放治理”(Open Governance)模式,核心特点包括:
(1)决策机制
- BDFL 时代(1991–2018):Guido van Rossum 作为“终身仁慈独裁者”拥有最终决定权。
- 现代(2018 年后):由 Python Steering Council(5 人委员会,通过 PEP 13 确立)领导,重大决策需社区讨论和投票。
PEP 流程(Python Enhancement Proposal):
- 任何人均可提交提案(如新语法、标准库改进)。
- 经过邮件列表讨论、核心开发者评审后,由 Steering Council 裁决是否通过。
(2)开发流程
代码管理:
- 主仓库(CPython)托管在 GitHub,采用 Pull Request(PR) 制。
- 核心开发者(Committers)负责代码审查与合并。
版本发布:
- 每 12–18 个月发布一个主版本(如 3.11 → 3.12),每月发布安全更新。
(3)社区协作平台
- 官方论坛:discuss.python.org(技术讨论、PEP 反馈)。
- 邮件列表:python-dev(核心开发者沟通)。
- 实时聊天:Python Discord、Slack(新手问答)。
2. 基础语法
3. 数据结构
3.1 内置类型
| 类型 | 值 |
|---|---|
| None | None |
| NotImplemented | NotImplemented |
| Ellipsis | Ellipsis |
| 数值型 | 整型数(int、bool),浮点数(float)、复数(complex) |
| 不可变序列 | 字符串(string)、元组(tuple)、字节(bytes) |
| 可变序列 | 列表(list)、字节序列(bytearray) |
| 集合 | 可变集合(Sets)、不可变集合(Frozen Sets) |
| 映射 | 字典(Dictionaries) |
| 可调用对象 | 函数、实例、方法等 |
| 模块 | Python模块 |
| 自定义类 | Python类 |
| 内部类型 | 代码对象、帧对象、回溯对象、切片对象、静态方法对象、类方法对象 |
None, False, True 和 __debug__ 无法被重新赋值,所以它们被视为真正的常量。
None
此类型只有一个值 None,在许多情况下它被用来表示空值,例如没有显式返回的函数将返回 None。
它的逻辑值为假。
NotImplemented
此类型只有一个值 NotImplemented,数值方法和比较方法如未实现指定运算符表示的运算则应返回该值。
它的逻辑值为真。(Python 3.9 版本开始,不再推荐计算 NotImplemented 的逻辑值)
Ellipsis
此对象通过字面值 ... 或内置名称 Ellipsis 访问。主要用于扩展切片语法。
它的逻辑值为真。
numbers.Number
Python 区分整型数、浮点型数和复数。
numbers.Integral(整型数)
整型数可细分为两种类型:
整型(int) 此类对象表示任意大小的数字,仅受限于可用的内存 (包括虚拟内存)。
布尔型(bool) 此类对象表示逻辑值 False 和 True。布尔类型是整型的子类型,两个布尔值在各种场合的行为分别类似于数值 0 和 1。
浮点数 numbers.Real(float)
此类对象表示机器级的双精度浮点数。
复数 numbers.Complex(complex)
此类对象以一对机器级的双精度浮点数来表示复数值。一个复数值 z 的实部和虚部可通过只读属性 z.real 和 z.imag 来获取。
序列(Sequences):
不可变序列:
不可变序列创建后不可被更改(如果对象包含对其他对象的引用,其中的可变对象就是可以改变的)。
字符串(Strings)
字符串是由代表 Unicode 码位的值组成的序列。 取值范围在 U+0000 - U+10FFFF 之内的所有码位都可在字符串中使用。
- 内置函数
ord()可将一个码位由字符串形式转换为取值范围在0 - 10FFFF之内的整数。 - 内置函数
chr()可将一个取值范围在0 - 10FFFF之内的整数转换为长度为 1 的对应字符串对象。 str.encode()可以使用给定的文本编码格式将 str 转换为 bytes。bytes.decode()可以使用给定的文本编码格式将 bytes 转换为 str。
元组(Tuples)
一个元组的元素可以是任意Python对象,使用圆括号语法。
- 空元组:
() - 单元素元组:
(x,) - 多元素元组:
(x, y, z)
字节(Bytes)
一个字节串对象是一个不可变的数组。 它的元素是 8 比特位的字节,用取值范围 0 <= x < 256 内的整数表示。
构造方式:
- 字节串字面量:
b'abc' - 内置函数
bytes():bytes(range(97, 97+26))
可变序列:
可变序列在创建后可以被更改,下标和切片标记可以被用于赋值和 del。
列表(Lists)
列表中的元素可以是任意 Python 对象。 列表由用方括号括起并由逗号分隔的多个表达式构成。
字节序列(Byte Arrays)
字节数组对象属于可变数组。可以通过内置的 bytearray() 构造器来创建。
除了可变,其他接口和功能与 bytes 对象一致。
集合类型(Set types):
此类对象表示由不重复对象组成的无序且有限的集合。
不能通过下标来索引,但是可以被迭代,可用内置函数 len() 返回集合中的元素数。
集合常见的用处是快速成员检测,去除序列中的重复项,以及进行交、并、差和对称差等数学运算。
可变集合(Sets)
可变,通过内置的 set() 构造器创建。
不可变集合(Frozen sets)
不可变,通过内置的 frozenset() 构造器创建。
映射(Mappings):
字典(Dictionaries)
此类对象表示由任意索引集合所索引的对象的集合,目前只有 字典 一种原生映射类型。
- 字典是可变对象,可通过
{}语法创建。 - 字典的键必须是可哈希的(即不可变类型)。
- 字典会保留插入顺序(Python 3.6 及以后)。
可调用类型(Callable types):
此类型可以被应用于函数调用操作。
- 用户定义函数:用户定义函数对象可通过函数定义来创建。
- 实例方法:实例方法用于结合类、类实例和任何可调用对象 (通常为用户定义函数)。
- 生成器函数:一个使用
yield语句的函数或方法被称为生成器函数。 - 协程函数:使用
async def来定义的函数或方法就被称为 协程函数。 - 异步生成器函数:使用
async def来定义并使用了yield语句的函数或方法被称为 异步生成器函数。 - 内置函数:内置函数是针对特定 C 函数的包装器。
- 内置方法:此类型实际上是内置函数的另一种形式,只不过还包含了一个转入 C 函数的对象作为隐式的额外参数。
- 类:类是可调用对象。
- 类实例:任意类的实例可以通过在其所属类中定义
__call__()方法变成可调用对象。
模块(Modules)
模块是 Python 代码的基本组织单元,由导入系统创建,它或是通过 import 语句,或是通过调用 importlib.import_module() 和内置的 __import__() 等函数来唤起。
自定义类(Custom classes)
自定义类这种类型一般是通过类定义来创建。
类实例(Class instances)
类实例可通过调用类对象来创建。
IO对象(也称为:文件对象)
file object 表示一个打开的文件。有多种快捷方式可用来创建文件对象: open() 内置函数,以及 os.popen(), os.fdopen() 和 socket 对象的 makefile() 方法 (还可能使用某些扩展模块所提供的其他函数或方法)。
sys.stdin, sys.stdout 和 sys.stderr 会初始化为对应于解释器标准输入、输出和错误流的文件对象;它们都会以文本模式打开,因此都遵循 io.TextIOBase 抽象类所定义的接口。
内部类型(Internal types):
某些由解释器内部使用的类型也被暴露给用户。
代码对象(Code objects)
代码对象表示编译为字节的可执行 Python 代码,或称 bytecode。代码对象和函数对象的区别在于函数对象包含对函数全局对象 (函数所属的模块) 的显式引用,而代码对象不包含上下文;
帧对象(Frame objects)
帧对象表示执行帧。 它们可能出现在调用栈对象中,还会被传递给已注册的跟踪函数。