Python是由吉多·范罗苏姆(荷兰语:Guido van Rossum)于1989年末开发的一种编程语言,于1991年2月首次发布。[2] Python是一种免费的、可移植的、可解释的、面向对象的编程语言,它同时具有解释语言和脚本语言功能。[3] Python简洁的语法和动态类型,加上其解释性,使其被应用于许多领域的脚本编写和快速应用程序开发。[6]
1989年末,吉多·范罗苏姆在荷兰国家数学与计算机科学研究中心(荷兰语:Centrum Wiskunde & Informatica,CWI)开始研究Python。1995 年,吉多·范罗苏姆在国家创新研究公司(英语:Corporation for National Research Initiatives,CNR)继续研发 Python ,并发布了该软件的多个版本。[7]2000年6月,包括吉多·范罗苏姆在内的Python开发团队组建了PythonLabs团队,同年10月,PythonLabs团队加入Digital Creations。[3] 2000年10月16日,Python 2.0发布。[8] 2001 年,Python软件基金会成立。[7]2008年12月3日,Python 3.0发布。[9] 2023年6月6日,Python 3.11.4发布。[10]
Python具有代码简洁、易读、易维护等特点,拥有高效的高级数据结构、丰富的基础类库和成熟的第三方类库。[5]Python易于扩展,可以使用C或C++(或者其他可以通过C调用的语言)扩展新函数和数据类型。[5]Python还是一种支持字节编译的解释语言,并且Python的字节码是独立于机器的,可以在不同的硬件和软件平台上执行,而无需再次编译。[3] Python的特性使其拥有大批使用者,成为最流行的开源编程语言之一。[2][1]截至2023年8月,Python位列TIOBE编程社区指数中最受欢迎的编程语言之首。[11]
发展历程
Python的创始人吉多·范罗苏姆在荷兰国家数学与计算机科学研究中心工作时,经常使用ABC语言,他认为该语言有较多优点但存在缺乏扩展性的问题。吉多·范罗苏姆参与的有关Amoeba分布式操作系统的项目需要一种比编写C程序或Bourneshell脚本更好的方法来进行系统管理。在此项工作过程中,他意识到异常处理功能作为编程语言功能的重要性,并想到一种语法像ABC并可以访问调用Amoeba系统的脚本语言就能满足项目需求。[12]因此,1989年末,吉多·范罗苏姆在阿姆斯特丹的研究中心开始研究Python。[3]Python得名于20世纪70年代的英国电视喜剧连续剧《巨蟒剧团之飞翔的马戏团》(英语:Monty Python's Flying Circus),据说,Python的创始人在开发语言的同时,正在观看节目重播。[1]1991年2月,Python 0.9在USENET首次发布。[7][3] Python最初是为执行一般管理任务而设计的[3],但因其被设计的较为通用,逐渐被应用于多个领域,拥有大批使用者,并于1994年创建了一个专门的互联网新闻组comp.lang.python。[2][1]
1995 年,吉多·范罗苏姆在弗吉尼亚州的国家创新研究公司继续研发Python ,并发布了该软件的多个版本。[7]1999年4月,Python 1.5.2发布。[3]2000年6月,包括吉多·范罗苏姆在内的Python开发团队转移到BeOpen.com,并组建了PythonLabs团队,同年10月,PythonLabs团队离开Beopen,并加入Digital Creations。[3] 2000年10月16日,Python 2.0发布[8],与早期版本的Python相比具有包容性的语言开发过程,还包含了更多的编程功能,如修复垃圾回收机制问题、增加Unicode编码标准支持以及列表理解。[2]2001 年,Python软件基金会成立,这是一个专为拥有Python相关知识产权而创建的非营利组织。[7]2008年12月3日,Python 3.0发布,不完全兼容Python 2[9],其开发的重点是清理代码库并消除冗余,Python 3.0的主要修改包括将打印语句转换为内置函数,改进整数的划分方式以及提供更多的Unicode支持。[2]2010年7月3日,Python 2.7发布,并计划作为2.x版本中的最后一个版本,旨在通过提供兼容性,让Python2.x用户更容易将功能移植到Python3。[2]
2023年8月24日,Python 3.11.5发布。[10] 截至2023年8月,Python位列TIOBE编程社区指数中最受欢迎的编程语言之首。[11]
| 发布版本 | 时间 | 更新 | 弃用时间 |
|---|---|---|---|
| 2.0 | 2000年10月16日 | 功能:增加Unicode支持;增加列表推导式;添加增强赋值运算符;修复垃圾回收机制问题;print语句可以将其输出定向到类似文件的对象;模块可以在导入时重命名;增加格式样式%r;实现一个类来覆盖Python的内置运算符并实现自定义版本;引入了TabError和IndentationError异常;新增zip()、map()内置函数;更新字符串与字典方法;更新sys、eadline、ConfigParser、cgi、calendar、posix、readline、xmllib、aifc、chunk、wave、random、shelve和nntplib模块;新增atexit、filecmp、gettext、linuxaudiodev、mmap、pyexpat、 robotparser、tabnamy、UserString、webbrowser、_winreg、zipfile、imputil;删除stdwin[13] | - |
| 2.7 | 2010年7月3日 | 增加两个调试模式的环境变量;增强网络安全;移除接触构建目标;在collections模块中引入了OrderedDict类;logging.config模块中添加dictConfig()函数,该函数使用字典来配置日志记录;包含importlib的一个子集[14] | 2020年1月1日[15] |
| 3.0 | 2008年12月3日 | print语句替换为print()函数;用视图和迭代器取代列表;简化了排序比较的规则;只有一个内置的整型,名为int;更新二进制数据和Unicode相关内容;提供了一种标准化的方法来注释函数的参数和返回值;参数列表中出现在*args之后的命名参数必须在调用中使用关键字语法指定,允许在基类列表之后使用关键字参数;增加nonlocal语句;扩展可重复解包;更新字典、集合、二进制、八进制与字节数据;更新raise语句语法;as、with、True、False和None是保留字;从exc-exc,var改为exc-exc-as var;删除元组参数拆包;删除backticks;删除<>;删除的关键字:exec();from module import*语法只允许在模块级别使用,相对导入唯一可接受的语法是from;删除Classic classes[16] | 2009年6月27日[15] |
| 3.5 | 2015年9月13日 | 通过添加可等待对象,协程函数,异步迭代和异步上下文管理器改善了Python对异步编程的支持;新增矩阵乘法运算符@;扩展了*iterable解包运算符和**dictionary解包运算符的使用;新增typing与zipapp模块;为字节串和字节数组增加%格式化;新增 bytes.hex(),bytearray.hex()和memoryview.hex()方法;memoryview支持元组索引;生成器具有一个新增gi_yieldfrom 属性,它将返回yield from表达式所迭代的对象;当达到最大递归尝试时将引发新的RecursionError异常;collections.OrderedDict用C实现,速度快了4到100部;ssl模块获得对内存BIO的支持,它使得SSL协议处理与网络IO实现了解耦;新增os.scandir()函数,提供了对于目录遍历更快速的方式;functools.lru_cache()已经大部分用C重新实现,产生了更好的性能;新增subprocess.run()函数,提供了一个运行子进程的简便方式;traceback模块被显著增强;SSLv3在整个标准库中被禁用,可以通过手动实例化一个ssl.SSLContext来启用;HTTP cookie 解析更严格,以防止潜在的注入攻击[17] | 2020年9月30日[15] |
| 3.6 | 2016年12月23日 | 引入了一种新型的字符串字面值:f-字符串,或称格式化字符串字面值;引入了函数形参类型标注即类型提示的标准;增加了在数字字面值中使用下划线的能力以改善可读性;解除不能在同一函数体中同时使用await和yield的限制;添加了对在列表、集合与字典推导式和生成器表达式中使用async for的支持;可以在不使用元类的情况下自定义子类的创建;扩展了描述器协议以包括新的可选方法__set_name__();添加文件系统路径协议;消除本地时间的歧义;将Windows文件系统与控制台编码更改为UTF-8;保留类属性定义顺序;函数签名中的 **kwargs保证是一个保留插入顺序的映射对象;附带--with-dtrace为解释器中函数调用/返回、垃圾收集开始/完成与执行的代码行等事件启用静态标记;添加了 secrets 模块以简化适用于密码管理的高加密强度伪随机数的生成,例如账户验证、安全凭据等场景;在Linux上,os.urandom()会阻塞直到系统的 urandom熵池被初始化以提升安全性; hashlib和ssl模块支持OpenSSL 1.1.0;ssl模块的默认设置和特性集已得到改进;hashlib模块获得了对BLAKE2,SHA-3和SHAKE哈希算法以及scrypt()密钥派生函数的支持[18] | 2021年12月23日[15] |
| 3.7 | 2018年6月27日 | 类型标注延迟求值;async和await是保留的关键字;新增库模块:contextvars、dataclasses、 importlib.resources; 新增breakpoint() 函数;改进自定义可访问的模块属性与typing模块和泛型类型的核心支持;dict对象保持插入时的顺序特性并成为Python语言官方规范的一部分;asyncio模块添加新的功能;time模块提供纳秒级精度函数的支持;CPython 实现的改进:传统C区域强制转换,强制UTF-8运行时模式,改进DeprecationWarning处理;C API 的改进:增加用于线程本地存储的C API[19] | 2023年6月27日[15] |
| 3.10 | 2021年10月14日 | 增加了采用模式加上相应动作的match语句和case语句的形式的结构化模式匹配;允许使用加圆括号的上下文管理器;向zip添加可选的长度检查;解释器的改进:在调试和其他工具中使用精确的行号;允许 X | Y 形式的联合类型写法;在typing 模块中新增了两个选项;typing模块新增TypeAlias可更明确地声明类型别名;TypeGuard被添加到 typing模块用来标注类型保护器函数并改进在类型细化期间提供给静态类型分析器的信息;要求 OpenSSL 1.1.1以上版本;不再支持 OpenSSL 1.0.2;弃用distutils模块;弃用并准备移除PyUnicodeObject中的wstr成员;移除 Py_UNICODE编码器 API;增加可选的EncodingWarning[20] | 2026年10月[注1][15] |
| 3.11 | 2022年10月24日 | 新添加except的泛化语法except* ,能够匹配异常组的子组;添加add_note()到BaseException;新增tomllib,支持解析 TOML ;解释器的改进:回溯信息中标注更详细的错误位置, 新增 -P 命令行选项以及PYTHONSAFEPATH 环境变量来禁止自动将潜在的不安全路径前置到sys.path;引入了TypeVarTuple,其支持任意数量的类型的参数化;提供一种方式来标记TypedDict中的单个项是否必须存在;新增Self类型提供了一种标注返回其类实例的方法,也可以用来标注与其封闭类类型相同的方法参数或属性;新增LiteralString,用于注明函数参数可为任何字面值字符串类型;新增dataclass_transform ,用于修饰类、元类或本身是装饰器的函数;部分宏已被转换为静态内联函数以避免宏陷阱[21] | 2027年10月[15] |
概述
Python源于脚本语言ABC,支持面向对象编程之外的多种编程范式是一种免费的、可移植的、可解释的、面向对象的编程语言,[3]其设计的理念是:对于特定的问题,只要有一种最好的方法来解决就够了,因此与其他语言相比Python语法较为简洁。[22]用户可以从Python官网免费获取Python解释器和标准库的源代码或二进制形式。[6]
Python是用可移植的ANSI C编写的,这意味着可以在Windows、Linux和Macintosh等不同环境中编写、测试和上传Python代码,即Python具备可移植特性。[3]
Python是一种支持字节编译的解释语言。Python程序由在交互模式下运行的Python解释器交互运行、调试和测试。Python的源代码是在解释器上加载时直接进行字节编译的,也可以显式进行字节编译。并且Python的字节码是独立于机器的,可以在不同的硬件和软件平台上执行,而无需再次编译。[3]
Python是一种面向对象的语言,并提供了其他结构化和过程化语言的特性。Python允许面向对象的多重继承,还支持多态性,即Python可调用对象可以接受可选参数、关键字参数或无限数量的参数。[3]
Python代码简洁易读,是因为其具有简单的语法与语义和相对较少的关键字,使用缩进而不是额外的符号将语句分组以形成代码块。[3]
除上述特点外,Python还是可扩展的,它有许多系统调用和库的接口,也有各种窗口系统的接口,并且可以用C或C++进行扩展。它也可用作需要可编程接口的应用程序的扩展语言。[12] 他还包含一个内置的模块导入系统,允许导入其他脚本和模块以供使用。[3]
逻辑行与物理行
Python程序可以拆分为多个逻辑行。一个逻辑行是由一个或多个物理行组成的,它的结束是以NEWLINE形符表示的。[23]
物理行是一序列字符,由行尾序列终止。两个及两个以上的物理行可用反斜杠拼接为一个逻辑行。[23]
圆括号、方括号、花括号内的表达式与三引号字符串可以分成多个物理行,隐式拼接行之间没有NEWLINE形符,后续行的缩进不影响代码运行,且可以存在空的后续行。[23]
注释与声明
注释是用来说明程序代码或是提供其他信息的描述文字。Python的单行注释以井号 (#) 开头,并在物理行的末尾结束;多行注释是以三个引号来引住注释文字。注释在语法分析中会被忽略。[24]
Python脚本第一或第二行的注释匹配正则表达式 coding[=:]\s*([-\w.]+) 时,该注释会被当作编码声明;这个表达式的第一组指定了源码文件的编码。编码声明必须独占一行,在第二行时,则第一行必须也是注释。没有编码声明时,默认编码为UTF-8。如果声明了编码格式,该编码格式的名称必须是Python可识别的。 编码格式会被用于所有的词法分析,包括字符串字面值、注释和标识符等。[23]
# 声明 # -*- coding: <encoding-name> -*-
缩进
缩进是逻辑行开头的空白符(空格符和制表符),用于计算该行的层级,决定语句组块。首个非空字符前的空格数决定了该行的缩进层次。缩进不能用反斜杠进行多行拼接。[23]
Python程序代码中的缩进对执行结果有很大的影响,即Python对缩进是非常严谨的。同一个组块的程序代码必须使用相同的空格或制表符进行缩进,否则就会出现错误。[24]
形符
Python形符有NEWLINE、INDENT、DEDENT、标识符、关键字、字面值、运算符 、分隔符等。 空白符(行终止符除外)不是形符。NEWLINE形符表示结束逻辑行;连续行的缩进层级以堆栈形式生成INDENT和DEDENT形符。[23]
标识符与关键字
Python标识符的句法基于Unicode标准附件UAX-31,并进行了一定的细化与修改。在Python 2.x中,ASCII范围内(U+0001..U+007F)的有效标识符字符为:大小写字母A至Z、下划线 _ 、数字0至 9,但不能以数字开头;而Python 3.0引入了ASCII之外的更多字符,这些字符的分类使用unicodedata模块中的Unicode字符数据库版本。标识符的长度没有限制,但区分大小写。[23]
关键字是Python中的特殊单词,不能用来进行命名操作。关键字表示将导人Python解释器中的命令。[22]Pyhton 3.10新增软关键字,即仅在特定上下文下保留的某些标识符。[23]
| False | await | else | import | pass | None | break | except |
| in | raise | True | class | finally | is | return | and |
| continue | for | lambda | try | as | def | from | nonlocal |
| while | assert | del | global | not | with | async | elif |
| if | or | yield | - | - | - | - | - |
字面值
字面值是内置类型常量值的表示法。Python中的字面值有字符串字面值、字节串字面值、格式字符串字面值与数值字面值。[23]
格式字符串字面值或称f-string是标注了 'f' 或 'F' 前缀的字符串字面值。这种字符串可包含替换字段,即以{}标注的表达式。其他字符串字面值只是常量,格式字符串字面值则是可在运行时求值的表达式。[23]
#格式字面值 age = 1 f'十年后的年龄:{age + 10}' #十年后的年龄:11
数值字面值有三种类型:整数、浮点数、虚数。数值字面值不含正负号,如-1等负数是由一元运算符 '-' 和字面值1合成的。[23]
运算符
运算符是一些特殊标记(字符序列),在Python解释器中具有一定意义。使用它们意味着进行特定的操作,如加法、减法。[22]
| + | - | * | ** | / | // | % | @ | << |
| >> | & | | | ^ | ~ | := | < | > | <= |
| >= | == | @= | |= | &= | ^= | >>= | != | - |
分隔符
标点符号(又名分隔符)用来分开不同的元素。有些分隔符来自于数学符号,另一些则来自于英语。[22]
| ( | ) | [ | ] | { | } | , | : | . |
| ; | @ | = | -> | += | -= | *= | **= | /= |
| //= | %= | @= | |= | &= | ^= | >>= | <<= | - |
数据
对象是Python中对数据的抽象。Python程序中的所有数据都由对象或对象间关系来表示。每个对象都有各自的标识号、类型和值。对象的标识号是不变的,可将其理解为该对象在内存中的地址,'is' 运算符可以比较两个对象的标识号是否相同,id() 函数能返回一个代表标识号的整数;对象的类型决定该对象所支持的操作与可能的取值,对象的类型是不可变的,type() 函数能返回一个对象的类型 (类型本身也是对象);值可以改变的对象被称为可变对象,如字典和列表,值不可以改变的对象被称为不可变对象,如数字、字符串和元组。[25]
Python的数据类型可分为数字型、序列、集合、映射。Python区分整型数、浮点型数和复数,其中整型数可细分为两种类型:整型,此类对象表示任意大小的数字,仅受限于可用的内存 (包括虚拟内存);布尔型,此类对象表示逻辑值False和True;浮点型,此类对象表示机器级的双精度浮点数;复数此类对象以一对机器级的双精度浮点数来表示复数值。序列表示以非负整数作为索引的有限有序集,可分为不可变序列与可变序列,不可变序列类型的对象一旦创建就不能再改变;可变序列在被创建后仍可被改变,包括列表与字节数组。集合类型表示由不重复且不可变对象组成的无序且有限的集合,可通过内置的 set() 构造器创建。映射表示由任意索引集合所索引的对象的集合。[25]
| 类型 | 示例 | ||
|---|---|---|---|
| 数 字 型 | 整型 | 整数(int) | -1、0、1 |
| 布尔型 (bool) | True、False[25] | ||
| 浮点型(float) 复数(complex) | 3.1415927[25] | ||
| 3+2.7j[25] | |||
| 序 列 | 不可变序列 | 字符串(str) | 'Hello'、"Hello"[25] |
| 字节串(bytes) | b'abc'[25] | ||
| 元组(tuple) | (4.0, 'string', True)、()、(1,)[26] | ||
| 可变序列 | 列表(list) | [4.0, 'string', True][26] | |
| 字节数组(bytearray) | bytearray(b'helloworld') | ||
| 集合(set) | {4.0, 'string', True}[26] | ||
| 映射 | 字典(dict) | {'key1': 1.0, 3: False}[26] | |
表达式
表达式是表达式元素的累积,如名称、属性访问、运算符或函数调用。[27]
运算表达式
Python中的运算表达式有幂次运算、一元算术和位运算、二元算术和位运算、移位运算、比较运算、布尔运算。[26]
| 类型 | 运算符 | 示例与结果 |
|---|---|---|
| 幂次运算 | 幂运算符(**) | 1**2:为对其左参数进行其右参数所指定幂次的乘方运算,结果为1 |
| 一元算术和位运算 | 负值运算符(-) | -1:会产生其数字参数的负值,结果为-1 |
| 正值运算符(+) | +(-1):会原样输出其数字参数,结果为-1 | |
| 取反运算符(~) | ~1:会对其整数参数按位取反,结果为-2 | |
| 二元算术和位运算 | 减运算符(-) | 1-2:输出参数的差,结果为-1 |
| 加运算符(+) | 1+2:输出参数的和,结果为3 ‘a’+’a’:执行序列拼接操作,结果为aa | |
| 乘运算符( * ) | 1*2:输出参数的乘积,结果为2 ‘a’*2:执行序列的重复,结果为aa | |
| 除运算符(/) | 1/2:输出参数的商,类型为float,结果为0.5 | |
| 整除运算符(//) | 1//2:输出参数的商,类型为int,结果为0 | |
| 模运算符(%) | 3%2:输出第一个参数除以第二个参数的余数,结果为1 | |
| 运算符 @ | [[1, 1], [2, 2]]@[[3, 3],[4, 4]]:矩阵乘法运算,结果为[[ 7, 7][14, 14]] | |
| 与运算符(&) | 1&2:会对参数执行按位与,结果为0 | |
| 异或运算符(^) | 1^2:会对参数执行按位异或,结果为3 | |
| 或运算符(|) | 1|2:会对参数执行按位或,结果为3 | |
| 移位运算 | 左移运算符(<<) | 1<<2:会将第一个参数左移第二个参数所指定的比特位数,结果为4 |
| 右移运算符(>>) | 1>>2:会将第一个参数右移第二个参数所指定的比特位数,结果为0 | |
| 比较运算 | 小于(<) | x<y:比较两参数值,若第一个参数小于第二参数,结果为True,否则为False |
| 大于(>) | x>y:比较两参数值,若第一个参数大于第二参数,结果为True,否则为False | |
| 等于(==) | x==y:比较两参数值,若第一个参数等于第二参数,结果为True,否则为False | |
| 大于等于(>=) | x>=y:比较两参数值,若第一个参数大于等于第二参数,结果为True,否则为False | |
| 小于等于(<=) | x<=y:比较两参数值,若第一个参数小于等于第二参数,结果为True,否则为False | |
| 不等于(!=) | x!=y:比较两参数值,若第一个参数不等于第二参数,结果为True,否则为False | |
| is | x is y:比较两个对象,若相同,结果为True,否则为False | |
| 成员运算符(in) | x in y:如果x是y的成员则求值为True,否则为 False | |
| 布尔运算 | not | not x:将在其参数为假值时产生True,否则产生 False |
| and | x and y:首先对x求值;如果x为假则返回该值;否则对y求值并返回其结果值 | |
| or | x or y:首先对x求值;如果x为真则返回该值;否则对y求值并返回其结果值 |
赋值表达式
赋值表达式为Python 3.8新增功能,有时又被称为“命名表达式”或“海象表达式”,语法形式如下:
identifier := expression
是将一个expression赋值给一个identifier,同时还会返回expression的值。[26]
#利用赋值表达式处理匹配的正则表达式 if matching := pattern.search(data): do_something(matching)
赋值表达式在被用作切片、条件表达式、lambda表达式、关键字参数和推导式中的if表达式以及在assert和with语句中的子表达式时必须用圆括号括起来。 [26]
条件表达式
条件表达式,有时称为“三元运算符”,在所有 Python 运算中具有最低的优先级。语法格式如下:
expression1 if expression2 else expression3
首先是对条件expression2求值。 如果expression2为真,expression1将被求值并返回其值;否则将对expression3求值并返回其值。[26]
a = 5 b = 10 max_value = a if a > b else b #条件表达式 print(max_value) # 输出10,因为b大于a
lambda表达式
lambda表达式,有时称为 lambda 构型,被用于创建匿名函数。 表达式lambda parameters: expression会产生一个函数对象 。该未命名对象的行为类似于用以下方式定义的函数:[26]
def <lambda>(parameters): return expression
通过lambda表达式创建的函数不能包含语句或标注。[26]
#匿名函数 add = lambda x, y: x + y print(add(3, 4)) # 输出结果为7
表达式列表
表达式列表是一组表达式的组合。除了作为列表或集合显示的一部分,包含至少一个逗号的表达式列表将生成一个元组。 元组的长度就是列表中表达式的数量。 表达式将从左至右被求值。[26]
表达式运算顺序
Python按从左至右的顺序对表达式求值。 但在对赋值操作求值时,右侧会先于左侧被求值。下表对Python中运算符的优先顺序进行了总结,从最高优先级(最先绑定)到最低优先级(最后绑定),相同单元格内的运算符具有相同优先级。[26]
| 运算符 | 描述 |
|---|---|
| ** | 乘方 |
| +x, -x, ~x | 正,负,按位非 NOT |
| *, @, /, //, % | 乘,矩阵乘,除,整除,取余 6 |
| +, - | 加和减 |
| <<, >> | 移位 |
| & | 按位与 AND |
| ^ | 按位异或 XOR |
| | | 按位或 OR |
| in, not in, is, is not, <, <=, >, >=, !=, == | 比较运算,包括成员检测和标识号检测 |
| not x | 布尔逻辑非 NOT |
| and | 布尔逻辑与 AND |
| or | 布尔逻辑或 OR |
| if -- else | 条件表达式 |
| lambda | lambda 表达式 |
| := | 赋值表达式 |
简单语句
简单语句由一个单独的逻辑行构成。 多条简单语句可以存在于同一行内并以分号分隔。[28]
表达式语句用于计算和写入值,或者调用一个过程。表达式语句会对指定的表达式列表或单一表达式进行求值。[28]
赋值语句用于将名称(重)绑定到特定值,以及修改属性或可变对象的成员项。赋值是根据目标(列表)的格式递归地定义的。 当目标为一个可变对象(属性引用、抽取或切片)的组成部分时,该可变对象必须最终执行赋值并决定其有效性,如果赋值操作不可接受也可能引发异常。 [28]
x = [1, 1] i, x[i] = 1, 2 #i先被赋值为1,然后x被赋值为2
增强赋值语句是在单个语句中将二元运算和赋值语句合为一体,对目标和表达式列表求值,对两个操作数相应类型的赋值执行指定的二元运算,并将结果赋值给原始目标。不同于普通赋值,增强赋值会在对右手边求值之前对左手边求值。[28]
x += 1 #等同于x = x + 1
assert语句是在程序中插入调试性断言的简便方式。[28]
pass语句是一个空操作,即当它被执行时,什么都不发生。 当语法上需要一条语句但并不需要执行任何代码时,可用它来临时占位。[28]
return语句会离开当前函数调用,在语法上只会出现于函数定义所嵌套的代码,不会出现于类定义所嵌套的代码。如果提供了表达式列表,它将被求值,否则以 None 替代。[28]
yield语句在语义上等同于 yield表达式。 yield 语句可用来省略在使用等效的yield表达式语句时所必须的圆括号。yield表达式和语句仅在定义generator函数时使用,并且仅被用于生成器函数的函数体内部。在函数定义中使用yield可使得该定义创建的是生成器函数而非普通函数。[28]
raise语句被用来引发一个异常。异常/错误对象必须有一个名字,且它们应是Error或Exception类的子类。[28]
break语句在语法上只会出现于for或while循环所嵌套的代码,但不会出现于该循环内部的函数或类定义所嵌套的代码。它会终结最近的外层循环,如果循环有可选的else子句,也会跳过该子句。如果一个for循环被break所终结,该循环的控制目标会保持其当前值。当break将控制流传出一个带有finally子句的try语句时,该finally子句会先被执行然后再真正离开该循环。[28]
continue语句在语法上只会出现于for或while循环所嵌套的代码中,但不会出现于该循环内部的函数或类定义中。 它会继续执行最近的外层循环的下一个轮次。当continue将控制流传出一个带有finally子句的try语句时,该finally子句会先被执行然后再真正开始循环的下一个轮次。[28]
import语句被用于导入模块。[28]
import foo # 导入foo模块
global语句是作用于整个当前代码块的声明。 它意味着所列出的标识符将被解读为全局变量。 在global语句中列出的名称不得在同一代码块内该global语句之前的位置中使用。在global语句中列出的名称不能被定义为形式参数,也不能被作为with语句或except子句的目标,以及for循环的目标列表、class定义、函数定义、import语句或变量标注等等。[28]
nonlocal语句会使得所列出的名称指向之前在最近的包含作用域中绑定的除全局变量以外的变量。这个语句允许被封装的代码重新绑定局部作用域以外且非全局(模块)作用域当中的变量。与 global语句中列出的名称不同,nonlocal语句中列出的名称必须指向之前存在于包含作用域之中的绑定。nonlocal语句中列出的名称不得与之前存在于局部作用域中的绑定相冲突。[28]
复合语句
复合语句是包含其它语句(语句组)的语句,会以某种方式影响或控制所包含其它语句的执行。 通常,复合语句会跨越多行,但在某些简单形式下整个复合语句也可能包含于一行之内。一条复合语句由一个或多个子句组成, 一个子句则包含一个句头和一个句体。 特定复合语句的子句头都处于相同的缩进层级。 每个子句头以一个作为唯一标识的关键字开始并以一个冒号结束。 子句体是由一个子句控制的一组语句,可以是在子句头的冒号之后与其同处一行的一条或由分号分隔的多条简单语句,也可以是在其之后缩进的一行或多行语句。 只有后一种形式的子句体才能包含嵌套的复合语句。[29]
if语句用于有条件的执行。它通过对表达式逐个求值直至找到一个真值,在子句体中选择唯一匹配的一个,然后执行该子句体,并且if语句的其他部分不会被执行或求值。 [29]
while语句用于在表达式保持为真的情况下重复地执行子句体,如果表达式值为假终止循环。[29]
for语句用于对序列(例如字符串、元组或列表)或其他可迭代对象中的元素进行迭代。for循环会对目标列表中的变量进行赋值。 这将覆盖之前对这些变量的所有赋值,包括在for循环体中的赋值。[29]
try语句可为一组语句指定异常处理句柄和/或清理代码。except子句指定一个或多个异常处理句柄。 当try子句中无异常发生时,将不会有任何异常处理句柄被执行。当try子句代码块中发生异常时,将启动对异常处理句柄的搜索。except* 子句被用来处理 ExceptionGroup,有多个except*子句可被执行,各自处理异常组的一部分。finally子句总是会被执行。[29]
with语句用于包装带有使用上下文管理器定义的方法的代码块的执行。[29] 上下文管理器是一个对象,它定义了在执行with语句时要建立的运行时上下文,并处理进入和退出所需运行时上下文以执行代码块。 上下文管理器的典型用法包括保存和恢复各种全局状态,锁定和解锁资源,关闭打开的文件等等。通常使用with语句,但是也可以通过直接调用它们的方法来使用[30]。
match语句用于进行模式匹配,是Python 3.10新增功能。match语句接受一个变量或表达式,并将其值与作为一个或多个case块给出的连续模式进行比较,当满足某个case的条件时,就会执行该条件下的对应代码。[29]
def语句用于定义函数,其定义的函数可以像用lambda表达式定义的函数一样被传递或赋值给其他名称,并且允许执行多条语句和使用标注。[29]
class语句用于定义类。[29]
函数
函数允许用户将一系列代码语句绑定到一个可以重复使用的表单中,将数据发送到一个函数后,可返回它对该数据所做操作的结果。[27]
函数定义与调用
函数定义由关键字def开始。用户可通过函数定义来创建用户定义函数对象。[25]语句块是构成函数对象进行计算的部分。函数定义是一条可执行语句,它执行时会在当前局部命名空间中将函数名称绑定到一个函数对象(函数可执行代码的包装器),这个函数对象包含对当前全局命名空间的引用,作为函数被调用时所使用的全局命名空间。[31] 函数定义的格式如下:
def funcname ([parameter_list]): expression
调用是函数在程序中的应用,函数定义并不会执行函数体;只有当函数被调用时才会执行此操作。[31]
函数中可能使用到的特殊关键字是return语。return表示从函数调用输出返回值。在执行return语句后函数结束。一个函数可能有多条return语句,执行的第一条return语句将结束函数。若函数没有return语句则不返回值,这种不返回值的函数通常称为过程。在这种情况下,默认返回None。[22]
生成器函数
生成器函数是一个使用yield语句的函数或方法 。 这种函数在被调用时,总是返回一个可以执行该函数体的iterator对象:调用该迭代器的iterator.__next__() 方法将导致这个函数一直运行到它使用 yield 语句提供一个值。 当这个函数执行 return 语句或到达函数体末尾时,将引发StopIteration异常并且该迭代器将到达所返回的值集合的末尾。[25]
协程函数
协程函数是使用async def来定义的函数或方法。这样的函数在被调用时会返回一个coroutine对象。它可能包含await表达式以及async with和async for语句。[25]
异步生成器函数
异步生成器函数是使用async def来定义并使用yield语句的函数或方法。这样的函数在被调用时,将返回一个asynchronous iterator对象,该对象可在async for语句中被用来执行函数体。调用异步迭代器的aiterator.__anext__ 方法将返回一个awaitable,此对象会在被等待时执行直到使用yield产生一个值。 当函数执行到空的return语句或函数末尾时,将会引发 StopAsyncIteration 异常并且异步迭代器也将到达要产生的值集合的末尾。[25]
内置函数
内置函数是对于C函数的外部封装,如 len() 和 math.sin()。内置函数参数的数量和类型由C函数决定。内置方法是内置函数的另一种形式,包含了一个传入C函数的对象作为隐式的额外参数,如alist.append(),其中alist为一个列表对象。[25]
内置函数[32]Aabs():aiter():all()anext()any()ascii()Bbin()bool()breakpoint()bytearray()bytes()Ccallable()chr()classmethod()compile()complex()Ddelattr()dict()dir()divmod()Eenumerate()eval()exec()Ffilter()float()format()frozenset()Ggetattr()globals()Hhasattr()hash()help()hex()Iid()input()int()isinstance()issubclass()iter()Llen()list()locals()Mmap()max()memoryview()min()Nnext()Oobject()oct()open()ord()Ppow()print()property()Rrange()repr()reversed()round()Sset()setattr()slice()sorted()staticmethod()str()sum()super()Ttuple()type()Vvars()Zzip()___import__()
类
类提供了把数据和功能绑定在一起的方法。[33]类是可调用对象,通常被用来创建自身实例,但也可以有重载 __new__() 的变体类型。 调用的参数会传递给 __new__(),通常也会传递给 __init__() 来初始化新的实例。任意类的实例可以通过在其所属类中定义 __call__() 方法变成可调用对象。[25] Python的类只使用了很少的新语法和语义。Python的类支持面向对象编程的所有标准特性:类的继承机制支持多个基类、派生的类能覆盖基类的方法、类的方法能调用基类中的同名方法。对象可包含任意数量和类型的数据。类支持Python动态特性:在运行时创建,创建后还可以修改。[33]
类定义
与函数定义一样,类定义必须先执行才能生效,最简单的类定义形式如下:[33]
class ClassName: <statement-1> . . . <statement-N>
类定义内的语句通常都是函数定义,但也可以是其他语句。类里的函数定义一般是特殊的参数列表,这是由方法调用的约定规范所指明的。[33]
当进入类定义时,将创建一个新的命名空间,并将其用作局部作用域。因此,所有对局部变量的赋值都是在这个新命名空间之内。函数定义会绑定到这里的新函数名称[33]。
类对象
类对象支持两种操作:属性引用和实例化。[33]
属性引用使用Python中属性引用的标准语法: obj.name。 有效的属性名称是类对象被创建时存在于类命名空间中的名称。若定义了如下的MyClass的类,那么MyClass.n和MyClass.func就是有效的属性引用,分别返回一个整数和一个函数对象。[33]
类的实例化使用函数表示法。 可以把类对象视为是返回该类的一个新实例的不带参数的函数。实例化操作("调用 "类对象)会创建一个空对象。许多类都希望创建的对象实例能定制为特定的初始状态。因此,类可能会定义一个名为 __init__() 的特殊方法。当一个类定义了 __init__() 方法时,类的实例化就会自动为新创建的类实例调用 __init__() 方法。__init__() 方法可以有参数,给类实例化操作符的参数会传递给 __init__() 方法。[33]
#定义名叫MyClass的类 class MyClass: n = 1 def func(self): return 'hello world' c = MyClass() #创建类的新实例并将此对象分配给变量c
继承
派生类定义的语法如下:[33]
class DerivedClassName(BaseClassName): <statement-1> . . . <statement-N>
派生类定义的执行过程与基类相同。 当构造类对象时,基类会被记住。 此信息将被用来解析属性引用:如果请求的属性在类中找不到,搜索将转往基类中进行查找。 如果基类本身也派生自其他某个类,则此规则将被递归地应用。[33]
派生类可能会重写其基类的方法。 因为方法在调用同一对象的其他方法时没有特殊权限,所以基类方法在尝试调用同一基类中定义的另一方法时,可能实际上调用是该基类的派生类中定义的方法。[33]
Python有两个内置函数可被用于继承机制:使用 isinstance() 来检查一个实例的类型:isinstance(obj, int) 仅会在 obj.__class__ 为 int 或某个派生自int的类时为True;使用 issubclass() 来检查类的继承关系:issubclass(bool, int) 为True,因为bool是int的子类。 但是,issubclass(float, int)为False,因为float不是int的子类。[33]
Python支持多重继承。 带有多个基类的类定义语句如下:[33]
class DerivedClassName(Base1, Base2, Base3): <statement-1> . . . <statement-N>
模块
模块是单独的Python脚本,包含一组类和函数。模块通过 import语句或者importlib.import_module() 和内置的 __import__() 等函数发起调用导入。 模块对象不包含用于初始化模块的代码对象。[25]
当一个模块首次被导入时,Python会搜索该模块,如果找到就创建一个module对象并初始化它。 如果指定名称的模块未找到,则会引发ModuleNotFoundError。 当发起调用导入机制时,Python会实现多种策略来搜索指定名称的模块。[34]
为了帮助组织模块并提供名称层次结构,Python引入了包的概念。所有包都是模块,但并非所有模块都是包。所有模块都有自己的名字。 子包名与其父包名会以点号分隔。Python 定义了两种类型的包,常规包和命名空间包。 常规包是传统的包类型,通常以一个包含 __init__.py 文件的目录形式实现,当一个常规包被导入时,这个 __init__.py 文件会隐式地被执行,它所定义的对象会被绑定到该包命名空间中的名称。命名空间包是由多个部分构成的,每个部分为父包增加一个子包,各个部分可能处于文件系统的不同位置,也可能处于 zip 文件中、网络上,或者 Python 在导入期间可以搜索的其他地方。命名空间包没有 parent/__init__.py 文件。[34]
if语句
#打印较小值 if x < y : print(x) else: print(y)
while语句
#打印小于10的正整数 x = 1 while x <10: print(x) # 1 2 3 4 5 6 7 8 9 x += 1
for语句
#打印小于10的正整数 for i in range(1, 10): print(i) # 1,2,3,4,5,6,7,8,9
try语句
#计算两数的商 x = 1 y = 0 try: result = x/y except ZeroDivisionError as e: print(e) #打印异常:division by zero raise ZeroDivisionError("除数为0") #抛出异常:ZeroDivisionError: 除数为0 print(y) #不执行 finally: #不论是否异常,都会执行子语句 print("计算商")
with语句
#打开myfile文件,并写入Hello World with open(r'myfile.txt','w') as f: a=f.write('Hello World')
match语句
#查看今天是否为工作日 import datetime #导入datetime模块 match datetime.datetime.today().weekday() + 1: #计算当天星期数并作为目标表达式 case 6 : print('今天星期六, 可以出去玩') case 7 : print('今天星期日, 可以出去玩') case _: print("今天工作日,不能出去玩")
函数和类
#定义求和函数 def func(a, b): c = a + b return c
##定义一个计算类 class calculator: def __init__(self,num1,num2): #初始化 self.num1 = num1 self.num2 = num2 print(f'我是一个简单计算器,可以计算{num1}与{num2}的和、差、积、商') def add(self): #定义加法方法 return self.num1 + self.num2 def subtract(self): #定义减法方法 return self.num1 - self.num2 def multiply(self): #定义乘法方法 return self.num1 * self.num2 def divide(self): #定义除法方法 try: return self.num1 / self.num2 except ZeroDivisionError as e: return e # 返回异常:division by zero result = calculator(1,2) #实例化计算类,参数为1和2 print(f'和为{result.add()},差为{result.subtract()},积为{result.multiply()},商为{result.divide()}') #控制台输出: #我是一个简单计算器,可以计算1与2的和、差、积、商 #和为3,差为-1,积为2,商为0.5
文本编辑器
大部分可以编辑纯文本的工具都可以用于编写Python代码,合适的编辑器可以有效减少代码编写时间,如表中所示编辑器均支持语法高亮显示,并且可以通过插件扩展到静态代码检查器(linters)和调试器。[4]
解释器
Python是一种解释型语言,不需要编译和链接,可以节省大量开发时间。它的解释器实现了交互式操作,能试用各种语言功能,编写临时程序,或在自底向上的程序开发中测试功能。[35]
集成开发环境
集成开发环境(英语:Integrated Development Environment,IDE)将进行Python开发所需的工具打包到一个用户友好的图形用户界面中,具有如构建自动化、代码校验、测试和调试等功能。[37]
| 名称 | 运行系统 | 特点 |
|---|---|---|
| IDLE | OS,Linux,Windows | 是用Tkinter编写的,包含在任何支持Tcl的平台上的安装Python文件中[38] |
| PyCharm | OS,Linux,Windows | 有免费社区版和付费专业版两个版本; 需要充足的内存和存储空间[37] |
| Jupyter | OS,Linux,Windows | 可添加自动格式化、调试、自动保存、自动编码等功能[37] |
| Spyder | OS,Linux,Windows | 完全是用Python编写的,专为数据而设计[37] |
| PyDev | OS,Linux,Windows | 具有远程调试功能,可以调试外部程序[37] |
| Visual Studio | OS,Windows | 除了默认的PEP-8样式格式化外,还有许多预先配置的格式化选项[37] |
| Thonny | OS,Linux,Windows | 调试过程中,能够单独访问局部变量表和代码指针新窗口[37] |
标准库
Python标准库包含一部分的数据类型,例如数字、序列、映射。这个库也包含了内置函数和异常,它们是不需要import 语句就可以在所有Python代码中使用的对象。此外,标准库主要是由一系列的模块组成,这些模块集可以不同方式分类。有些模块是用C编写并内置于Python解释器中;另一些模块则是用Python编写并以源码形式导入。有些模块提供专用于Python的接口;有些模块提供专用于特定操作系统的接口;另一些模块则提供针对特定应用领域的接口。有些模块在所有更新和移植版本的Python中可用;另一些模块仅在底层系统支持或要求时可用;还有些模块则仅当编译和安装Python时选择了特定配置选项时才可用。[39]
#内置异常与其层次结构 BaseException ├── BaseExceptionGroup ├── GeneratorExit ├── KeyboardInterrupt ├── SystemExit └── Exception ├── ArithmeticError │ ├── FloatingPointError │ ├── OverflowError │ └── ZeroDivisionError ├── AssertionError ├── AttributeError ├── BufferError ├── EOFError ├── ExceptionGroup [BaseExceptionGroup] ├── ImportError │ └── ModuleNotFoundError ├── LookupError │ ├── IndexError │ └── KeyError ├── MemoryError ├── NameError │ └── UnboundLocalError ├── OSError │ ├── BlockingIOError │ ├── ChildProcessError │ ├── ConnectionError │ │ ├── BrokenPipeError │ │ ├── ConnectionAbortedError │ │ ├── ConnectionRefusedError │ │ └── ConnectionResetError │ ├── FileExistsError │ ├── FileNotFoundError │ ├── InterruptedError │ ├── IsADirectoryError │ ├── NotADirectoryError │ ├── PermissionError │ ├── ProcessLookupError │ └── TimeoutError ├── ReferenceError ├── RuntimeError │ ├── NotImplementedError │ └── RecursionError ├── StopAsyncIteration ├── StopIteration ├── SyntaxError │ └── IndentationError │ └── TabError ├── SystemError ├── TypeError ├── ValueError │ └── UnicodeError │ ├── UnicodeDecodeError │ ├── UnicodeEncodeError │ └── UnicodeTranslateError └── Warning ├── BytesWarning ├── DeprecationWarning ├── EncodingWarning ├── FutureWarning ├── ImportWarning ├── PendingDeprecationWarning ├── ResourceWarning ├── RuntimeWarning ├── SyntaxWarning ├── UnicodeWarning └── UserWarning
| 名称 | 描述 |
|---|---|
| os | 提供了一种使用与操作系统相关的功能的便捷式途径 |
| shutil | 提供了一系列对文件和文件集合的高阶操作,特别是提供了一些支持文件拷贝和删除的函数。 |
| glob | 会按照 Unix shell 所使用的规则找出所有匹配特定模式的路径名称,但返回结果的顺序是不确定的 |
| sys | 提供了一些变量和函数,变量可能被解释器使用,也可能由解释器提供;函数会影响解释器 |
| re | 为高级字符串处理提供正则表达式工具 |
| math | 提供了对C标准定义的数学函数的访问 |
| random | 实现了各种分布的伪随机数生成器 |
| statistics | 提供了用于计算数字 (Real-valued) 数据的数理统计量的函数 |
| urllib.request | 定义了适用于在各种复杂情况下打开URL(主要为HTTP)的函数和类 ,如基本认证、摘要认证、重定向、cookies 及其它 |
| smtplib | 定义了一个SMTP客户端会话对象,该对象可将邮件发送到互联网上任何带有SMTP或ESMTP监听程序的计算机 |
| datetime | 提供了以简单和复杂的方式操作日期和时间的类。虽然支持日期和时间算法,但实现的重点是有效的成员提取以进行输出格式化和操作。该模块还支持可感知时区的对象。 |
| zlib | 对于需要数据压缩的应用,此模块中的函数允许使用zlib库进行压缩和解压缩。 |
| gzip | 提供的简单接口帮助用户压缩和解压缩文件 |
| bz2 | 提供了使用bzip2压缩算法压缩和解压数据的一套完整的接口 |
| timeit | 提供了一种简单的方法来计算一小段Python代码的耗时 |
| profile | 提供了Python程序的确定性性能分析 |
| doctest | 寻找像Python交互式代码的文本,然后执行这些代码来确保它们的确就像展示的那样正确运行 |
| unittest | 支持测试自动化,配置共享和关机代码测试。支持将测试样例聚合到测试集中,并将测试与报告框架独立。 |
| xmlrpc.client | 支持编写 XML-RPC 客户端代码;它会处理在通用 Python 对象和 XML 之间进行在线翻译的所有细节 |
| xmlrpc.server | 为以Python编写XML-RPC服务器提供了一个基本服务器框架 |
| 是一个用于管理电子邮件消息的库 | |
| smtplib | 定义了一个SMTP客户端会话对象,该对象可将邮件发送到互联网上任何带有SMTP或ESMTP监听程序的计算机 |
| json | 提供了数据交换格式json的API接口 |
| csv | 实现了 CSV 格式表单数据的读写 |
| xml.sax | 提供多个模块,它们在Python 实现了用于XML(SAX)接口的简单API |
| sqlite3 | 是SQLite数据库库的包装器,提供了一个可以使用稍微非标准的SQL语法更新和访问的持久数据库 |
| gettext | 为Python模块和应用程序提供国际化(Internationalization, I18N)和本地化 (Localization, L10N)服务 |
| locale | 开通了POSIX本地化数据库和功能的访问 |
| codecs | 定义了标准Python编解码器(编码器和解码器)的基类并提供对内部Python编解码器注册表的访问,该注册表负责管理编解码器和错误处理的查找过程 |
| reprlib | 提供了一种对象表示的产生方式,它会对结果字符串的大小进行限制 |
| pprint | 提供了“美化打印”任意 Python 数据结构的功能,这种美化形式可用作对解释器的输入 |
| textwrap | 提供了一些快捷函数,以及可以完成所有工作的类 TextWrapper |
| locale | 开通了 POSIX 本地化数据库和功能的访问 |
| string | 提供字符串的相关操作 |
| struct | 该模块在Python值和表示为Python字节对象的C结构之间进行转换 |
| _thread | 提供了操作多个线程(也被称为轻量级进程 或任务)的底层原语 —— 多个控制线程共享全局数据空间。为了处理同步问题,也提供了简单的锁机制(也称为互斥锁或二进制信号) |
| threading | 基于_thread 提供了更易用的高级多线程 API |
| queue | 实现了多生产者、多消费者队列 |
| logging | 为应用与库实现了灵活的事件日志系统的函数与类 |
| weakref | 允许Python程序员创建对象的弱引用 |
| array | 定义了一种对象类型,可以紧凑地表示由基本值(字符、整数、浮点数)组成的数组 |
| collections | 实现了一些专门化的容器,提供了对Python的通用内建容器dict、list、set和tuple的补充 |
| bisect | 对有序列表提供了支持,使得他们可以在插入新数据仍然保持有序 |
| heapq | 提供了堆队列算法的实现,也称为优先队列算法 |
| decimal | 支持快速、正确取整的十进制浮点运算 |
GUI
图形用户界面(GUI)是用户与软件程序交互图形界面。Python拥有一些GUI工具包,因此可以被应用于GUI工作。[42]
Tkinter
Tkinter是Python标准库自带的GUI工具包。它提供了GUI应用所需要的几乎所有功能部件,如:按钮、文本、输入框、标签、复选框等,它的文本和画布小部件足够强大,可以实现网页、三维可视化和动画。因为它基于为脚本语言开发的库,Tkinter是一个相对轻量级的工具包,因此它与Python等脚本语言很好地结合在一起。Tkinter易学易用,支持多平台操作系统。[42]
wxPython
wxPython是一个开源免费的Python GUI库,支持多种平台。它是基于C++ GUI库wxWidgets开发的,因此它比Tkinter更复杂,提供了数百个类,通常需要面向对象的编码风格。wxPython提供了比Tkinter更丰富小部件,如HTML查看器。[42]
PyQt
PyQt是Qt工具包的Python接口,它是一个功能齐全的GUI库,目前可在Windows、Mac OS 、Unix和Linux上运行。与wxPython一样,PyQt通常比Tkinter更复杂,但功能更丰富:它包含数百个类以及数千个函数和方法。BlackAdder和Qt Designer系统为PyQt提供GUI构建程序。[42]
数据分析
Python有用于数据分析的第三方库,其中常用的有Numpy、Pandas、Matplotlib等。[43]
NumPy
NumPy是Python科学计算的基础工具包。主要功能有:Ndarray,一个多维数组,提供了高效的存储效率和矢量运算能力;可以快速对某个数据块进行某种运算,而无需取出单个元素进行操作;可对磁盘和内存文件进行操作;有标准的数学库函数功能。此外,Numpy提供了一个C API,因此很容易将数据传递给由低级语言编写的外部库,外部库也能以Numpy数组的形式将数据返回给Python。[43]
Pandas
Pandas含有多种数据结构如DataFrame、Series等。Pandas是以Numpy为基础构建的,因此以Numpy为中心的应用,如果使用Pandas进行实现,将变得简单高效。Pandas主要功能有:具备按轴自动或显式数据对齐功能的数据结构;集成时间序列功能;提供的数据结构既能处理时间序列也能处理非时间序列;数学运算和约简可以轴向执行;强大的缺失数据处理功能;合并常见数据库中的关系型运算;一些数据标准化和数据转换的功能等。[43]
Matplotlib
Matplotlib是一个2D Python绘图库,该库可以绘制具有出版质量的、跨平台的、具有交互性的数据描述图。在数据分析中,可以使用Matplotlib呈现对数据的分析处理过程, 形象地展示数据分析的结果。 [43]
测试
Python标准库中包含单元测试模块,可以用来测试Python代码的质量和正确性。[44]
unittest
unittest模块支持测试的自动化处理,可以共享代码测试的初始化和结束代码、将测试用例封装成一个测试套件以及测试的多元化显示。unittest模块支持单元测试的各种重要概念,其中最重要的概念是测试用例。unittest模块提供了TestCase基类,用来创建新的测试用例。在unittest模块中还有一个测试运行器,用来运行这些测试并为用户提供输出结果。unittest测试框架中使用TestRunner类来为测试的运行提供环境。[44]
doctest
doctest模块可以利用代码注释中的文档内容,这种处理方式使得文档可以作为测试代码来执行。doctest作为一种测试框架,可以实现文档和代码的同步,并可以作为书写教程的一个工具。另外,可以将文档字符串变成可执行文档,从而完成对代码的测试。[44]
Web开发
Web开发框架定义了一系列关于Web开发的处理方式和模板,使Web开发人员更加关注于应用的业务逻辑。在Python 语言中,有多种Web开发框架。[44]
Zope
Zope是主要使用Python语言开发的开放源代码Web应用服务器,可以运行在包括 Linux、Windows 等多种系统平台上。其使用组件模式开发,可以很方便地加入所需的模块。它的主要功能包括多种数据库适配器、内置的Web服务器、多协议支持、索引和查找、内置安全模型和集群等。[44]
TurboGears
TurboGears框架的目的是将现在各个层次中最优秀的组件组合起来,形成一个简单易用、对用户友好的框架。通过组合方式,使得Web开发者可以使用Python中各个层次被推荐的模块。用户也可以通过修改对部分组件进行替换。这种整合方式,使得TurboGears框架提供了Web开发从前端到后端的整合。[44]
Django
Django是一个完整的快速Web开发框架。在Django框架中包含开发Web网络应用所需的组件,这些组件包括数据库的对象关系映射、动态内容管理的模板系统和富的管理界面。在 Django架中没有使用像TurboGears框架中那样的第三方Python 模块。在 Django框架中可以使用管理脚本文件manage.py、mob_Python或者FastCGI模块来构建简单的开发服务器。[44]
图像处理
Python有第三方模块提供了图像处理功能。[44]
PythonMagick
PythonMagick是一个ImageMagick软件包的Python绑定。ImageMagick是一款可以运行在多种系统平台下的用来创建、编辑和合成位图的软件库。使用ImageMagick图像处理套件可以转换、旋转缩放、裁剪图像,也可以对图像进行色彩处理等操作。除此之外,还可以在图像上实现一些特殊的效果包括在位图上写字和画上一些简单的图形。PythonMagick作为ImageMagick套件的Python语言绑定,实现了ImageMagick套件的功能。可以通过使用PythonMagick来实现对图形图像的处理,如裁剪等操作。[44]
OpenCV
OpenCV(Open Source Computer Vision)库是一个用于计算机视觉处理方面的图像库。它关注于对图像进行高级处理的功能,包括人脸识别、动作识别和轨迹建模等。OpenCV库有Python语言的绑定,可以通过Python来访问OpenCV所提供的功能。[44]
网络编程
Socket编程是实现网络应用程序的基础。Python标准库有socket模块,支持套接字接口。该模块中有生成套接字、等待连接、建立连接和传输数据的方法。[44]
Python的Twisted框架适合编写服务器端的应用程序,提供了异步通信机制。Twisted 框架是由模块化的件组成的,这些模块化元素包括协议、工厂、反应器(reactor)和Deferred对象等。[44]
游戏开发
参考资料 44
- https://sc.panda321.com/#v=onepage&q&f=false
- https://assets.digitalocean.com/books/python/how-to-code-in-python.pdf
- https://ds.amu.edu.et/xmlui/bitstream/handle/123456789/8218/Making%20Use%20Of%20Python%20(2002).pdf?sequence=1&isAllowed=y
- https://sc.panda321.com/#v=onepage&q&f=false
- https://www.nnho.ng/NoticeToMariners/0802-python-tutorial.pdf
- http://atk.fam.free.fr/fichiers/stage/Python/JF/site/pytut.pdf
- 历史和许可证 — python3.11.4文档
- Python 2.0 有什么新变化 — python3.11.4文档
- 参考 9
- 更新日志 — Python 3.11.5 文档
- TIOBE index — TIOBE
- General Python FAQ — Python 3.11.5 Documentation
- Python 2.0 有什么新变化 — Python 3.11.5 文档
- Python 2.7 有什么新变化 — Python 3.11.5 文档
- Status of Python Versions — Python Developer's Guide
- Python 3.0 有什么新变化 — Python 3.11.5 文档
- Python 3.5 有什么新变化 — Python 3.13.0a0 文档
- Python 3.6 有什么新变化 — Python 3.13.0a0 文档
- Python 3.7 有什么新变化 — Python 3.11.5 文档
- Python 3.10 有什么新变化 — Python 3.11.5 文档
- Python 3.11 有什么新变化 — Python 3.11.5 文档
- 参考 22
- 词法分析 — Python3.11.4文档
- 参考 24
- 数据模型 — Python 3.11.4文档
- 表达式 — Python 3.11.4文档
- 参考 27
- 简单语句 — Python 3.11.4文档
- 复合语句 — Python 3.11.4文档
- 数据模型 — Python 3.11.5文档
- 复合语句 — Python 3.11.4文档
- 内置函数 — Python 3.11.4文档
- 类 — Python 3.11.4文档
- 导入系统 — Python 3.11.4文档
- 课前甜点 — Python 3.11.5 文档
- 概述 — Python 3.11.5 文档
- https://www.researchgate.net/publication/357898994_A_Review_on_Python_Libraries_and_IDEs_for_Data_Science
- EDU-SIG: Python in Education — Pyhton
- Python标准库 — Python 3.11.4文档
- 标准库简介 — Python 3.11.5 文档
- 标准库简介 —— 第二部分 — Python 3.11.5 文档
- 参考 42
- 参考 43
- 参考 44
注释
- 默认情况下,弃用时间安排在第一次发布后5年,但可以由每个分支机构的发布经理进行调整[15]