Python简明教程(草稿)

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 需求的回应。

Guido1980 年代 参与了荷兰 CWI(国家数学与计算机科学研究所) 的 ABC 语言开发。 荷兰 CWI 的研究团队希望设计一种更适合教学的编程语言,替代当时流行的 BASICPascal, 目的是让非计算机专业的学生和教师更容易学习编程。 但 ABC 刻意回避系统级功能(如文件操作、进程管理),导致它只能用于教学,无法用于真实项目。
(补充:1990 年代后,Python 逐渐取代 ABC,成为教学和实际开发的首选。)

后来 Guido 参与了 Vrije Universiteit Amsterdam(阿姆斯特丹自由大学) Amoeba 分布式操作系统 项目。 Amoeba 的核心目标是构建一个高性能、透明的分布式系统,将多台计算机虚拟化成单一计算资源。 GuidoAmoeba 项目中需要编写大量系统管理脚本(如任务调度、日志分析), 由于当时用 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 发布,新增函数式编程特性(如 lambdareduce)。
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)

PEPPython 改进提案,是语言特性、标准库变更或流程规范的正式文档。

流程:

  • 提案提交:社区成员起草 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.stdoutsys.stderr 会初始化为对应于解释器标准输入、输出和错误流的文件对象;它们都会以文本模式打开,因此都遵循 io.TextIOBase 抽象类所定义的接口。

内部类型(Internal types):

某些由解释器内部使用的类型也被暴露给用户。

代码对象(Code objects)

代码对象表示编译为字节的可执行 Python 代码,或称 bytecode。代码对象和函数对象的区别在于函数对象包含对函数全局对象 (函数所属的模块) 的显式引用,而代码对象不包含上下文;

帧对象(Frame objects)

帧对象表示执行帧。 它们可能出现在调用栈对象中,还会被传递给已注册的跟踪函数。

4. 控制结构

5. 函数和模块

6. 字符串和正则表达式

7. 文件和异常处理

8. 面向对象编程

9. 高级数据结构与算法

10. 模块和包的管理

11. 函数式编程

12. 并发和异步编程

13. 网络编程

14. 数据库操作

15. 测试与调试

16. Web开发

17. 数据分析与科学计算

18. 自动化脚本

19. 人工智能与深度学习

20. DevOps与运算开发

updatedupdated2026-02-052026-02-05