Python
Python(英國發音:/ˈpaɪθən/ 美國發音:/ˈpaɪθɑːn/)是一种广泛使用的解释型、高级和通用的编程语言。Python支持多种编程范型,包括函数式、指令式、结构化、面向对象和反射式编程。它拥有动态类型系统和垃圾回收功能,能够自动管理内存使用,并且其本身拥有一个巨大而广泛的标准库。
多范型:函数式、 | |
設計者 | 吉多·范罗苏姆 |
實作者 | Python软件基金会 |
1991年 | |
穩定版本 | 3.9.2[1]
(2021年2月19日,2天前
) |
預覽版本 | 3.10.0a5[2]
(2021年2月3日,18天前
) |
型態系統 | 鸭子类型, 动态, 渐进(自从3.5)[3] |
作業系統 | 跨平台 |
許可證 | Python软件基金会许可证 |
文件扩展名 | .py、.pyi、.pyc、.pyd、.pyo(3.5之前)[4]、.pyw、.pyz(自从3.5)[5] |
網站 | |
主要實作產品 | |
CPython、 | |
衍生副語言 | |
Cython、RPython、Starlark | |
啟發語言 | |
ABC、 | |
影響語言 | |
Boo、 | |
Python由吉多·范罗苏姆创造,第一版发布于1991年,它是ABC语言的后继者,也可以視之為一種使用传统中缀表达式的LISP方言[6]。
Python的设计哲学强调代码的可读性和简洁的语法,尤其是使用空格缩进划分代码块。相比於C或Java,Python让开发者能够用更少的代码表达想法。不管是小型还是大型程序,该语言都试图让程序的结构清晰明瞭。
Python解释器本身几乎可以在所有的操作系统中运行。Python的官方直譯器CPython是用C语言编写的,它是一個由社群驱动的自由软件,目前由Python软件基金会管理。
歷史
Python的創始人為吉多·范羅蘇姆,当时他在阿姆斯特丹的荷兰数学和计算机科学研究学会工作。1989年的聖誕節期間,吉多·范羅蘇姆為了在打發时间,決心開發一個新的腳本解釋程式,作為ABC語言的一種繼承,替代使用Unix shell和C语言进行系统管理,担负同Amoeba操作系统的交互和异常处理[7]。之所以選中Python作為程式的名字,是因為他是BBC電視劇——《蒙提·派森的飛行馬戲團》(Monty Python's Flying Circus)的愛好者[8]。范羅蘇姆作为Python的主要開發者独自担负这个项目的职责,直到2018年7月12日,他宣布从作为終身仁慈獨裁者(BDFL)的职责上“永久休假”,Python社群向他授予这个头衔反映了他长期担任整個Python語言的發展方向的决策者[9][10]。他在2019年1月至11月于参与了一个五人掌控委员会继续领导项目发展[11][12]。
在1991年2月,范羅蘇姆发布了最初代码(标记为版本0.9.0)于alt.sources[13],这时就已经存在了带继承的类、异常处理、函数和核心数据类型list
、dict
、str
等。在这个最初发行中就有了从Modula-3引进的模块系统[14],它的异常模型也类似于Modula-3,但增加了else
子句[7]。在1994年1月Python达到了版本1.0。这个发行版主要新特征是包括了函数式编程工具lambda
、map
、filter
和reduce
[15]。Python 1.4增加了受Modula-3启发的关键字参数和对复数的内建支持,还包含采取名字修饰的一种基本形式的数据隐藏[16]。
Python 2.0於2000年10月16日發布,介入了列表推导式,这是从函数式编程语言SETL和Haskell中引入的。它还向垃圾收集系统增加了环检测算法,并且支持Unicode[17]。Python 2.1支持了嵌套作用域,就像其他静态作用域语言一样[18]。Python 2.2的重大革新是将Python的类型(用C写成)和类(用Python写成)统一入一个层级,使得Python的对象模型成为纯粹和一致的面向对象的模型[19];还增加了迭代器[20],受CLU和Icon启发的生成器[21],和描述器协议[22]。Python 2.4加入了集合数据类型,和函数修饰器[23]。Python 2.5加入了with
语句[24]。
Python 3.0於2008年12月3日發布,它对语言做了较大修订而不能完全后向兼容[25]。Python 3发行包括了2to3
实用工具,它(至少部份的)自动将Python 2代码转换成Python 3代码[26]。Python 3的很多新特性後來也被移植到舊的Python 2.6/2.7版本中[27]。
Python 2.7的产品寿命结束日期最初设定为2015年,出于对大量的现存代码不能前向移植到Python 3的关切而延期至2020年[28][29]。随着Python 2的产品寿命结束,只有Python 3.6.x[30]和后续版本仍被支持。
在2020年12月,活跃的Python核心开发者选举Barry Warsaw、Brett Cannon、Carol Willing、Pablo Galindo Salgado和Thomas Wouters为2021年度“掌控委员会”的五位成员来领导这个项目[31]。
特徵與設計哲學
Python是多范型编程语言。它完全支持结构化编程和面向对象编程,还有很多特征支持函数式编程和元编程包括元类[32]和元对象(魔术方法)[33]。通过扩展还可以支持很多范型,包括面向切面编程[34]、契约式设计[35]和逻辑编程[36]。
Python使用动态类型,在内存管理上采用引用计数和环检测相结合的垃圾收集器[37]。它的特征还有动态名字解析(后期绑定),即在程序执行期间绑定方法和变量的名字。
Python對遵循Lisp傳統的函数式编程提供了有限的支持[38],它提供了 map
、filter
和reduce
函数;列表推导式、字典、集合和生成器表达式[39]。標準庫中有兩個模組(functools和itertools)实现了从Haskell和Standard ML取来的函數式工具[40]。
Python的設計哲學是“優雅”、“明確”、“簡單”。它的重要準則被稱為「Python之禅」。在Python解釋器内運行import this
可以獲得完整的列表,下面是其中首要:
- 优美优于丑陋。明瞭优于隐晦。
- 简单优于复杂。复杂优于凌乱。
- 扁平优于嵌套。稀疏优于稠密。
- 可读性很重要。
Python開發者的哲學是“用一種方法,最好是只有一種方法來做一件事”,显著不同于擁有“不止一种方法去做一件事”風格的語言例如Perl。在設計Python語言時,如果面臨多種選擇,Python開發者一般會拒绝花俏的語法,而選擇明確没有或者很少有歧義的語法。
范羅蘇姆认为ABC語言非常優美和强大,并没有成功的原因是非開放造成的[41],故而将Python本身設計為可擴充的。Python並不把所有的特性和功能都集成到語言核心,而是提供了豐富的API和工具,以便程式設計師能够輕鬆地使用C、Cython來編寫擴充模組,因此很多人使用Python將其他語言編寫的程式進行集成和封裝。Python編譯器本身也可以被集成到其它需要腳本語言的程式内。
Python開發人員盡量避開不成熟或者不重要的優化。一些針對非重要部位的加快運行速度的補丁通常不會被合併到Python的官方实现CPython中。在某些對運行速度要求很高的情況,Python設計師可以使用JIT技术的PyPy,或者是将Python脚本翻译成C的Cython,还可以将时间关键的函数迁移至用C語言编写的扩展模块中。
語法
Python的設計目標之一是讓程式碼具備高度的可閱讀性。它設計時盡量使用其它語言經常使用的標點符號和英文單字,讓程式碼看起来整潔美觀。Python语句之后的分号是可选的,作为动态语言不需要書寫“聲明”語句,不同於其他的靜態語言如C、Pascal。
縮排
Python語言利用縮排表示語句塊的開始和結束(越位規則),而非使用大括號或者某種關鍵字。增加縮排表示語句塊的開始,而減少縮排則表示語句塊的結束。根據PEP 8的規定[42],使用4個空格來表示每級縮排。[lower-alpha 1]
使用Tab字符和其它數目的空格雖然都可以被解釋器識別,但不符合編碼規範,偏向使用Tab字符的程序員可以設置文本編輯器將Tab鍵轉換為4個空格。縮排成為了語法的一部分,並且Python開發者有意讓違反了「縮排規則」的程序不能通過解釋。
关键字
Python有如下35个关键字或“保留字”;它们不能用作标识符[43][44]:
- 注释
- 从Python 3.5开始,介入了
async
和await
[45]。 - 从Python 3开始,介入了关键字
True
、False
和nonlocal
。
标识符
标识符就是名字,在ASCII范围内(U+0001..U+007F),可用于标识符的字符为:大写字母A
至Z
和小写字母a
至z
,下划线_
以及数字0
至9
,但首字不可以用数字。有如下命名约定[46]:
語句和控制流
Python的语句包括:
- 赋值语句,记号为等号
=
。Python支持并行赋值,可以同时给多个变量赋值,还可以交换两个变量的值。[lower-alpha 2] del
语句,递归的进行删除。pass
語句,充当NOP,表示此行為空,不執行任何操作。assert
語句,用於程式調適階段時測試執行條件是否滿足。if
語句,當條件成立時執行語句塊。經常與elif
、else
配合使用。for
語句,遍历列表、字符串、字典、集合等迭代器,依次處理迭代器中的每個元素。while
語句,當條件為真時,循環執行語句塊。break
语句,从循环中退出。continue
语句,越过这次迭代并继续进行下个项目。try
語句,與except
、else
、finally
配合使用,處理在程式執行中出现的異常情況。raise
语句,抛出一个异常。class
語句,用於定義類,它执行一块代码并将它的局部名字空间附属至一个类。def
語句,用於定義函數和方法。return
语句,用来从函数返回值。yield
语句,使用它从一个生成器中返回一个值。[lower-alpha 3]在版本2.5之前,生成器是惰性迭代器,信息是单向的从生成器传递出来的。自从版本2.5,yield
也是一个有返回值的运算符,能够将信息传递回到生成器函数中[48]。自从版本3.3,信息可以传递通过多个堆栈层级[49]。with
語句,把一块代码包裹在一个上下文管理器之内。例如,在一块代码执行之前获取一个锁并且在此后释放这个锁,或打开一个文件并且在此后关闭它。它允许了资源获取即初始化(RAII)式行为并可替代常见的try
/finally
惯用法[50]。import
语句,导入一个模块或包。有三种用法:import <模块名字> [as <别名>]
,from <模块名字> import *
,from <模块名字> import <定义1> [as <别名1>], <定义2> [as <别名2>], ...
。
在Python中赋值语句所进行的操作是将一个名字绑定为到一个分立的、动态分配的对象的一个引用。因为名字的存储位置不“包含”这个指示的值,称它为“变量”是不准确的。这个名字可以随后在任何时候重新绑定到极大不同的各种类型的对象上,包括字符串、过程、具有数据和方法的复杂对象等等。因为名字是通用的引用持有者,给它关联一个固定的数据类型是不合理的。但是在给定时间一个名字总是被绑定到有一个类型的某个对象上,因此这是动态类型。接连的把一个共同的值赋值给多个名字,比如x = 2; y = 2; z = 2
,导致给3个名字和1个数对象分配存储,这3个名字都绑定到这1个数对象上。Python赋值语句的这种基础机制,不同于传统指令式编程语言比如C中的赋值,在这里右手侧的值被复制到给这个变量分配的存储位置之中,等号左手侧的变量名字是其符号地址,对为它声明的类型而言分配给它的内存是足够大的。
Python支持并广泛使用异常处理作为检测错误状况和程序中其他“异常”事件的方式。Python风格提倡在可能出现错误状况的任何时候都使用异常。在Python中习惯上不在使用之前对访问一个文件或资源进行测试,而是先行尝试使用它,再捕获访问被拒绝引发的异常。[lower-alpha 4]
经常为此援引的格言是葛麗絲·霍普贡献的EAFP[51]:“请求原谅比许可更容易”[52][53]。Python使用with
语句处理资源[54],在进入一个作用域的时候调用一个函数而在离开它的时候调用另一个函数。这能防止忘记移除资源并且还可处理更复杂的状况比如异常。[lower-alpha 5]
Python不支持尾调用优化或第一类续体,并且根据吉多·范罗苏姆,永远都不会加以支持[55][56]。但是,在版本2.5中通过扩展Python的生成器,提供对协程式功能的更好的支持[48]。[lower-alpha 6]版本3.4介入了综合性的异步I/O框架标准化,在其中扩展了利用子生成器委托的协程[57],这个扩展自从Python 3.8被弃用[58]。Python 3.5通过async/await语法介入了对协程的显式支持[59]。从版本3.7开始async/await成为保留关键字[60]。[lower-alpha 7]
模块是定义可以被导入并重用于其他Python程序中的函数和类的Python正规.py文件[61]。import
语句找到一个模块,装载它,如果有需要的话初始化它,并且定义用来引用这个模块中代码的一个名字或一些名字[62]。from...import
语句,找到、装载、必需时初始化一个模块,接着增加模块引用到局部名字空间,允许访问其中的函数和类而不用到模块引用[62]。from ... import
支持*
选项来导入所有引用而非指名的特定函数或类[61]。当模块被导入的时候,__name__
变量被设置成这个模块的名字。在Python解释器直接运行一个模块的时候,__name__
变量被设置为"__main__"
。这允许被设计用于导入的模块增加只在模块被直接运行时候执行的代码[61][63]。dir()
函数返回在当前局部作用域中或参数指定的对象中的名字的列表[64]。
表达式
Python中很多表达式与C和java类似,而另一些则与之不同。
- 在Python中,算术运算的加法
+
、减法-
、乘法*
和取模%
是与C和java相同的,但是除法的行为不同。在Python中有两种除法,它们是下取整除法(或整数除法)//
和浮点除法/
[65] 。Python增加了指数算符**
。Python有如下必须用于整数的位运算:&
与(AND),|
或(OR),~
非(NOT),^
异或(XOR),>>
右移,<<
左移。自从Python 3.5,介入了新的@
中缀算符。它意图用于库比如NumPy中的矩阵乘法[66][67]。
- 在Python中,有如下比较运算:大于
>
,小于<
,等于==
,不等于!=
,小于等于<=
,大于等于>=
。==
按值比较,对比于Java,它按值比较数[68]而按引用比较对象[69](在Java中比较对象的值可以采用equals()
方法)。Python的is
、is not
算符可以用来比较对象的同一性(按引用比较),也就是比较两个变量是否引用了同一个对象。而in
、not in
用于判断一个对象是否属于另外一个对象。在Python中,比较是可以链接起来的,比如a <= b <= c
。
- Python使用
and
、or
、not
表示逻辑运算与、或、非,不采用Java和C中所用的符号&&
、||
、!
。
- 自从Python 3.8,介入了“指派表达式”语法
:=
。它也叫做“命名表达式”或“海象”,它将一个表达式指派给一个标识符,同时还返回这个表达式的值,常用作更大的表达式的一部份[70]。
- Python支持列表推导式。[lower-alpha 8]Python 2.4将列表推导式扩展至更一般性的生成器表达式[39]。[lower-alpha 9]Python 3.0和2.7又补全了字典推导式和集合推导式。[lower-alpha 10]
- Python的匿名函数实现为
lambda
表达式。匿名函数体只能是一个表达式。[lower-alpha 11] - Python的条件表达式表示为
x if c else y
。意思是当c
为真时,表达式的值为x
,否则表达式的值为y
。 在运算数的次序上不同于很多其他语言中常见的c ? x : y
。
- Python区分列表(list)和元组(tuple)两种类型。列表的写法是
[1,2,3]
,而元组的写法是(1,2,3)
。在没有歧义的情况下,元组的圆括号是可选的[71]。列表是可变的,并且不能用作字典的键(Python中字典的键必须是不可变的)。元组是不可变的,因而可以用作字典的键,假定这个元组的所有元素都是不可变的话。可以使用+
算符来串接二个元组,这不会直接修改它们的内容,而是产生包含给定元组二者的元素的一个新元组。因此,给定变量t
初始时等于(1, 2, 3)
,执行t = t + (4, 5)
时,首先求值t + (4, 5)
,它产生(1, 2, 3, 4, 5)
,接着赋值回到t
,这在效果上“修改了”t
的内容,尽管这还是遵守了元组对象的不可变本性。
- Python有“序列解包”特征,多个表达式,其中每个都可求值成能被赋值的东西(变量、可写的属性等),以与形成元组文字(literal)相同的方式,关联起来作为一个整体,放置在赋值语句等号的左手侧。这个语句预期在等号的右手侧有一个“可迭代”对象,在迭代它的时候产生同左手侧给出的可写表达式相同数目的值,这个语句对它进行迭代并把每个产生的值赋值给左手侧对应的表达式[72]。这个特征允许从一个单一函数返回多个值。自从Python 3.5,增加了在表达式列表中的“可迭代解包”
*
和在字典显示中的“字典解包”**
。[lower-alpha 12] - Python拥有“字符串格式”算符
%
。这个功能类同于C中的printf
格式化字符串,比如"spam=%s eggs=%d" % ("blah", 2)
求值成"spam=blah eggs=2"
。在Python 3和2.6+中,这通过str
类的format()
方法来提供,比如"spam={0} eggs={1}".format("blah", 2)
。Python 3.6增加了“f-字符串”[73]:blah = "blah"; eggs = 2; f'spam={blah} eggs={eggs}'
。[lower-alpha 13] - Python拥有各种字符串文字:
- 由单引号
'
或双引号"
界定的字符串。不同于Unix shell、Perl和受Perl影响的语言,单引号和双引号功能相同。这二种字符串都使用反斜杠\
作为转义字符。在Python 3.6中字符串插值可作为“格式化字符串”而获得到[73]。 - 三引号字符串,开始和结束于三个单引号或双引号的序列。它们可以跨越多行,其功能就像shell、Perl和Ruby中的here文档。[lower-alpha 14]
- 原始字符串变体,用给字符串文字前导一个
r
来指示。转义序列不被解释,因此在文字反斜杠常见的地方很有用,比如正则表达式和Windows风格的路径。[lower-alpha 15]可比较于C#中的“@
-引用”。
- 由单引号
- Python允许连续出现和只用空白分隔(包括换行)的字符串文字(可能使用了不同的引用约定),它们被聚合成一个单一的更长的字符串[74]。[lower-alpha 16]
- Python拥有在列表上的数组索引和数组分片表达式,表示为
a[key]
、a[start:stop]
或a[start:stop:step]
。索引是基于零的,负数是相对于结尾的。分片从“开始”(start)索引直到但不包括“停止”(stop)索引。分片的第三个参数叫做“步长”(step)或“间隔”(stride),允许元素被跳过和用负数指示反向。分片索引可以省略,例如a[:]
,这返回整个列表的一个复本。[lower-alpha 17]分片的每个元素都是浅层复制的。
在Python中,在表达式和语句之间的区别是严格强制性的,对比于语言如Common Lisp、Scheme或Ruby。这导致重复了某些功能。比如:列表推导式对当for
循环。条件表达式对当if
块。eval()
对当exec()
内建函数(在Python 2中,exec
是语句);前者用于表达式,后者用于语句。
语句不能成为表达式的一部份,所以列表和其他推导式或lambda表达式,都是表达式,不能包含语句。这个限制的一个特定情况是赋值语句比如a = 1
,不能形成条件语句的条件表达式的一部份。这能够避免一个经典的C错误,即在条件中把等于算符==
误写为赋值算符=
,if (c = 1) { ... }
在语法上是有效(但可能非预期)的C代码,而if c = 1: ...
在Python中导致一个语法错误。
函数
Python的函数支持递归和闭包[lower-alpha 18]及其他头等函数特征,但不支持函数重载。Python的函数作为第一类对象,具有和普通对象平等的地位。Python的函数实际参数与形式参数之间的结合是传递“对象的引用”,就是把形式参数名字绑定到实际参数名字所引用的对象上。如果形式参数绑定到一个可变的对象,则通过形式参数对此对象内容的修改,在函数外也是可见的。如果形式参数绑定到一个不可变的对象,则通过形式参数是不能修改此对象内容,但可以把形式参数重新绑定到其它对象上,这并不影响函数外的对象的值。[lower-alpha 19]
Python的变量有函数作用域、模块作用域和全局作用域。简单访问(不赋值)一个变量的时候,名字解析服从窄到宽的LEGB(局部、包围、全局、内建)顺位规则。在函数中赋值一个变量将导致它成为这个函数的局部变量,就是说它的作用域在整个函数中,而不是在这个赋值之后至这个函数结束,因此在这个赋值之前引用它,不再于这个函数之外查找同名变量而是引发一个错误。缺省的名字解析规则可以用global
或nonlocal
关键字来覆盖。global
声明的变量是全局变量。[lower-alpha 20]
global
可以用于嵌套的函数中。嵌套函数中还可以使用nonlocal
声明,用于赋值到给非局部变量。[lower-alpha 21]
Python可以指定形式参数的缺省值,在函数定义时于形式参数序列中以param=value
样式进行一次性初始化。形式参数在初始化之后保持既有绑定,函数的后续调用可继续对它进行访问或变更。[lower-alpha 22]在函数调用时为有缺省值的形式参数提供实际参数是可选的。Python支持位置实际参数和关键字实际参数。函数调用时,实际参数可以如同C语言那样按照位置与形式参数匹配;也可以采用命名参数(或称为关键字实际参数),即kwarg=value
样式的实际参数。在一个函数调用的实际参数序列中,关键字实际参数必须出现在位置实际参数之后。[lower-alpha 23]
在位置和关键字形式参数序列末尾可以分别有*args
或**kwargs
这样的形式参数,它们对应于在函数调用时提供的,超出形式参数序列规定而无所对应的多个实际参数;在形式参数名字前加一个*
号,该形式参数args
是tuple
类型,对应可变数目的位置实际参数;在形式参数名字前加**
号,该形式参数kwargs
是dict
类型,对应可变数目的关键字实际参数。[lower-alpha 24]在位置实际参数已经在一个序列类型如列表或元组的对象中的情况下,在引用它的变量前加一个*
号传递给函数,则其中所有元素解包为多个位置实际参数,关键字实际参数在字典中则加**
号来传递给函数。
修饰器(decorator)是用来修改一个函数、方法或类定义的任何可调用Python对象。将正被定义的最初对象传递给修饰器,它返回一个修改后的对象,接着把它绑定到在定义中那个名字。Python修饰器部份受到Java注解的影响,而有类似的语法;修饰器语法是纯粹的语法糖,使用@
作为关键字形成修饰符。修饰器是一种形式的元编程,它们增强它们所修饰的函数或方法的行动。[lower-alpha 25]
多个修饰器可以链接起来,通过在毗连的行上放置多个修饰符,或者使用中间变量。[lower-alpha 26]
函数修饰器的正规用法包括:用来建立类方法或静态方法[75],增加函数特性,跟踪,设置先决条件和后置条件,同步[76];此外更远大的用法包括:尾调用消除[77],记忆化甚至改进修饰器的写作[78]。
为了增强代码的可读性,可以在函数后书写“文档字符串”(简称docstrings),用于解释函数的作用、参数的类型与意义、返回值类型与取值范围等。可以使用内置函数help()
打印出函数的使用帮助。[lower-alpha 27]Python 3.5支持类型提示,可以注释函数的参数与返回值。此特性可方便IDE对源代码进行更深入的分析。[lower-alpha 28]
对象及其方法
Python支持大多数面向对象编程技术。在Python中所有东西都是对象,包括类、函数、数和模块。它允许多态性,不只是在类层级之内而且通过采用鸭子类型的方式。任何对象可以用于任何类型,只要它有适当的方法和特性(attribute)就能工作。Python天然支持类的继承包括多重继承,为此采用C3线性化或方法解析次序(MRO)算法,还支持mixin。Python支持元类,它是增进类的功能的高级工具。
对象的方法是附属于这个对象的类的函数。对于正常的方法和函数,语法instance.method(arguments)
,是Class.method(instance, arguments)
的语法糖。Python的方法有显式的self
形式参数用来访问实例数据,对比于在其他一些面向对象编程语言(比如C++、Java、Objective-C或Ruby)中隐式的self
或this
关键字[79]。在Python中,self
可以被看作是一个习惯用法,它可以被换为任何其它合法的参数名。[lower-alpha 29]
在Python中,当一个子类的方法覆盖了超类方法的时候,通过调用super(Subclass, self).method
来调用与子类的self.method
方法同名超类方法[80]。[lower-alpha 30]
Python支持一些以__
开始和结束的特殊方法名,它们用于实现运算符重载和实现多种特殊功能[33]。在Python中,可以通过定义特殊成员函数来重载运算符,比如在一个类上定义__add__
将允许在这个类的实例上使用+
算符。
Python使用名字修饰有限的支持私有变量。对象的特性可以被提取为一个字典[81]。在Python中不强制使用访问器和增变器方法来访问数据成员的面向对象编程信条。就像Python提供函数式编程构造但不尝试要求参照透明性(无副作用)一样,它提供对象系统但不要求面向对象编程行为。定义了一个或多个特殊方法__get__(self, instance, owner)
、__set__(self, instance, value)
、__delete__(self, instance)
的类可以用作描述器(descriptor)[82]。建立一个描述器的实例作为另一个类的一个类成员,使得这个实例成为此另一个类的属性(property)。使用与特性(attribute)访问相同的语法,访问一个实例对象中的这个成员属性。[lower-alpha 31]
Python的property
内建函数,将一个类中特殊定义的访问一个特性的那些方法包装成的这个类的一个属性[83]。[lower-alpha 32]Python允许通过使用@classmethod
和@staticmethod
修饰符来分别建立类方法和静态方法。给类方法的第一个实际参数是类对象而非对实例的self
引用。[lower-alpha 33]静态方法没有特定的第一个实际参数,实例或类对象都不传递给静态方法。
类型
Python使用鸭子类型并拥有有类型的对象和无类型的变量名字。在编译期不检查类型约束,而宁愿在一个对象上的操作出现可能的失败,表现出这个给定对象不具有适合的类型。尽管是动态类型系统,Python却是强类型的,禁止没有明确定义的操作(比如加一个数到一个字符串),而不是默默的去尝试转换使其有意义。Python支持广泛的类型和类的内省。类型是type
的实例,可以被读取和比较。
Python有着范围广泛的基本数据类型。同时具备常规的整数和浮点算术,它透明的支持任意精度算术、复数和十进制浮点数。Python支持种类繁多的字符串操作。在Python中字符串是不可变的,所以在其他编程语言中可能就地改变字符串的字符串操作比如字符替换,在Python中返回新的字符串。
Python的一个非常有用方面就是搜集(或称容器)类型的概念。一般的说,搜集是以一种易于引用或索引的方式包含其他对象的对象。Python对建立容器类型的对象有着语法上的支持。[lower-alpha 34]搜集有二种基本形式:序列和映射。有次序的序列类型是列表(动态数组)、元组和字符串。所有序列类型都是位置索引的(从0到长度−1),并且除了字符串,都可以包含任意类型的对象,在同一个序列中包括多种类型的对象。字符串和元组是不可变的,使得它们成为字典的键的完美候选者。在另一方面,列表是可变的,元素可以被插入、删除、修改、添加或就地排序。
在另一方面,映射是以“字典”形式实现的无次序的类型,它将一组不可变的键映射到相应的元素上(非常像数学函数)。在字典中的键必须是不可变的Python类型,比如整数或字符串,因为在底层它们是通过散列函数实现的。字典还是语言内部的中心,因为它们居于所有Python对象和类的核心:在变量名字(字符串)和这个名字所引用的值之间的映射就存储为字典,而这些字典可以通过对象的__dict__
特性直接访问。
集合搜集类型是在版本2.4中增加入语言核心的。集合是不包含重复项的无索引、无次序的搜集,并且实现了集合论运算比如并集、交集、补集、对称差和子集测试。有二种类型的集合:可变的set
和不可变的frozenset
。集合中元素必须是可散列的,比如说,frozenset
可以是正规set
的元素而反之不行。Python还提供了广泛的搜集操纵能力比如内建的包含元素检查和通用迭代协议。
Python允许编程者使用类定义自己的类型[19],类在面向对象编程中是最经常使用的。类的新实例是通过调用这个类的构造器而创建的,而类都是元类type
的实例,type
是type
元类自身的实例,这允许了元编程和反射。
在版本3.0之前,Python有两种类:旧式的和新式的[84]。二种样式的语法是一样的,不同在于是否直接或间接的继承自类object
,所有新式类都从object
继承并且是type
的实例。在Python 2系列2.2以上,二种类都可以使用[19]。在Python 3.0中淘汰了旧式类。
长期规划是支持渐进类型[85],并且自从Python 3.5,语言的语法允许指定静态类型,但在缺省实现CPython中不检查它们。有实验的叫做“mypy”的可选的静态类型检查器支持编译期类型检查[86]。
类型 | 可变性 | 描述 | 语法例子 |
---|---|---|---|
bool |
不可变 | 布尔值 | True False |
int |
不可变 | 无限制大小的整数[87] | 42 |
float |
不可变 | 双精度浮点数。精度是机器依赖的但实际上一般实现为64位IEEE 754数而带有53位的精度[88] |
|
complex |
不可变 | 复数,具有实部和虚部 | 3+2.7j |
str |
不可变 | 字符串,Unicode代码点序列 | 'Wikipedia' "Wikipedia" """Spanning
multiple
lines"""
|
range |
不可变 | 通常用在循环中的数的序列,规定在for 循环中的次数[89] |
range(1, 10) range(10, -5, -2) |
bytes |
不可变 | 字节序列 | b'Some ASCII' b"Some ASCII" bytes([119, 105, 107, 105]) |
bytearray |
可变 | 字节序列 | bytearray(b'Some ASCII') bytearray(b"Some ASCII") bytearray([119, 105, 107, 105]) |
list |
可变 | 列表,可以包含混合的类型 | [4.0, 'string', True] [] |
tuple |
不可变 | 元组,可以包含混合的类型 | (4.0, 'string', True) ('single element',) () |
dict |
可变 | 键-值对的关联数组(或称字典);可以包含混合的类型(键和值),键必须是可散列的类型 | {'key1': 1.0, 3: False} {} |
set |
可变 | 无序集合,不包含重复项;可以包含混合的类型,如果可散列的话 | {4.0, 'string', True} set() |
frozenset |
不可变 | 无序集合,不包含重复项;可以包含混合的类型,如果可散列的话 | frozenset([4.0, 'string', True]) |
ellipsis |
不可变 | 省略号占位符,用作NumPy数组的索引 | ... Ellipsis |
NoneType |
不可变 | 表示值缺席的对象,在其他语言中经常叫做null | None |
NotImplementedType |
不可变 | 可从重载运算符返回的用来指示未支持的运算数(operand)类型的占位符。 | NotImplemented |
^a 不能用名字直接访问
除了各种数据类型,Python解释器内建了还有很多其他类型,比如上下文管理器类型,模块、方法、代码对象、类型对象、内部对象等类型。
数学
Python的算术运算使用平常的符号+
、-
、*
、/
,下取整除法算符//
和模除%
(这里的余数可以是负数,比如4 % -3 == -2
)。它还有指数算符**
,比如5**3 == 125
及9**0.5 == 3.0
,和矩阵乘法算符@
[90]。这些算符就像在传统数学中一样运算,具有同样的优先级规则,中缀算符+
、-
还可以分别表示取原数和取相反数的一元算符。
在整数之间的除法/
产生浮点数结果。除法/
的表现随着版本不同而有着显著变化[91]。
Python提供了round()
函数用于把一个浮点数修约成最近的整数[92]。
Python允许由比较运算链接起来的布尔表达式表现得如在数学中常用的一样。比如,表达式a < b < c
测试a
小于b
并且b
小于c
[93]。C派生语言不一样的解释这个表达式:在C中,这个表达式将首先求值a < b
,结果为0
或1
,接着把这个结果比较于c
[94]。
Python对所有整数运算使用任意精度算术。在decimal
模块中的Decimal
类型/类提供十进制浮点数到预定义的任意精度并有多种修约模式[95]。在fractions
模块中的Fraction
类提供任意精度的有理数[96]。
由于Python有着广泛的数学库,除了求绝对值函数abs()
列入内建函数之外,大多数数学函数处于math
和cmath
模块内。前者用于实数运算,而后者用于复数运算。[lower-alpha 35]特别是,第三方库NumPy进一步扩展了固有能力,Python经常被用作科学脚本语言来处理如数值数据处理和操纵等问题[97][98]。
标准库
Python拥有一个强大的标准库[99]。Python语言的核心只包含数值、字符串、列表、字典、文件等常见类型和函数,而由Python标准库提供了系统管理、网络通信、文本处理、数据库接口、图形系统、XML处理等额外的功能。
Python标准库的主要功能有:
程序代码实例
一個在標準輸出設備上輸出Hello World的簡單程式,這種程式通常作為開始學習程式語言時的第一個程式,可将如下代码录入纯文本文件并随意命名比如program01.py
,然后执行这个程序python3 program01.py
:
print("Hello, world!")
Python也可以單步直譯執行。執行Python直譯器進入互動式命令列的環境,你可以在提示符號>>>
旁輸入print("Hello, world!")
,按Enter鍵輸出結果:
>>> print('Hello, world!')
Hello, world!
计算正数的阶乘的程序代码:
n = int(input('键入一个数,就会打印它的阶乘: '))
if n < 0:
raise ValueError('你必须输入一个非负数')
fact = 1
for i in range(2, n + 1):
fact *= i
print(fact)
注意,在Python 3.0及以上版本中,print
是个函数,需要在要打印的字符串前后加上圆括号;在Python 2.6以下版本中,print
是一个关键字和命令而不加圆括号。
实现
Python是一门跨平台的脚本语言,Python规定了一个Python语法规则,根据该规则可编写Python直譯器。Python属于动态语言,将Python程序编译成中间形式的字节码[100],并接着在它的虚拟机上执行[101],相较于C/C++等编译成机器码的编译语言而言运行速度较慢[102]。
- CPython[103],官方的直譯器,需要区别于其他直譯器的时候才以CPython称呼。这是最常用的Python版本。
- MicroPython和CircuitPython,是为微控制器而优化的Python 3变体。
- PyPy,RPython实现的Python,是快速的规矩的Python 2.7和3.6解释器[104]。它的即时编译器带来了超过CPython的显著速度提升,但是它不能使用一些用C写的库[105][106]。
- Stackless Python, 是实现微线程的CPython的重要分叉;它不使用C内存堆栈,因而允许大规模并发程序。PyPy也有无堆栈版本[107]。
- Jython,Java实现的Python。Jython可以直接调用Java的各种函数库。
- IronPython,面向.NET和ECMA CLI的Python实现。IronPython能够直接调用.net平台的各种函数库。可以将Python程序编译成.net程序。
到其他语言的交叉编译器
开发环境
通用IDE / 文本编辑器
很多并非集成开发环境软件的文本编辑器,也对Python有不同程度的支持,并且加上专门为Python设计的编辑器插件也会有很高的可用性。
- Python Tools for Visual Studio
- Visual Studio Code +插件
- Atom
- Eclipse + pydev插件
- IntelliJ IDEA + Python 插件
- emacs +插件
- NetBeans +插件
- SlickEdit
- TextMate
- Vim +插件
- Sublime Text +插件
- EditPlus
- UltraEdit
- PSPad
- Notepad++
专用Python开发环境
适用于Python的集成开发环境(IDE)软件,除了标准二进制发布包所附的IDLE之外,还有许多其他选择。其中有些软件设计有语法着色、语法检查、运行调试、自动补全、智能感知等便利功能。由于Python的跨平台出身,这些软件往往也具备各种操作系统的版本或一定的移植性。此外还有IPython,它是最初为Python开发的交互式计算的命令shell。
- IDLE:Python“标准”IDE。一般随Python而安装,支持较少的编辑功能。调试功能也比较弱。
- Eric:基于PyQt的自由软件。支持自动补全、智能感知、自动语法检查、工程管理、svn/mercurial集成、自动单元测试等功能,具有可扩展的插件系统,通过可选插件支持Git集成。调试功能与Visual Studio和Eclipse类似。目前版本可同时支持Python2.x和Python3.x,以及PyQt4和PyQt5。
- PyCharm:由JetBrains打造,PyCharm具备一般IDE的功能,比如,调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制等等,同时另外,PyCharm还提供了一些很好的功能用于Django开发,同时支持Google App Engine,PyCharm也支持IronPython。PyCharm是商业软件,但也具有社区版和教育版。
- Spyder:开源的跨平台科学计算IDE。
- Komodo和Komodo Edit:后者是前者的免费精简版。也可以用于PHP,Ruby,Javascript,Perl,Web和云开发。
- PyScripter:功能较全的开源IDE,使用Delphi开发。
- WingIDE:商业软件,有免費的功能有限的Wing IDE 101,適用於入門者教學。
應用
在很多作業系統裡,Python是標準的系统元件。大多數Linux發行版和Mac OS X都集成了Python,可以在終端機下直接執行Python。雖然Python可被粗略地分類為腳本語言,Python的支持者較喜歡稱它為一種高階動態語言,常像“胶水”一样被用来连接软件组件,已经显著的区别于其他僅作簡單程式設計任務的語言,如Unix shell、Windows PowerShell等。
Python社群提供了大量的第三方模組,使用方式与标准库类似。它们的功能覆盖科学计算、Web开发、数据库接口、图形系统多个领域。第三方模块可以使用Python或者C语言编写。SWIG和SIP常用于将C语言编写的程序库转化为Python模块。
網絡應用程式
Python定義了WSGI標準應用接口来協調Http伺服器與基於Python的Web程式之間的溝通。比如,通過mod_wsgi模組,Apache可以運行用Python編寫的Web程式。使用Python语言编写的Gunicorn作为Web服务器,也能够运行Python语言编写的Web程序。Zope是著名的用Python编写的开源的Web应用服务器。
Python對於各种網路協定的支援很完善,因此經常被用於編寫伺服器軟體、網路爬蟲等Web開發。用Python编写的一些Web框架,可以讓程式設計師輕鬆地開發和管理複雜的Web程式。著名的第三方Web框架和函数库:
- Django:开源Web开发框架,它鼓励快速开发,并遵循MVC设计,开发周期短。
- Tornado:轻量级的Web框架,内置非阻塞式服务器,而且速度相当快。
- Pyramid:轻量同時也可以規模化的Web框架,是Pylons计划的一部分。
- TurboGears:MVC风格的Web应用程序框架。
- Flask:轻量级的Web框架。
- web2py:小巧灵活的Web框架,虽然简单但是功能强大。
- CherryPy:Web应用程序开发框架。
- Quixote:Web开发框架。
- Bottle:微Web框架。
- aiohttp:轻量级的Web框架,采用的是Python3的asyncio异步特性[112]。
- Twisted:流行的网络编程库,和大型Web框架。它支援非同步線上編寫程式和多數標準的網路協定(包含客户端和伺服器),並且提供了多種工具,被廣泛用於編寫高性能的伺服器軟體。
- Requests:适合于常人使用的HTTP库,封装了许多繁琐的HTTP功能,极大地简化了HTTP请求所需要的代码量。
- Beautiful Soup:HTML/XML解析器,简单易用。
- gevent:高性能并发框架,使用了epoll事件监听、协程等机制将异步调用封装为同步调用。
GUI开发
Python本身包含了Tkinter库,它是Python的业界标准GUI并被集成进入了IDLE。Tkinter基于了Tcl命令工具,能够支持简单的GUI开发。但是越来越多的Python程序员选择第三方GUI套件来开发跨平台的桌面软件,使用它们开发的桌面软件运行速度快,与用户的桌面环境相契合。著名的第三方GUI库:
- PyGObject:替代了PyGTK,为Python程序访问基于GObject的库提供了包装库,GObject是GTK、GIO和GStreamer等库使用的对象系统。
- PyQt:用于Python的QT包装库,在GPL许可证或商业许可证下发行。
- PySide:针对PyQt的替代库,在LGPL许可证下发行。
- appJar:跨平台开源的Python的GUI库。提供对多数Tkinter内容的易用包装函数并带有额外的内建功能。
- Kivy:用于开发多点触控应用软件的开源Python库,采用了自然用户界面(NUI)。
- WxPython:Python下的GUI编程框架wxWidgets的包装库,它与MFC的架构相似。
科學計算
通过第三方科学计算库可以讓Python程式設計師編寫科学計算程式。著名的第三方科学计算库:
- NumPy:基于Python的科学计算第三方库,提供了矩阵,线性代数,傅立叶变换等等的解决方案。
- SciPy:基于Python的matlab实现,旨在实现matlab的所有功能。
- matplotlib:用Python实现的类matlab的第三方库,用以绘制一些高质量的数学二维图形。
- SymPy:支持数学符号运算。
- pandas:用于数据分析、数据建模、数据可视化的第三方库。
- scikit-learn:機器學習第三方库,實現許多知名的機器學習演算法。
- PyMC3:用于贝叶斯统计建模和概率机器学习,它聚焦于高级马尔可夫链蒙特卡洛法和变分拟合算法。
- TensorFlow:Google开发维护的开源机器学习库。
- Keras:基於TensorFlow、Theano與CNTK的高階神經網路API。
- PyTorch:基于Torch的开源的机器学习库。
其它著名的第三方库
- Boost.Python:Boost C++ Libraries包含了一組函式庫,使得以Python或C++編寫的程式能互相调用。
- SQLAlchemy:关系型数据库的对象关系映射(ORM)工具。
- PIL:基于Python的图像处理库,功能强大,对图形文件的格式支持广泛。目前已无维护,另一个第三方库Pillow实现了对PIL库的支持和维护。
- pygame:基于Python的多媒体开发和游戏软件开发模块。
- PyInstaller:能将程序发布为独立的安装程序包。
- pywin32:通過這個第三方軟體包,Python能夠訪問Windows的COM服務及其它Windows API。
- py2exe:将python脚本转换为windows上可以独立运行的可执行程序。
普及流行
自从2003年,Python始终排行于TIOBE编程社区索引前十最流行编程语言,在2020年11月,它达到了第二名最流行语言(居于C和Java之间),现为第三名[113]。它被选为2007年、2010年、2018年和2020年的年度编程语言[114]。
有一些Linux發行版的安裝器使用Python語言編寫。在RPM系列Linux发行版中,有一些系统组件就是用Python编写的。一些著名的互联网公司比如Google等[115],都在内部大量地使用Python。很多遊戲比如EVE,使用Python編寫遊戲的邏輯、伺服器。使用Python编写了如下著名应用:
- SCons:软件建造工具,有些公司会使用它代替make构建编译程序。
- Ubiquity:Ubuntu的安裝器。
- Anaconda:Red Hat Linux和Fedora的安裝器。
- Portage:Gentoo Linux使用Python編寫的軟件包管理系统。
- Plone:内容管理系统。
- Fabric:用于管理成百上千台Linux主机的程序库[116]。
- Pywikibot framework:MediaWiki的機器人程式。
- MoinMoin:Python寫成的Wiki程序。
- trac:使用Python编写的BUG管理系统。
- GNU Mailman:使用Python编写的邮件列表软件。
- Mezzanine:基于Django编写的内容管理系统。
- Blender:使用Python作為建模工具與GUI語言的開源3D繪圖軟體。
- Inkscape:一个开源的SVG矢量图形编辑器。
- Sugar:作業系统項目OLPC的圖形用戶界面,其大多數軟體都是使用Python編寫。
- Odoo:仍在持续发展壮大且最受欢迎的ERP软件。
- SageMath:一个覆盖许多数学功能的应用软件。
形成了如下社群:
影響的语言
Python的设计和哲学已经影响了很多其他编程语言:
- Boo,使用了缩进、类似的语法和类似的对象模型[118]。
- Cobra,使用了缩进和类似的语言,而且它的致谢文档将Python列为影响它的首要语言[119]。
- CoffeeScript,是交叉编译至JavaScript的编程语言,有受Python启发的语法。
- ECMAScript/JavaScript,从Python借鉴了迭代器和生成器[120]。
- GDScript,是非常类似Python的脚本语言,内置入了Godot游戏引擎[121]。
- Go,设计为“有动态语言如Python的工作速度”[122],并共享了相同的分片数组的语法。
- Groovy,动机是将Python的设计哲学带到Java[123]。
- Julia,设计为“像Python一样可用于通用编程”[124]。
- Nim,使用缩进和类似的语法[125]。
- Ruby,创建者松本行弘曾说过:“我想要一种脚本语言比Perl更加强力而且比Python更加面向对象。因此我决定设计自己的语言”[126]。
- Swift,是Apple开发的编程语言,有受Python启发的语法[127]。
代码示例
- 縮排示例:
def print_something(age): if age < 21: print("你不能買酒") #美國法律規定21歲以下的人不能購買酒 else: print("你能買酒") print("你能買口香糖") # 参数比后续部份多一层缩进 def long_function_name( var_one, var_two, var_three, var_four): # 可选的圆括号内后续行多一层缩进 if (this_is_first_thing and that_is_second_thing): do_something() # 可选的圆括号内后续行不额外缩进 elif (this_is_third_thing and that_is_fourth_thing): do_something_different() # 参数相对行首缩进一层 spam = long_function_name( arg_one, arg_two, arg_three, arg_four) # 参数按开括号界定垂直对齐 eggs = long_function_name(arg_one, arg_two, arg_three, arg_four) # 可选的闭括号位置 my_list = [ 1, 2, 3, 4, 5, 6, ] # 可选的闭括号位置 my_set = { 1, 2, 3, 4, 5, 6, }
- 采用了并行赋值的斐波那契数列函数示例:
def fib(n): # 写出从第0项到第n项的Fibonacci系列 a, b, i = 0, 1, 0 while i <= n: print(a, end=' ') a, b, i = b, a+b, i+1 print()
- 产生素数的惰性生成器的示例:
上述函数的隐式迭代用例:
from itertools import count def generate_primes(stop_at=0): if stop_at != 1: primes = [2] yield 2 for n in count(3, 2): if 0 < stop_at < n: return # 引发StopIteration异常 composite = False for p in primes: if not n % p: composite = True break elif p ** 2 > n: break if not composite: primes.append(n) yield n
在生成器表达式中使用上述函数,定义了一个惰性的、巨大而并非无限的搜集的示例:for i in generate_primes(): # 迭代于100以内所有素数上 if i > 100: break print(i)
from itertools import islice primes_under_million = (i for i in generate_primes() if i < 1000000) two_thousandth_prime = islice(primes_under_million, 1999, 2000) print(next(two_thousandth_prime))
- 遵循EAFP风格的异常处理示例:
f = None try: f = open("aFileName", mode="w") f.write(could_make_error()) # 不存在could_make_error()则产生错误 except IOError as error: print(error) print("不能打开文件") except: # 捕获所有异常 print("未预期的错误") else: # 在没有出现异常时执行 print("文件写入完全成功") finally: # 清除行动,总是执行 if f: f.close()
- 使用
with
将文件作为资源来管理的示例:from contextlib import contextmanager @contextmanager def opened(filename, mode="r"): try: f = open(filename, mode) except IOError as error: print(error) yield None else: try: yield f finally: f.close() with opened("aFileName", mode="w") as f: try: f.write(could_make_error()) # 不存在could_make_error()则产生错误 except AttributeError: print("不能打开文件") except: # 捕获所有异常 print("未预期的错误") else: # 在没有出现异常时执行 print("文件写入完全成功")
- 用生成器模拟协程示例:
def produce(n): try: for item in range(n): print('producing item {} ->'.format(item)) yield item except GeneratorExit: return def consume(): item = None try: while True: item = yield item print('consuming item {} <-'.format(item)) except GeneratorExit: return t1 = produce(10) t2 = consume() next(t2) try: while True: a = t1.send(None) b = t2.send(a) except StopIteration: pass
- 原生的协程示例:
import asyncio import random async def produce(queue, n): for item in range(n): # 生产一个项目,使用sleep模拟I/O操作 print('producing item {} ->'.format(item)) await asyncio.sleep(random.random()) # 将项目放入队列 await queue.put(item) # 指示生产完毕 await queue.put(None) async def consume(queue): while True: # 等待来自生产者的项目 item = await queue.get() if item is None: break # 消费这个项目,使用sleep模拟I/O操作 print('consuming item {} <-'.format(item)) await asyncio.sleep(random.random()) async def main(): queue = asyncio.Queue() task1 = asyncio.create_task(produce(queue, 10)) task2 = asyncio.create_task(consume(queue)) await task1 await task2 asyncio.run(main())
- 列表的推导式示例。比如:
快速排序算法可以优雅的(尽管不高效的)使用列表推导式表达为:
>>> [x + 3 for x in range(4)] [3, 4, 5, 6]
def qsort(L): if L == []: return [] pivot = L[0] return (qsort([x for x in L[1:] if x < pivot]) + [pivot] + qsort([x for x in L[1:] if x >= pivot]))
- 生成器表达式示例。比如:
>>> sum(x * x for x in range(10)) 285 >>> dict((n, n*n) for n in range(5)) {0: 0, 1: 1, 2: 4, 3: 9, 4: 16} >>> set(n*n for n in range(5)) {0, 1, 4, 9, 16}
- 字典推导式
{expr1: expr2 for k, v in d}
,等价于:result={} for k, v in d.items(): result[expr1]=expr2 return result
集合推导式>>> {x: x + 3 for x in range(4)} {0: 3, 1: 4, 2: 5, 3: 6}
{expr1 for x in stuff}
,等价于:result = set() for x in stuff: result.add(expr1) return result
>>> {x + 3 for x in range(4)} {3, 4, 5, 6}
- 匿名函数示例:
不动点组合子示例:
>>> from functools import reduce >>> reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) 15 >>> fac = lambda n: (1 if n<2 else n*fac(n-1)) >>> fac(5) 120 >>> [*map(fac, [1, 2, 3, 4, 5])] [1, 2, 6, 24, 120]
上述Y组合子代码源出自. [2020-10-21]. (原始内容存档于2021-01-11).其原理可参见. [2020-10-21]. (原始内容存档于2020-11-12).>>> Y = lambda f: (lambda x: x(x))(lambda y: f(lambda *args: y(y)(*args))) >>> fac = lambda f: lambda n: (1 if n<2 else n*f(n-1)) >>> Y(fac)(5) 120 >>> fib = lambda f: lambda n: 0 if n == 0 else (1 if n == 1 else f(n-1) + f(n-2)) >>> Y(fib)(6) 8 >>> [*map((lambda f: (lambda x: x(x))(lambda y: f(lambda *args: y(y)(*args))))(lambda f: lambda n: (1 if n<2 else n*f(n-1))), [1, 2, 3, 4, 5])] [1, 2, 6, 24, 120]
- 序列解包、可迭代解包和字典解包示例:
>>> a = [1, 2, 3]; b = [4, 5] >>> i, j, k = a >>> print(i, j, k) 1 2 3 >>> c = [*a, b] >>> c [1, 2, 3, [4, 5]] >>> d = {*a, *b} >>> d {1, 2, 3, 4, 5} >>> e = (*a, *b) >>> e (1, 2, 3, 4, 5) >>> f = {"as":1, "bs":2 }; g = {"cs":3, "ds":4} >>> h = {**f, **g} >>> h {'as': 1, 'bs': 2, 'cs': 3, 'ds': 4}
- 格式化字符串的示例,例如下列命令行
echo
命令:等价于如下Python中的任何一种num="3"; printer="HP Laserjet" echo "I just printed ${num} pages to the printer ${printer}"
print
函数调用:num = 3; printer="HP Laserjet" print(f"I just printed {num} pages to the printer {printer}") print("I just printed {} pages to the printer {}".format(num, printer)) print("I just printed {0} pages to the printer {1}".format(num, printer)) print("I just printed {num} pages to the printer {printer}".format(num=num, printer=printer)) print("I just printed %s pages to the printer %s" % (num, printer)) print("I just printed %(num)s pages to the printer %(printer)s" % {"num": num, "printer": printer})
- 多行字符串文字带有字符串插值(使用了
format
方法)的示例:print("""亲爱的{recipient}, 我希望你离开Sunnydale并永不返回. 不是很爱你的, {sender} """.format(sender="吸血鬼猎人Buffy", recipient="Spike"))
- 原始字符串的示例:
>>> # Windows路径,即使是原始字符串也不能结束于反斜杠 >>> r"C:\Spam\Eggs\Ham\" File "<stdin>", line 1 r"C:\Spam\Eggs\Ham\" ^ SyntaxError: EOL while scanning string literal >>> dos_path = r"C:\Spam\Eggs\Ham\ " # 通过增加尾随的空格 >>> dos_path.rstrip() # 并接着移除它来避免错误 'C:\\Spam\\Eggs\\Ham\\' >>> quoted_dos_path = r'"{}"'.format(dos_path) >>> quoted_dos_path '"C:\\Spam\\Eggs\\Ham\\ "' >>> # 匹配具有可能的反斜杠引用的引用字符串的正则表达式 >>> import re >>> re.match(r'"(([^"\\]|\\.)*)"', quoted_dos_path).group(1).rstrip() 'C:\\Spam\\Eggs\\Ham\\' >>> code = 'spam(2, eggs)' >>> # 反转有二个参数的函数调用的两个实际参数 >>> re.sub(r'\(([^,]*),\s*([^,]*)\)', r'(\2, \1)', code) 'spam(eggs, 2)' >>> # 注意如果实际参数中有圆括号或逗号则上例无效。
- 字符串文字串接示例:
等价于:
>>> title = "SICP in Python"" - " \ ... 'CS61A: Online Textbook'
>>> title = "SICP in Python - CS61A: Online Textbook"
- 下面几个判断语句为真,表示列表分片结果符合预期:
>>> nums = [1, 3, 5, 7, 8, 13, 20] >>> nums[2:5] == [5, 7, 8] #从下标为2的元素切割到下标为5的元素,但不包含下标为5的元素。 True >>> nums[1:] == [3, 5, 7, 8, 13, 20] #切割到最后一个元素。 True >>> nums[:-3] == [1, 3, 5, 7] #从最开始的元素一直切割到倒数第3个元素。 True >>> nums[:] == [1, 3, 5, 7, 8, 13, 20] #返回所有元素。改变新的列表不会影响到nums。 True >>> nums[1:5:2] == [3, 7] #从下标为1的元素切割到下标为5的元素,但不包含下标为5的元素,且步长为2。 True
- 词法闭包的例子:
def f(x): def g(y): return x + y return g # 返回一个闭包。 h = lambda x: lambda y: x + y # 将指定闭包赋值给变量。 a = f(1) b = h(1) c = f(2) # 使用存储在变量中的闭包。 assert a(5) == 6 assert b(5) == 6 assert c(5) == 7 # 使用闭包而不事先把它们绑定到变量。 assert f(1)(5) == 6 # f(1)是个闭包。 assert h(1)(5) == 6 # h(1)是个闭包。 assert f(2)(5) == 7 # f(2)是个闭包。
- 函数的形实参数二者结合示例。例如:
>>> def spam(a): ... a.append('LovelySpam') ... >>> def eggs(b): ... b=100 #实际上是重新绑定了另一个整型对象100 ... >>> a=[] >>> b=10 >>> spam(a) >>> eggs(b) >>> print(a) ['LovelySpam'] >>> print(b) 10
- 局部变量和全局变量示例:
>>> def spam(): ... print(b) ... >>> b=10 >>> spam() 10 >>> def spam(): ... print(b) ... b=100 ... >>> b=10 >>> spam() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in spam UnboundLocalError: local variable 'b' referenced before assignment >>> def spam(): ... print(b) ... global b ... b=100 ... File "<stdin>", line 3 SyntaxError: name 'b' is used prior to global declaration >>> def spam(): ... global b ... print(b) ... b=100 ... >>> b=10 >>> spam() 10 >>> b 100
- 非局部变量示例:
>>> def spam(): ... def eggs(): ... global b ... print(b) ... b=1000 ... b=100 # 对eggs()而言是非局部变量 ... eggs() ... >>> b=10 >>> spam() 10 >>> b 1000 >>> def spam(): ... def eggs(): ... nonlocal b ... b=1000 ... b=100 # 对eggs()而言是非局部变量 ... eggs() ... print(b) ... >>> b=10 >>> spam() 1000 >>> b 10
- 函数的形式参数缺省值的持久性示例:
>>> def f(a, L=[]): ... L.append(a) ... return L ... >>> print(f(1)) [1] >>> print(f(2)) [1, 2] >>> print(f(3)) [1, 2, 3]
- 函数的形式参数缺省值的定义示例:
>>> from inspect import getfullargspec >>> def func(p1, /, p2="x", *, p3="y"): ... pass ... >>> getfullargspec(func) FullArgSpec(args=['p1', 'p2'], varargs=None, varkw=None, defaults=('x',), kwonlyargs=['p3'], kwonlydefaults={'p3': 'y'}, annotations={})
- 函数的可变参数的定义示例:
>>> from inspect import getfullargspec >>> def func(p1, /, p2, *args, p3, **kwargs): ... pass ... >>> getfullargspec(func) FullArgSpec(args=['p1', 'p2'], varargs='args', varkw='kwargs', defaults=None, kwonlyargs=['p3'], kwonlydefaults=None, annotations={})
- 定义修饰器的示例:
调用修饰器的示例:
def viking_chorus(myfunc): def inner_func(*args, **kwargs): for i in range(3): myfunc(*args, **kwargs) return inner_func
等价于:@viking_chorus def menu_item(*args): print(" ".join(args)+" and spam")
def menu_item(*args): print(" ".join(args)+" and spam") menu_item = viking_chorus(menu_item)
viking_chorus
修饰后的menu_item
将原来定义运行3次:>>> menu_item("egg","bacon") egg bacon and spam egg bacon and spam egg bacon and spam
- 修饰器工厂示例,这里的
favourite_colour
接受一个实际参数,并返回一个修饰器:使用毗连的修饰符链接修饰器示例:def favourite_colour(colour): def decorator(func): def wrapper(*args, **kwargs): print(f"My favourite colour is {colour}.") func(*args, **kwargs) return wrapper return decorator def invincible(func): def wrapper(*args, **kwargs): print("I'm invincible!") func(*args, **kwargs) return wrapper
使用中间变量链接修饰器示例:@invincible @favourite_colour("blue") def black_knight(): print("None shall pass.")
它们等价于:blue_decorator = favourite_colour("blue") decorated_by_blue = blue_decorator(black_knight) black_knight = invincible(decorated_by_blue)
black_knight()结果为:black_knight = invincible(favourite_colour("blue")(black_knight))
>>> black_knight() I'm invincible! My favourite colour is blue. None shall pass.
- 调用函数使用帮助信息示例。比如:
>>> def randint(a, b): ... "Return random integer in range [a, b], including both end points." ... >>> help(randint) Help on function randint in module __main__: randint(a, b) Return random integer in range [a, b], including both end points.
- 如下这样给参数增加类型提示信息:
def send_mail(from_: str, to: str, title: str, body: str) -> bool: pass
- 对象的方法示例。比如:
>>> class Fish(object): ... hungry = True ... def eat(self, food): ... if food is not None: ... self.hungry=False ... >>> f = Fish() # 构造Fish的实例 >>> f.hungry True >>> Fish.hungry = False >>> f.hungry False >>> vars(f) {} >>> Fish.hungry = True >>> f.eat("earthworm") # 这种调用形式等价于 Fish.eat(f, "earthworm") >>> f.hungry False >>> Fish.hungry = True >>> f.hungry False >>> vars(f) {'hungry': False} >>> class User(object): ... def __init__(self, name=None): ... self.name = name ... >>> u = User() >>> u.name >>> vars(u) {'name': None}
- 子类调用超类方法的例子:
>>> class Thought(object): ... def __init__(self): ... self.notion=["我是类型Thought的新对象!"] ... def message(self): ... a = "我觉得我在平行宇宙中把车停歪了." ... if a not in self.notion: ... self.notion.append(a) ... print("\n".join(self.notion)) ... >>> class Advice(Thought): ... def message(self): ... a = "警告: 日历里的日期比它们看起来更近!" ... if a not in self.notion: ... self.notion.append(a) ... super(Advice, self).message() ... >>> t = Thought() >>> t.message() 我是类型Thought的新对象! 我觉得我在平行宇宙中把车停歪了. >>> a = Advice() >>> a.message() 我是类型Thought的新对象! 警告: 日历里的日期比它们看起来更近! 我觉得我在平行宇宙中把车停歪了. >>> # 内省一下: >>> isinstance(t, Thought) True >>> isinstance(a, Advice) True >>> isinstance(a, Thought) True
- 在类中采用数据描述器的示例:
>>> class RevealAccess: ... """正常的设置和返回值的数据描述器, ... 它还打印记录这次访问的一个消息。 ... """ ... def __init__(self, initval=None, name='var'): ... self.val = initval ... self.name = name ... def __get__(self, obj, objtype): ... print('Retrieving', self.name) ... return self.val ... def __set__(self, obj, val): ... print('Updating', self.name) ... self.val = val ... >>> class MyClass: ... x = RevealAccess(10, 'var "x"') ... y = 5 ... >>> m = MyClass() >>> m.x Retrieving var "x" 10 >>> vars(m) {} >>> MyClass.__dict__['x'].val 10 >>> m.x = 20 Updating var "x" >>> vars(m) {} >>> MyClass.__dict__['x'].val 20 >>> m.y 5 >>> vars(m) {} >>> m.y = 5 >>> vars(m) {'y': 5}
- 在类中调用
property()
的例子:上述代码可以采用修饰符进一步的书写为:>>> class C: ... def __init__(self): ... self._x = None ... def getx(self): ... return self._x ... def setx(self, value): ... self._x = value ... def delx(self): ... del self._x ... x = property(getx, setx, delx, "I'm the 'x' property.") ... >>> c = C() >>> vars(c) {'_x': None} >>> {*C.__dict__} {'delx', '__dict__', '__weakref__', 'setx', 'getx', 'x', '__init__', '__doc__', '__module__'}
>>> class C: ... def __init__(self): ... self._x = None ... @property ... def x(self): ... """I'm the 'x' property.""" ... return self._x ... @x.setter ... def x(self, value): ... self._x = value ... @x.deleter ... def x(self): ... del self._x ... >>> c = C() >>> vars(c) {'_x': None} >>> {*C.__dict__} {'__dict__', '__weakref__', 'x', '__init__', '__doc__', '__module__'}
- 类方法示例:
>>> class D: ... @classmethod ... def create_from_dict(cls, dictionary): ... obj = cls() ... for key in dictionary: ... obj.__dict__[key] = dictionary[key] ... return obj ... >>> a = {"as": 1, "bs" :2, "cs": 3} >>> d = D.create_from_dict(a) >>> vars(d) {'as': 1, 'bs': 2, 'cs': 3}
-
建立列表的特殊语法示例:
采用正常的对象创建方式的示例:
a_list = [1, 2, 3, "a dog"]
建立元组的特殊语法示例:a_second_list = list() a_second_list.append(4) a_second_list.append(5)
建立集合的特殊语法示例:a_tuple = 1, 2, 3, "four"
建立字典的特殊语法示例:some_set = {0, (), False}
a_dictionary = {"key 1": "value 1", 2: 3, 4: []}
- 数学运算示例。比如:
>>> def mean(seq): ... return sum(seq) / len(seq) ... >>> mean([3, 4]) 3.5 >>> import math >>> print(math.sin(math.pi/2)) 1.0
版本3相对版本2的主要变化
Python3相较于Python2的变化主要在以下几个方面[128]:
- 除法运算符
/
在Python 3.x内总是返回浮点数。而在Python 2.6内会判断被除数与除数是否是整数。如果是整数会返回整数值,相当于整除;浮点数则返回浮点数值。要让Python 2.6统一返回浮点数值,可以from __future__ import division
。
print
语句没有了,取而代之的是print()
函数。可以使用2to3
工具来自动转换。Python 2.6与Python 2.7部分地支持这种形式的print
语法。Python 2.6要支持完全新的print()
语法,可以from __future__ import print_function
。
- 取消了
exec
语句,只剩下exec()
函数。Python 2.6已经支持exec()
函数。
- 移除Python 2的
input
函数,并将raw_input
函数重命名为input
。Python 3的input
函数表现得如同Python 2的raw_input
函数,在其中输入总是作为字符串返回而非作为表达式求值。
- 捕获异常的语法由
except exc, var
改为except exc as var
。使用语法except (exc1, exc2) as var
可以同时捕获多种类型的异常。Python 2.6已经支持这两种语法。
- 如果两个对象之间没有定义明确的有意义的顺序。使用
<, >, <=, >=
比较它们会抛出异常。比如1 < ""
在Python 2.6里面会返回True
,而在Python 3.0里面会抛出异常。现在cmp(), instance.__cmp__()
函数已经被删除。
- 集合(set)的新写法:
{1,2,3,4}
。注意{}
仍然表示空的字典(dict)。
- 将
long
类型重命名为int
类型,就是说只有一种整数类型,叫做int
而表现得更像老式的long
。
- 新的
str
类型表示一个Unicode字符串,相当于Python 2.x版本的unicode
类型。而字节序列则用类似b"abc"
的语法表示,用bytes
类表示,相当于Python 2.x的str
类型。现在两种类型不能再隐式地自动转换,因此在Python 3.x里"fish" + b"panda"
是错误的。正确的写法是"fish" + b"panda".decode("utf-8")
。Python 2.6可以自动地将字节序列识别为Unicode字符串,方法是from __future__ import unicode_literals
。
- 八进制数必须写成
0o777
,原来的形式0777
不能用了;二进制必须写成0b111
。新增了一个bin()
函数用于将一个整数转换成二进制字符串。Python 2.6已经支持这两种语法。
dict.keys(), dict.values(), dict.items(), map(), filter(), range(), zip()
不再返回列表,而是迭代器。
- 将
reduce
(不涉及map
或filter
)从内建名字空间移动至functools
,理由是使用reduce
的代码不如使用循环和累加器变量的代码好读[129]。
- 多个模块被改名(根据PEP8):winreg → winreg,ConfigParser → configparser,copy_reg → copyreg,Queue → queue,SocketServer → socketserver,repr → reprlib。
StringIO
模块现在被合并到新的io
模块内。new, md5, gopherlib
等模块被删除。Python 2.6已经支持新的io
模块。
httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib
被合并到http
包内。
参考文献
- . 2021年2月19日 [2021年2月19日] (英语).
- . 2021年2月2日 [2021年2月9日].
- . Python.org. [2020-04-22]. (原始内容存档于2020-06-14).
- File extension .pyo was removed in Python 3.5. See PEP 0488 页面存档备份,存于
- Holth, Moore. . 2014-03-30 [2015-11-12]. (原始内容存档于2018-12-26).
- 彼德·諾米格. . [2020-04-21]. (原始内容存档于2020-06-14).
Python can be seen as a dialect of Lisp with "traditional" syntax (what Lisp people call "infix" or "m-lisp" syntax).
- . Python FAQ. [2007-03-22]. (原始内容存档于2008-02-23).
- . The Python Tutorial. Python Software Foundation. [2012-02-20]. (原始内容存档于2012-10-26).
- . Linux Format. 2005-02-01 [2007-11-01]. (原始内容存档于2006-10-01).
- . [2020-11-29]. (原始内容存档于2018-07-12).
- . python. Python Software Foundation. [2019-05-04]. (原始内容存档于2020-06-04).
- . [2020-10-11]. (原始内容存档于2019-12-29).
- . Python source distribution. Python Foundation. [2017-11-23]. (原始内容存档于2017-12-01).
- . Artima Developer. [2007-03-22]. (原始内容存档于2016-09-01).
- van Rossum, Guido. . Artima Developer. [2007-03-22]. (原始内容存档于2007-04-07).
- . [2007-04-29]. (原始内容存档于2007-05-01).
- Kuchling, A. M.; Zadka, Moshe. . Python Software Foundation. 2000-10-16 [2012-02-11]. (原始内容存档于2012-10-23).
- Hylton, Jeremy. . 2000-11-01 [2007-03-22]. (原始内容存档于2007-03-29).
- Guido van Rossum. . [2020-09-26]. (原始内容存档于2019-09-28).
- . [2020-10-21]. (原始内容存档于2021-02-07).
- Schemenauer, Neil; Peters, Tim; Hetland, Magnus. . 2001-12-21 [2008-09-05]. (原始内容存档于2020-06-05).
- . [2020-10-21]. (原始内容存档于2021-02-07).
- . [2020-10-21]. (原始内容存档于2021-02-07).
- . [2020-10-21]. (原始内容存档于2021-02-07).
- . Python Software Foundation. [2009-07-08]. (原始内容存档于2020-06-14).
- . [2018-02-11]. (原始内容存档于2020-06-04).
- van Rossum, Guido. . Python Enhancement Proposals. Python Software Foundation. 2006-04-05 [2009-06-27]. (原始内容存档于2016-03-03).
- . python.org. [2017-01-09]. (原始内容存档于2020-05-19).
- . python.org. [2017-01-09]. (原始内容存档于2020-06-04).
- . devguide.python.org. [17 December 2019]. (原始内容存档于2020-01-20).
- . Python Software Foundation. [2020-12-17]. (原始内容存档于2020-12-16).
- The Cain Gang Ltd. (PDF). [2009-06-27]. (原始内容 (PDF)存档于2009-05-30).
- . [2020-09-25]. (原始内容存档于2012-10-26).
- Several:
- . [2021-01-17]. (原始内容存档于2021-01-22).
- . [2021-01-17]. (原始内容存档于2021-01-21).
icontract provides design-by-contract to Python3 with informative violation messages and inheritance.
- . [2021-01-17]. (原始内容存档于2021-01-22).
PyContracts is a Python package that allows to declare constraints on function parameters and return values.
- . [2021-01-17]. (原始内容存档于2021-01-22).
This module provides a collection of decorators that makes it easy to write software using contracts.
- . [2011-09-24]. (原始内容存档于2019-11-23).
- . [2011-09-24]. (原始内容存档于2020-06-15).
- . [2021-01-17]. (原始内容存档于2021-01-21).
- . [2012-07-22]. (原始内容存档于2020-06-13).
- . Docs.python.org. [2020-06-05]. (原始内容存档于2012-10-18) (英语).
Since Python makes heavy use of
malloc()
andfree()
, it needs a strategy to avoid memory leaks as well as the use of freed memory. The chosen method is called reference counting. - . [2020-09-26]. (原始内容存档于2012-10-24).
- Hettinger, Raymond. . Python Enhancement Proposals. Python Software Foundation. 2002-01-30 [2012-02-19]. (原始内容存档于2020-06-14).
- . Docs.python.org. [2020-09-26]. (原始内容存档于2020-09-20).
- Guido van Rossum. . 1996-05-01 [2020-09-12]. (原始内容存档于2014-07-24) (英语).
- . [2020-09-26]. (原始内容存档于2018-07-13).
- . Python v3.8.6 documentation. Docs.python.org. [2020-09-26]. (原始内容存档于2018-01-09).
- . Python v2.7.18 documentation. Docs.python.org. [2020-09-26]. (原始内容存档于2019-05-08).
- . Python v3.5 documentation. Docs.python.org. [2016-06-01]. (原始内容存档于2016-06-18).
- . [2017-10-06]. (原始内容存档于2018-07-13).
- . [2020-09-27]. (原始内容存档于2012-10-23).
- . [2019-11-21]. (原始内容存档于2020-05-29).
- . [2019-11-21]. (原始内容存档于2020-06-04).
- . Python.org. [2020-09-21]. (原始内容存档于2019-08-04).
- Hamblen, Diane. . Department of the Navy Information Technology Magazine. [2007-01-31]. (原始内容存档于2009-01-14).
- "It is Easier to Ask for Forgiveness than Permission" EAFP 页面存档备份,存于, Python Glossary
- Alex Martelli. . : 134.
- . [2020-09-26]. (原始内容存档于2014-12-14).
- van Rossum, Guido. . Neopythonic.blogspot.be. 2009-04-22 [2012-12-03]. (原始内容存档于2018-05-19).
- van Rossum, Guido. . Artima forums. Artima. 2006-02-09 [2007-03-21]. (原始内容存档于2020-01-17).
- . [2019-11-21]. (原始内容存档于2019-11-14).
- . [2020-10-29]. (原始内容存档于2018-12-31).
Support for generator-based coroutines is deprecated and is scheduled for removal in Python 3.10.
- . [2019-11-21]. (原始内容存档于2019-01-05).
- . [2019-11-21]. (原始内容存档于2019-11-28).
- . [2020-10-30]. (原始内容存档于2021-02-06).
- . [2020-10-30]. (原始内容存档于2021-02-07).
- . [2020-10-30]. (原始内容存档于2021-02-07).
- . [2020-09-25]. (原始内容存档于2018-10-26).
- . python.org. [2014-10-17]. (原始内容存档于2006-07-20).
- . python.org. [2016-01-01]. (原始内容存档于2020-06-04).
- . python.org. [2016-01-01]. (原始内容存档于2020-05-14).
- . Oracle Corporation. [2016-08-28]. (原始内容存档于2020-06-07).
- . Oracle Corporation. [2016-08-28]. (原始内容存档于2020-06-07).
- . [2019-10-14]. (原始内容存档于2020-06-08).
- . python.org. [2017-10-01]. (原始内容存档于2020-06-14).
- . python.org. [2018-10-17]. (原始内容存档于2020-06-10).
- . python.org. [2017-03-08]. (原始内容存档于2020-06-15).
- . Python v2.7.5 documentation. Docs.python.org. [2013-08-16]. (原始内容存档于2012-10-23).
- . [2020-10-21]. (原始内容存档于2021-02-07).
- . Dr. Dobb's. 2005-05-01 [2007-02-08]. (原始内容存档于2007-02-06).
- . ASPN: Python Cookbook. 2006-11-14 [2007-02-08]. (原始内容存档于2007-02-09).
- . [2007-02-08]. (原始内容存档于2007-02-10).
- . Design and History FAQ. Python Software Foundation. [2012-02-19]. (原始内容存档于2012-10-24).
- . [2020-09-25]. (原始内容存档于2018-10-26).
- . [2020-09-12]. (原始内容存档于2020-06-14).
- . [2020-09-26]. (原始内容存档于2020-09-18).
- . [2020-09-25]. (原始内容存档于2018-10-26).
- . [2020-09-25]. (原始内容存档于2020-05-05).
- . LWN.net. 2014-12-24 [2015-05-05]. (原始内容存档于2019-06-20).
- . [2017-01-28]. (原始内容存档于2020-06-06).
- Zadka, Moshe; van Rossum, Guido. . Python Enhancement Proposals. Python Software Foundation. 2001-03-11 [2011-09-24]. (原始内容存档于2020-05-28).
- . docs.python.org. [2020-06-06]. (原始内容存档于2020-06-06).
almost all platforms map Python floats to IEEE-754 double precision
- . [2019-10-03]. (原始内容存档于2020-06-14).
- . python.org. [2020-09-24]. (原始内容存档于2020-05-29).
- Zadka, Moshe; van Rossum, Guido. . Python Enhancement Proposals. Python Software Foundation. 2001-03-11 [2013-10-23]. (原始内容存档于2020-05-28).
- , The Python standard library, release 3.2, §2: Built-in functions, [2011-08-14], (原始内容存档于2012-10-25)
- Beazley, David M. 4th. 2009: 66.
- Kernighan, Brian W.; Ritchie, Dennis M. 2nd. 1988: 206.
- Batista, Facundo. . Python.org. [2015-09-26]. (原始内容存档于2020-06-04).
- . docs.python.org. [2015-09-26]. (原始内容存档于2019-12-23).
- . www.stat.washington.edu. [2019-02-03]. (原始内容存档于2020-05-31).
- Shell, Scott. (PDF). 2014-06-17 [2019-02-03]. (原始内容存档 (PDF)于2019-02-04).
- Przemyslaw Piotrowski, Build a Rapid Web Development Environment for Python Server Pages and Oracle 页面存档备份,存于, Oracle Technology Network, July 2006. Accessed October 21, 2008.
- . Docs.python.org. [2016-02-16]. (原始内容存档于2020-06-05).
- (PDF). [2011-04-19]. (原始内容存档 (PDF)于2012-08-06).
- . [2020-04-30]. (原始内容存档于2020-06-14).
- http://www.Python.org 页面存档备份,存于 CPython
- . Pypy.org. [2012-12-03]. (原始内容存档于2020-06-06).
- . Speed.pypy.org. [2012-12-03]. (原始内容存档于2020-06-01).
- Shaw, Anthony. . Hacker Noon. 2018-03-30 [2019-12-20]. (原始内容存档于2020-06-14).
- . Doc.pypy.org. [2013-07-17]. (原始内容存档于2020-06-04).
- . nuitka.net. [2017-08-18]. (原始内容存档于2020-05-30) (英语).
- Borderies, Olivier. . Medium. 2019-01-24 [2020-09-12]. (原始内容存档于2020-03-25).
- . pythran.readthedocs.io. [2020-09-12]. (原始内容存档于2020-02-19).
- . 2020-04-10 [2020-09-12]. (原始内容存档于2020-04-15) –GitHub.
- . [2021-01-14]. (原始内容存档于2021-01-15).
- . TIOBE - The Software Quality Company. [2021-01-12]. (原始内容存档于2020-06-14).
- TIOBE Software Index. . [2021-02-07]. (原始内容存档于2021-02-06).
- 《Python技术手册》的作者马特利(Alex Martelli). . [2012-11-30]. (原始内容存档于2012-10-06).
這很難講,不過,2004年,Python已在Google內部使用,Google召募許多Python高手,但在這之前就已決定使用Python。他們的目的是尽量使用Python,在不得已时改用C++;在操控硬體的場合使用C++,在快速開發時候使用Python。
- . [2013-04-08]. (原始内容存档于2014-04-11).
- . [2021-01-13]. (原始内容存档于2021-02-01).
- . boo.codehaus.org. Codehaus Foundation. [2008-11-24]. (原始内容存档于2008-12-11).
- Esterbrook, Charles. . cobra-language.com. Cobra Language. [2010-04-07]. (原始内容存档于2008-02-08).
- . wiki.ecmascript.org. [2008-11-24]. (原始内容存档于2007-10-20).
- . [2020-09-13]. (原始内容存档于2020-05-19).
- Kincaid, Jason. . TechCrunch. 2009-11-10 [2010-01-29]. (原始内容存档于2010-01-18).
- Strachan, James. . 2003-08-29 [2007-06-11]. (原始内容存档于2007-04-05).
- . Julia website. February 2012 [2014-06-05]. (原始内容存档于2020-05-02).
We want something as usable for general programming as Python [...]
- Yegulalp, Serdar. . InfoWorld. 2017-01-16 [2020-09-13]. (原始内容存档于2018-10-13).
Nim's syntax is strongly reminiscent of Python's, as it uses indented code blocks and some of the same syntax (such as the way if/elif/then/else blocks are constructed).
- . Linuxdevcenter.com. [2012-12-03]. (原始内容存档于2018-04-28).
- Lattner, Chris. . Chris Lattner. 2014-06-03 [2014-06-03]. (原始内容存档于2015-12-22).
I started work on the Swift Programming Language in July of 2010. I implemented much of the basic language structure, with only a few people knowing of its existence. A few other (amazing) people started contributing in earnest late in 2011, and it became a major focus for the Apple Developer Tools group in July 2013 [...] drawing ideas from Objective-C, Rust, Haskell, Ruby, Python, C#, CLU, and far too many others to list.
- Guido van Rossum. . Python Software Foundation. 2009-02-14 [2011-02-22]. (原始内容存档于2010-12-24) (英语).
- van Rossum, Guido. . artima.com. [2016-12-27]. (原始内容存档于2020-11-09).
延伸閱讀
参见
外部链接
从维基百科的姊妹计划 了解更多有关 “Python”的内容 | |
维基共享资源上的多媒体资源 | |
维基语录上的名言 | |
维基教科书上的教科书和手册 | |
维基学院上的學習资源 | |
- 官方网站
- Python于Curlie
- Awesome Python 页面存档备份,存于
- Real Python Tutorials 页面存档备份,存于
- programingz - Learn Python Programming 页面存档备份,存于
- w3schools - Python Tutorial 页面存档备份,存于