Python

通用的高级编程语言

Python英國發音:/ˈpaɪθən/ 美國發音:/ˈpaɪθɑːn/)是一种广泛使用的解释型高级编程通用型编程语言。Python支持多种编程范式,包括面向对象、命令式、函数式和过程式编程。它拥有动态类型系统垃圾回收功能,能够自动管理内存使用,并且其本身拥有一个巨大而广泛的标准库。

Python
Python logo and wordmark.svg
编程范型多范式函数式指令式面向对象结构化反射式
設計者吉多·范罗苏姆
實作者Python软件基金会
发行时间1991年,​29年前​(1991
穩定版本
3.8.6
( 2020年9月23日,​3天前​(2020-09-23[1]
預覽版本
3.9.0rc2
( 2020年9月17日,​9天前​(2020-09-17[2]
型態系統鸭子类型, 动态, 渐进英语gradual typing(自从3.5)[3]
作業系統跨平台
許可證Python软件基金会许可证
文件扩展名.py、.pyi、.pyc、.pyd、.pyo(3.5之前)[4]、.pyw、.pyz(自从3.5)[5]
網站www.python.org 編輯維基數據鏈接
主要實作產品
CPythonPyPyIronPythonJythonStackless Python英语Stackless PythonMicroPythonCircuitPython英语CircuitPythonRustPython
衍生副語言
CythonRPythonStarlark
啟發語言
ABCALGOL 68CC++Dylan英语Dylan (programming language)HaskellIconJavaLispModula-3PerlStandard ML
影響語言
BooCobra英语Cobra (programming language)DF#FalconGoGroovyJavaScriptRuby

Python由吉多·范罗苏姆创造,第一版发布于1991年,它是ABC语言的后继者,也可以視之為一種使用传统中缀表达式英语M-expressionLISP方言[6]

Python的设计哲学强调代码的可读性和简洁的语法,尤其是使用空格缩进划分代码块。相比於C++Java,Python让开发者能够用更少的代码表达想法。不管是小型还是大型程序,该语言都试图让程序的结构清晰明瞭。

Python 解释器本身几乎可以在所有的操作系统中运行。Python的其中一個直譯器CPython是用C语言编写的、是一個由社群驱动的自由软件,目前由Python软件基金会管理。

歷史编辑

 
Python的創始人為吉多·范羅蘇姆(Guido van Rossum)。
 
Python标志,1990年代–2006年

Python的創始人為吉多·范羅蘇姆,当时他在阿姆斯特丹CWI工作。1989年的聖誕節期間,吉多·范羅蘇姆為了在打發时间,決心開發一個新的腳本解釋程式,作為ABC語言的一種繼承,替代使用Unix shellC语言进行系统管理,担负同Amoeba操作系统英语Amoeba (operating system)的交互和异常处理[7]。之所以選中Python作為程式的名字,是因為他是BBC電視劇——蒙提·派森的飛行馬戲團的愛好者[8]。范羅蘇姆作为Python的主要開發者独自担负这个项目的职责,直到2018年7月12日,他宣布从作为終身仁慈獨裁者(BDFL)的职责上“永久休假”,Python社群向他授予这个头衔反映了他长期担任整個Python語言的發展方向的决策者[9]。他现在于一个五人掌控委员会中共享他的领导权[10][11][12]

在1991年2月,范羅蘇姆发布了最初代码(标记为版本0.9.0)于alt.sources[13],这时就已经存在了带继承的异常处理函数和核心数据类型listdictstr等。在这个最初发行中就有了从Modula-3引进的模块系统[14],它的异常模型也类似于Modula-3,但增加了else子句[7]。在1994年1月Python达到了版本1.0。这个发行版主要新特征是包括了函数式编程工具lambdamapfilterreduce[15]。Python 1.4增加了受Modula-3启发的关键字参数英语keyword argument和对复数的内建支持,还包含采取名字修饰的一种基本形式的数据隐藏英语Information hiding[16]

Python 2.0於2000年10月16日發布,介入了列表推导式,这是从函数式编程语言SETLHaskell中引入的。它还增加了基于环检测的垃圾收集系统,并且支持Unicode[17]。Python 2.1支持了嵌套作用域,就像其他静态作用域语言一样[18]。Python 2.2受Icon启发而增加了生成器[19]。Python 2.5加入了with语句,从而允许资源获取即初始化(RAII)式行为并可替代常见的try/finally惯用法[20]

Python 3.0於2008年12月3日發布,它对语言做了较大修订而不能完全后向兼容[21]。Python 3发行包括了2to3实用工具,它(至少部份的)自动将Python 2代码转换成Python 3代码[22]

Python 3的很多新特性後來也被移植到舊的Python 2.6/2.7版本中[23]。Python 2.7的产品寿命结束日期最初设定为2015年,出于对大量的现存代码不能前向移植到Python 3的关切而延期至2020年[24][25]

在2019年1月,活跃的Python核心开发者选举Brett Cannon、Nick Coghlan、Barry Warsaw、Carol Willing和范羅蘇姆为“掌控委员会”的五位成员来领导这个项目[26]

特性與設計哲學编辑

Python是多范型编程语言。它完全支持面向对象编程结构化编程,还有很多特征支持函数式编程面向切面编程(包括元编程[27]元对象英语Metaobject(魔术方法)[28] )。通过扩展还可以支持很多范型,包括契约式设计[29][30]逻辑编程[31]

Python使用动态类型,在内存管理上采用引用计数和环检测相结合的垃圾收集器[32]。它的特征还有动态名字解析后期绑定英语late binding),即在程序执行期间绑定方法和变量的名字。

Python對遵循Lisp傳統的函数式编程提供了有限的支持,它提供了 filtermapreduce函数;列表推导式字典、集合和生成器表达式[33]。標準庫中有兩個模組(functools和itertools)实现了从HaskellStandard ML取来的函數式工具[34]

Python的設計哲學是“優雅”、“明確”、“簡單”。Python開發者的哲學是“用一種方法,最好是只有一種方法來做一件事”,也因此它和擁有明顯個人風格的其他語言很不一樣。在設計Python語言時,如果面臨多種選擇,Python開發者一般會拒绝花俏的語法,而選擇明確没有或者很少有歧義的語法。這些準則被稱為「Python之禅」。在Python解釋器内運行import this可以獲得完整的列表,下面是其中首要:

  • 优美优于丑陋。明瞭优于隐晦。
  • 简单优于复杂。复杂优于凌乱。
  • 扁平优于嵌套。稀疏优于稠密。
  • 可读性很重要。

Python開發人員盡量避開不成熟或者不重要的優化。一些針對非重要部位的加快運行速度的補丁通常不會被合併到Python内。再加上因为Python属于动态类型语言,动态类型语言是在运行期间检查数据的类型,不得不保持描述变量值的实际类型标记,程序在每次操作变量时,需要执行数据依赖分支,而静态类型语言相对于动态类型语言,在声明变量时已经指定了数据类型和表示方法,根据这一原理导致Python相对于C、Visual Basic等静态类型语言来说运行速度较慢。不過,根據二八定律,大多數程式對速度要求不高。在某些對運行速度要求很高的情況,Python設計師可以使用JIT技术PyPy,或者使用C/C++語言编写扩展模块。

Python本身被設計為可擴充的。並非所有的特性和功能都集成到語言核心。Python提供了豐富的API和工具,以便程式設計師能够輕鬆地使用CC++Cython來編寫擴充模組。Python編譯器本身也可以被集成到其它需要腳本語言的程式内。因此,有很多人把Python作为一種「膠水語言」使用。使用Python將其他語言編寫的程式進行集成和封裝。

語法编辑

Python的設計目標之一是讓程式碼具備高度的可閱讀性。它設計時盡量使用其它語言經常使用的標點符號和英文單字,讓程式碼看起来整潔美觀。语句之后的分号是可选的。因为Python是动态语言,它不像其他的靜態語言如C语言Pascal那樣需要書寫“聲明”語句。

縮排编辑

Python語言利用縮排表示語句塊的開始和結束(越位規則),而非使用大括號或者某種關鍵字。增加縮排表示語句塊的開始,而減少縮排則表示語句塊的結束。[a] 縮排成為了語法的一部分,並且Python開發者有意讓違反了「縮排規則」的程序不能通過解釋,以此來強迫程序員養成良好的編程習慣,也方便所有人查找和閱讀。

根據PEP 8的規定,必須使用4個空格來表示每級縮排。使用Tab字符和其它數目的空格雖然都可以被解釋器識別,但不符合編碼規範。支持Tab字符和其它数目的空格僅僅是為兼容很舊的Python程式和某些有問題的編輯程式。偏向使用Tab字符的程序員可以設置文本編輯器將Tab鍵轉換為4個空格實現縮進而不致導致縮進錯誤。

关键字编辑

Python有如下35个关键字或“保留字”;它们不能用作标识符[35][36]

  • and
  • as
  • assert
  • async[注 1]
  • await[注 1]
  • break
  • class
  • continue
  • def
  • del
  • elif
  • else
  • except
  • False[注 2]
  • finally
  • for
  • from
  • global
  • if
  • import
  • in
  • is
  • lambda
  • None
  • nonlocal[注 2]
  • not
  • or
  • pass
  • raise
  • return
  • True[注 2]
  • try
  • while
  • with
  • yield
注释
  1. ^ 1.0 1.1 从Python 3.5开始,介入了asyncawait[37]
  2. ^ 2.0 2.1 2.2 从Python 3开始,介入了关键字TrueFalsenonlocal

标识符编辑

标识符就是名字,在ASCII范围内(U+0001..U+007F),可用于标识符的字符为:大写字母AZ和小写字母az,下划线_以及数字09,但首字不可以用数字。有如下命名约定

  • _foo(单下划线开头):弱“内部使用”标识。对于from M import *,将不导入所有以下划线开头的对象,包括包、模块、成员。
  • foo_(单下划线结尾):为了避免与python关键字的命名冲突。
  • __foobar(双下划线开头):模块内的成员,表示私有成员,外部无法直接调用。
  • __foobar__(双下划线开头双下划线结尾):指那些包含在用户无法控制的命名空间中的“魔术”对象或属性,如类成员的__name____doc____init____import____file__等。建议永远不要将这样的命名方式应用于自己的变量或函数。

在Python文献中经常使用的元语法变量英语metasyntactic variablespam和eggs英语Spam (Monty Python),而非传统的foo和bar[38]

語句和控制流编辑

Python的语句包括:

  • 赋值语句,记号为等号=。在Python中这个算符不同于传统指令式编程语言,并且这个基础机制(包括Python版本的变量的本性),诠释了语言的很多其他特征。在C中的赋值,比如x = 2可翻译成:“有类型的变量名字x接受数值2的一个副本”。(左手侧)变量是符号地址,(右手侧)值被复制到给它分配的存储位置之中。分配给这个变量的内存对这个声明的类型是足够大的(潜在的非常大)。在Python赋值的最简单情况中,使用同样的例子,x = 2可翻译成:“(通用的)名字x接收到一个分立的、动态分配的对象的一个引用,此对象是数(int)类型的值2。” 用术语说是把这个名字绑定到这个对象。因为名字的存储位置不“包含”这个指示的值,称它为“变量”是不准确的。这个名字可以随后在任何时候重新绑定到极大不同的各种类型的对象上,包括字符串、过程、具有数据和方法的复杂对象等等。接连的把一个共同的值赋值给多个名字,比如x = 2; y = 2; z = 2,导致给(最多)三个名字和一个数对象分配存储,这个三个名字都绑定到这个对象。因为名字是通用的引用持有者,给它关联一个固定的数据类型是不合理的。但是在给定时间一个名字总是被绑定到有一个类型的某个对象上,因此这是动态类型
  • if語句,當條件成立時執行語句塊。經常與elseelif(相當於else if)配合使用。
  • for語句,遍历列表、字符串、字典、集合等迭代器,依次處理迭代器中的每個元素。
  • while語句,當條件為真時,循環執行語句塊。
  • try語句。與exceptfinallyelse配合使用處理在程式執行中出现的異常情況。
  • class語句。用於定義類型。
  • def語句。用於定義函數和類型的方法。
  • pass語句。表示此行為空,不執行任何操作。
  • break语句。从循环中退出。
  • continue语句。越过这次迭代并继续进行下个项目。
  • assert語句。用於程式調適階段時測試執行條件是否滿足。
  • with語句。用于在一個場景中執行語句塊。比如,執行語句塊前加锁,然后在語句塊執行結束後释放锁。Python使用with语句处理资源[39]。在进入一个作用域的时候调用一个函数而在离开它的时候调用另一个函数。这能防止忘记移除资源并且还可处理更复杂的条件比如异常。
  • yield语句。使用它从一个生成器中返回一个值。自从Python 2.5,yield也是一个运算符,这种形式被用来实现协程
  • raise语句。抛出一个异常。
  • import语句。导入一个模块或包。有三种用法:import <模块名字> [as <别名>]from <模块名字> import *from <模块名字> import <定义1> [as <别名1>], <定义2> [as <别名2>], ...

Python不支持对第一类续体尾调用,并且根据吉多·范罗苏姆,永远都不会加以支持[40][41]。但是,在2.5版中通过扩展Python的生成器,提供对协程式功能的更好的支持[42]。在版本2.5之前,生成器是惰性迭代器,信息是单向的从生成器传递出来的。自从Python 2.5,有可能将信息传递回到生成器函数中;并且自从Python 3.3,信息可以传递通过多个堆栈层级[43]

表达式编辑

Python中很多表达式与Cjava类似,而另一些则与之不同。

  • 算术运算的加法+、减法-、乘法*取模%是与Cjava相同的,但是除法的行为不同。在Python中有两种除法,它们是下取整除法(或整数除法)//和浮点除法/[44] 。Python增加了指数算符**。Python有如下必须用于整数的位运算:&与(AND),|或(OR),~非(NOT),^亦或(XOR),>>右移, <<左移;如下比较运算:大于>,小于<,等于==,不等于!=,小于等于<=,大于等于 >=
  • 自从Python 3.5,介入了新的@中缀算符。它意图用于库比如NumPy中的矩阵乘法[45][46]
  • 自从Python 3.8,介入了叫做“命名表达式”或“海象”的语法:=。它将一个表达式指派给一个标识符,同时还返回这个表达式的值,常用作更大的表达式的一部份[47]
  • 在Python中,==按值比较,对比于Java,它按值比较数[48]而按引用比较对象[49](在Java中比较对象的值可以采用equals()方法)。Python的isis not算符可以用来比较对象的同一性(按引用比较),也就是比较两个变量是否引用了同一个对象。而innot in用于判断一个对象是否属于另外一个对象。在Python中,比较是可以链接起来的,比如a <= b <= c
  • Python使用andornot表示逻辑运算与、或、非,不采用Java和C中所用的符号&&||!
  • Python的匿名函数实现为lambda表达式。匿名函数体只能是一个表达式。[f]
  • Python的条件表达式表示为x if c else y。意思是当c为真时,表达式的值为x,否则表达式的值为y。 在运算数的次序上不同于很多其他语言中常见的c ? x : y
  • Python区分列表(list)和元组(tuple)两种类型。列表的写法是[1,2,3],而元组的写法是(1,2,3)。列表是可变的,并且不能用作字典的键(Python中字典的键必须是不可变的)。元组是不可变的,因而可以用作字典的键,假定这个元组的所有元素都是不可变的话。可以使用+算符来串接二个元组,这不会直接修改它们的内容,而是产生包含给定元组二者的元素的一个新元组。因此,给定变量t初始时等于(1, 2, 3),执行t = t + (4, 5)时,首先求值t + (4, 5),它产生(1, 2, 3, 4, 5),接着赋值回到t,这在效果上“修改了”t的内容,尽管这还是遵守了元组对象的不可变本性。在没有歧义的情况下,元组的圆括号是可选的[50]
  • Python支持并行赋值,可以同时给多个变量赋值[g],还可以交换两个变量的值[h]。Python还有“序列解包”特征,多个表达式,其中每个都可求值成能被赋值的东西(变量、可写的属性等),以形成元组文字(literal)的相同方式关联起来,作为一个整体放置在赋值语句等号的左手侧。这个语句预期在等号的右手侧有一个“可迭代”对象,它产生同左手侧给出的可写表达式相同数目的值,这个语句把每个产生的值赋值给左手侧对应的表达式[51]。这允许从一个单一函数返回多个值。
  • 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-字符串”:blah = "blah"; eggs = 2; f'spam={blah} eggs={eggs}'[52]
  • Python拥有各种字符串文字英语string literal:
    • 由单引号'或双引号"界定的字符串。不同于Unix shellPerl和受Perl影响的语言,单引号和双引号功能相同。这二种字符串都使用反斜杠\作为转义字符。在Python 3.6中字符串插值英语String interpolation可作为“格式化字符串”而获得到[52]
    • 三引号字符串,开始和结束于三个单引号或双引号的序列。它们可以跨越多行,其功能就像shell、Perl和Ruby中的here文档
    • 原始字符串英语String literal#Raw strings变体,用给字符串文字前导一个r来指示。转义序列不被解释,因此在文字反斜杠常见的地方很有用,比如正则表达式Windows风格的路径。可比较于C#中的“@-引用”。
  • Python拥有在列表上的数组索引数组分片英语array slicing表达式,表示为a[key]a[start:stop]a[start:stop:step]。索引是基于零的,负数是相对于结尾的。分片从“开始”(start)索引直到但不包括“停止”(stop)索引。分片的第三个参数叫做“步长”(step)或“间隔”(stride),允许元素被跳过和用负数指示反向。分片索引可以省略,例如a[:],这返回整个列表的一个复本。[i]分片的每个元素都是浅层复制英语Object copying的。

在Python中,在表达式和语句之间的区别是严格强制性的,对比于语言如Common LispSchemeRuby。这导致重复了某些功能。比如:列表推导式对当for-循环。条件表达式对当if块。eval()对当exec()内建函数(在Python 2中,exec是语句);前者用于表达式,后者用于语句。

语句不能成为表达式的一部份,所以列表和其他推导式或lambda表达式,都是表达式,不能包含语句。这个限制的一个特定情况是赋值语句比如a = 1不能形成条件语句的条件表达式的一部份。这能够避免一个经典的C错误,即在条件中把等于算符==误写为赋值算符=if (c = 1) { ... }在语法上是有效(但可能非预期)的C代码,而if c = 1: ...在Python中导致一个语法错误。

函数编辑

Python的函数支持递归、缺省值参数、可变参数、闭包[j],但不支持函数重载。Python的函数作为第一类对象,具有和普通对象平等的地位。函数一旦定义,即可视作为普通对象,其形式参数在函数一次调用之后保持既有绑定,在函数的新一次调用时,有新传递来的对应的实际参数就变更绑定,没有就保持原样。[k]

Python的函数实际参数与形式参数之间的结合是传递“对象的引用”,就是把形式参数名字绑定到实际参数名字所引用的对象上。如果形式参数绑定到一个可变的对象,则通过形式参数对此对象内容的修改,在函数外也是可见的。如果形式参数绑定到一个不可变的对象,则通过形式参数是不能修改此对象内容,但可以把形式参数重新绑定到其它对象上,这并不影响函数外的对象的值。[l]

函数的缺省值参数是param_name=value样式的形式参数,它在函数被定义时一次性初始化缺省值。函数调用时,实际参数可以如同C语言那样按照位置与形式参数匹配;也可以采用命名參數英语Named parameter(或称为关键字参数),即param_name=value样式的实际参数。在一个函数调用的实际参数序列中,關鍵字參數必须出现在位置参数之后。

可变参数在形式参数序列中用*args**dictargs表示,指示这个可变参数对应多个实际参数;在形式参数名字前加一个*号,该可变参数为tuple数据类型;在形式参数名字前加**号,该可变参数为dict数据类型。在实际参数已经在一个集合(collection)类型(包括set、list、tuple甚至bytes、str等)的对象中的情况下,在引用它的变量前加一个*号传递给函数,则其中所有元素解包为多个实际参数。

修饰器(decorator)是用来修改一个函数、方法或类定义的任何可调用Python对象。将正被定义的最初对象传递给修饰器,它返回一个修改后的对象,接着把它绑定到在定义中那个名字。Python修饰器部份受到Java注解的影响,而有类似的语法;修饰器语法是纯粹的语法糖,使用@作为关键字形成修饰符。[m]修饰器是一种形式的元编程,它们增强它们所修饰的函数或方法的行动。函数修饰器的正规用法包括:用来建立类方法静态方法,增加函数属性,跟踪英语Tracing (software),设置先决条件后置条件同步[53];此外更远大的用法包括:尾调用消除[54]记忆化甚至改进修饰器的写作[55]

为了增强代码的可读性,可以在函数后书写“文档字符串”(简称docstrings),用于解释函数的作用、参数的类型与意义、返回值类型与取值范围等。可以使用内置函数help()打印出函数的使用帮助。[n]Python 3.5支持类型提示,可以注释函数的参数与返回值。此特性可方便IDE对源代码进行更深入的分析。[o]

对象及其方法编辑

Python支持大多数面向对象编程技术。它允许多态性,不只是在类层级英语Class hierarchy之内而且通过采用鸭子类型的方式。任何对象可以用于任何类型,只要它有适当的方法和特性(attribute)就能工作。在Python中所有东西都是对象,包括、函数、数和模块。Python还支持元类,它是增进类的功能的高级工具。Python天然的支持继承包括多重继承。它还使用名字修饰有限的支持私有变量。

对象方法是附属于这个对象的的函数。对于正常的方法和函数,语法instance.method(arguments),是Class.method(instance, arguments)语法糖。Python的方法有显式的self英语this (computer programming)形式参数用来访问实例数据英语Field (computer science),对比于在其他一些面向对象编程语言(比如C++JavaObjective-CRuby)中的隐式selfthis[56]。在Python中,self可以被看作是一个习惯性的用法,它可以被换为任何其它合法的参数名,比如thismine等。[p]

在Python中,当一个子类的方法覆盖英语Method overriding超类方法的时候,通过调用super(Subclass, self).method来调用与子类的self.method方法同名超类方法[57][q] Python支持一些以“__”开始并以“__”结束的特殊方法名,它们用于实现运算符重载和实现多种特殊功能[58]

属性(property)允许使用与特性(attribute)访问相同的语法,在一个对象实例上调用特殊定义的方法。[r]定义了一个或多个特殊方法__get__(self, instance, owner)__set__(self, instance, value)__delete__(self, instance)的类可以用作描述器(descriptor)。建立一个描述器的实例作为另一个类的一个类成员,使这个实例成为此另一个类的属性。

Python允许通过使用@classmethod@staticmethod修饰符来分别建立类方法静态方法。给类方法的第一个实际参数是类对象而非对实例的self引用。静态方法没有特定的第一个实际参数。实例或类对象都不传递给静态方法。

类型编辑

 
Python 3中的标准类型层次结构

Python使用鸭子类型并拥有有类型的对象和无类型的变量名字。在编译期不检查类型约束,而宁愿在一个对象上的操作出现可能的失败,表现出这个给定对象不具有适合的类型。尽管是动态类型系统,Python却是强类型的,禁止没有明确定义的操作(比如加一个数到一个字符串),而不是默默的去尝试理解它们。

Python允许编程者使用定义自己的类型,类在面向对象编程中是最经常使用的。类的新实例是通过调用这个类而构造的(例如SpamClass()EggsClass()),而类都是元类type的实例(typetype元类自身的实例),这允许了元编程反射

在版本3.0之前,Python有两种类:旧式的和新式的[59]。二种样式的语法是一样的,不同在于是否直接或间接的继承自类object,所有新式类都从object继承并且是type的实例。在Python 2系列2.2以上,二种类都可以使用[60]。在Python 3.0中淘汰了旧式类。

长期规划是支持渐进类型英语gradual typing[61],并且自从Python 3.5,语言的语法允许指定静态类型,但在缺省实现CPython中不检查它们。有实验的叫做“mypy”的可选的静态类型检查器支持编译期类型检查[62]

Python 3内置类型总结
类型 可变性 描述 语法例子
bool 不可变 布尔值 True
False
bytearray 可变 字节序列 bytearray(b'Some ASCII')
bytearray(b"Some ASCII")
bytearray([119, 105, 107, 105])
bytes 不可变 字节序列 b'Some ASCII'
b"Some ASCII"
bytes([119, 105, 107, 105])
complex 不可变 复数,具有实部和虚部 3+2.7j
dict 可变 键-值对的关联数组(或称字典);可以包含混合的类型(键和值),键必须是可散列(hash)类型 {'key1': 1.0, 3: False}
{}
ellipsisa 不可变 省略号英语Ellipsis (programming operator)占位符,用作NumPy数组的索引 ...
Ellipsis
float 不可变 双精度浮点数。精度是机器依赖的但实际上一般实现为64位IEEE 754数而带有53位的精度[63]

1.414

frozenset 不可变 无序集合,不包含重复项;可以包含混合的类型,如果可散列的话 frozenset([4.0, 'string', True])
int 不可变 无限制大小的整数[64] 42
list 可变 列表,可以包含混合的类型 [4.0, 'string', True]
[]
NoneTypea 不可变 表示值缺席的对象,在其他语言中经常叫做null None
NotImplementedTypea 不可变 可从重载运算符返回的用来指示未支持的运算数(operand)类型的占位符。 NotImplemented
range 不可变 通常用在循环中的数的序列,规定在for循环中的次数[65] range(1, 10)
range(10, -5, -2)
set 可变 无序集合,不包含重复项;可以包含混合的类型,如果可散列的话 {4.0, 'string', True}
set()
str 不可变 字符串,Unicode代码点序列 'Wikipedia'
"Wikipedia"
"""Spanning
multiple
lines"""
tuple 不可变 元组,可以包含混合的类型 (4.0, 'string', True)
('single element',)
()

^a 不能用名字直接访问

除了各种数据类型,Python解释器内建了还有很多其他类型,比如上下文管理器类型,模块、方法、代码对象、类型对象、内部对象等类型。

数学编辑

Python的算术运算使用平常的符号(+-*/),下取整除法算符//模除%(这里的余数可以是负数,比如4 % -3 == -2)。它还有指数算符**,比如5**3 == 1259**0.5 == 3.0,和矩阵乘法算符@[66]。这些算符就像在传统数学中一样运算,具有同样的优先级规则中缀算符(+-)还可以分别表示取原数和取相反数一元算符。

在整数之间的除法/产生浮点数结果。除法/的表现随着版本不同而有着显著变化[67]

Python提供了round()函数用于把一个浮点数修约成最近的整数[68]

Python允许由比较运算链接起来的布尔表达式表现得如在数学中常用的一样。比如,表达式a < b < c测试a小于b并且b小于c[69]。C派生语言不一样的解释这个表达式:在C中,这个表达式将首先求值a < b,结果为01,接着把这个结果比较于c[70]

Python对所有整数运算使用任意精度算术。在decimal模块中的Decimal类型/类提供十进制浮点数到预定义的任意精度并有多种修约模式[71]。在fractions模块中的Fraction类提供任意精度的有理数[72]

由于Python有着广泛的数学库,除了求绝对值函数abs()列入内建函数之外,大多数数学函数处于mathcmath模块内。前者用于实数运算,而后者用于复数运算。[s]特别是,第三方库NumPy进一步扩展了固有能力,Python经常被用作科学脚本语言来处理如数值数据处理和操纵等问题[73][74]

标准库编辑

Python拥有一个强大的标准库[75]。Python语言的核心只包含数字、字符串、列表、字典、文件等常见类型和函数,而由Python标准库提供了系统管理、网络通信、文本处理、数据库接口、图形系统、XML处理等额外的功能。

Python标准库的主要功能有:

  • 文本处理,包含文本格式化、正则表达式、文本差异计算与合并、Unicode支援,二进制数据处理等功能。
  • 文件处理,包含文件操作、建立临时文件、文件压缩与归档、操作配置文件等功能。
  • 操作系统功能,包含线程与进程支持、IO复用、日期与时间处理、调用系统函数、日志(logging)等功能。
  • 网络通信,包含网络套接字,SSL加密通信、异步网络通信等功能。
  • 网络协议,支持HTTP,FTP,SMTP,POP,IMAP,NNTP,XMLRPC等多种网络协议,并提供了编写网络服务器的框架。
  • W3C格式支持,包含HTML,SGML,XML的处理。
  • 其它功能,包括国际化支持、数学运算、HASH、Tkinter等。

程序代码实例编辑

一個在標準輸出設備上輸出Hello World的簡單程式,這種程式通常作為開始學習程式語言時的第一個程式:

print("Hello, world!")

Python也可以單步直譯執行。執行Python直譯器進入互動式命令列的環境,你可以在提示符號>>>旁輸入print("Hello, world!"),按Enter鍵輸出結果:

>>> print('Hello, world!')
Hello, world!

注意,在3.0及以上版本中,需要在"Hello,world"周围加上圆括号。其原因是在3.0及以上版本中,print命令不再是一个关键字,而是一个函数。[t]

计算正数的阶乘的程序:

n = int(input('Type a number, and its factorial will be printed: '))

if n < 0:
    raise ValueError('You must enter a non negative integer')

fact = 1

for i in range(2, n + 1):
    fact *= i

print(fact)

实现编辑

Python是一门跨平台的脚本语言,Python规定了一个Python语法规则,根据该规则可编写Python直譯器

  • CPython[76],官方的直譯器,需要区别于其他直譯器的时候才以CPython称呼。这是最常用的Python版本。
  • Jython,Java实现的Python。Jython可以直接调用Java的各种函数库。
  • PyPy,RPython实现的Python,是快速的规矩的Python 2.7和3.6解释器[77]。它的即时编译器带来了超过CPython的显著速度提升,但是它不能使用一些用C写的库[78][79]
  • IronPython,面向.NETECMA CLI的Python实现。IronPython能够直接调用.net平台的各种函数库。可以将Python程序编译成.net程序。
  • Stackless Python, 是实现微线程英语microthread的CPython的重要分叉;它不使用C内存堆栈,因而允许大规模并发程序。PyPy也有无堆栈版本[80]
  • MicroPythonCircuitPython,是为微控制器而优化的Python 3变体。

到其他语言的交叉编译器编辑

  • Cython,把Python编译成CC++
  • MyHDL,把Python编译成VHDL
  • Nuitka,把Python编译成C++[81]
  • Numba,使用LLVM把Python编译成机器码。
  • Pythran,把Python编译成C++[82][83]
  • RPython,可以编译成C,并被用来建造Python的PyPy解释器。
  • Google的Grumpy(最近发行于2017年),把Python 2编译成Go[84][85]
  • Shed Skin(最近发行于2013年),分别编译成C和C++。
  • Pyjs(最近发行于2012年),把Python编译成JavaScript

开发环境编辑

通用IDE / 文本编辑器编辑

很多并非集成开发环境软件的文本编辑器,也对Python有不同程度的支持,并且加上专门为Python设计的编辑器插件也会有很高的可用性。

专门为Python设计的IDE软件编辑

适用于Python的集成开发环境(IDE)软件,除了标准二进制发布包所附的IDLE之外,还有许多其他选择。其中有些软件设计有语法着色、语法检查、运行调试、自动补全、智能感知等便利功能。由于Python的跨平台出身,这些软件往往也具备各种操作系统的版本或一定的移植性。

  • Eric:基于PyQt的自由软件。支持自动补全、智能感知、自动语法检查、工程管理、svn/mercurial集成、自动单元测试等功能,具有可扩展的插件系统,通过可选插件支持Git集成。调试功能与Visual Studio和Eclipse类似。目前版本为Eric6,可同时支持Python2.x和Python3.x,以及PyQt4和PyQt5。使用前需要先安装相应的Python和PyQt版本。
  • IDLE:Python“标准”IDE。一般随Python而安装,支持较少的编辑功能。调试功能也比较弱。
  • KomodoKomodo Edit:后者是前者的免费精简版。也可以用于PHP,Ruby,Javascript,Perl,Web和云开发。
  • PyCharm:由JetBrains打造,该公司的Java IDE软件IntelliJ(此软件也有Python开发插件)拥有海量的使用者;PyCharm具备一般IDE的功能,比如,调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制等等,同时另外,PyCharm还提供了一些很好的功能用于Django开发,同时支持Google App Engine,PyCharm也支持IronPython。PyCharm是商业软件,但也具有社区版和教育版。
  • PyScripter:功能较全的开源IDE,使用Delphi开发。
  • PythonWin:包含在pywin32内的编辑器,仅适用于Windows。
  • SPE(Stani's Python Editor):功能较多的免费软件,依赖wxPython
  • Spyder:开源的跨平台科学计算IDE。
  • Ulipad:功能较全的免费软件,依赖wxPython
  • WingIDE:商业软件,有免費的Wing IDE 101,功能有限,適用於入門者教學。

應用编辑

雖然Python可能被粗略地分類為「腳本語言」,Python的支持者較喜歡稱它為一種高階動態程式語言,原因是「腳本語言」泛指僅作簡單程式設計任務的語言,如shell script、VBScript等只能處理簡單任務的程式語言,並不能與Python相提並論。

Python社群提供了大量的第三方模組,使用方式与标准库类似。它们的功能覆盖科学计算、Web开发、数据库接口、图形系统多个领域。第三方模块可以使用Python或者C语言编写。SWIGSIP英语SIP (software)常用于将C语言编写的程序库转化为Python模块。Boost C++ Libraries包含了一組函式庫,Boost.Python,使得以Python或C++編寫的程式能互相调用。Python常被用做其他语言与工具之间的“胶水”语言。

網絡應用程式编辑

Python經常被用於Web開發。比如,通過mod_wsgi英语mod_wsgi模組,Apache可以運行用Python編寫的Web程式。使用Python语言编写的Gunicorn作为Web服务器,也能够运行Python语言编写的Web程序。Python定義了WSGI標準應用接口来協調Http伺服器與基於Python的Web程式之間的溝通。一些Web框架,如DjangoPyramidTurboGearsTornadoweb2pyZopeFlask等,可以讓程式設計師輕鬆地開發和管理複雜的Web程式。

Python對於各种網路協定的支援很完善,因此經常被用於編寫伺服器軟體、網路爬蟲。第三方函式庫Twisted支援非同步線上編寫程式和多數標準的網路協定(包含客户端和伺服器),並且提供了多種工具,被廣泛用於編寫高性能的伺服器軟體。另有gevent这个流行的第三方库,同样能够支持高性能高并发的网络开发。

著名的第三方Web框架和函数库:

  • Django:开源Web开发框架,它鼓励快速开发,并遵循MVC设计,开发周期短。
  • Flask:轻量级的Web框架。
  • Pyramid:轻量,同時有可以規模化的Web框架,Pylon projects 的一部分。
  • ActiveGrid:企业级的Web2.0解决方案。
  • Karrigell:简单的Web框架,自身包含了Web服务,py脚本引擎和纯python的数据库PyDBLite。
  • Tornado:一个轻量级的Web框架,内置非阻塞式服务器,而且速度相当快。
  • Webpy:一个小巧灵活的Web框架,虽然简单但是功能强大。
  • CherryPy:基于Python的Web应用程序开发框架。
  • Pylons:基于Python的一个极其高效和可靠的Web开发框架。
  • Zope:开源的Web应用服务器。
  • TurboGears:基于Python的MVC风格的Web应用程序框架。
  • Twisted:流行的网络编程库,大型Web框架。
  • Quixote:Web开发框架。
  • aiohttp:轻量级的Web框架,采用的是Python3的asyncio异步特性。
  • Bottle - Python微Web框架。
  • BeautifulSoup:基于Python的HTML/XML解析器,简单易用。
  • Requests:适合于人类使用的HTTP库,封装了许多繁琐的HTTP功能,极大地简化了HTTP请求所需要的代码量。
  • gevent:python的一个高性能并发框架,使用了epoll事件监听、协程等机制将异步调用封装为同步调用。

GUI开发编辑

Python本身包含的Tkinter库能够支持简单的GUI开发。但是越来越多的Python程序员选择wxPython或者PyQt等GUI套件来开发跨平台的桌面软件。使用它们开发的桌面软件运行速度快,与用户的桌面环境相契合。

著名的第三方GUI库:

  • PyGtk:基于Python的GUI程序开发GTK+库。
  • PyQt:用于Python的QT开发库。
  • WxPython:Python下的GUI编程框架,与MFC的架构相似。

科學計算编辑

NumPySciPyMatplotlib可以讓Python程式設計師編寫科学計算程式。

著名的第三方科学计算库:

  • Matplotlib:用Python实现的类matlab的第三方库,用以绘制一些高质量的数学二维图形。
  • Pandas:用于数据分析、数据建模、数据可视化的第三方库。
  • SciPy:基于Python的matlab实现,旨在实现matlab的所有功能。
  • NumPy:基于Python的科学计算第三方库,提供了矩阵,线性代数,傅立叶变换等等的解决方案。
  • scikit-learn機器學習第三方库,實現許多知名的機器學習演算法。
  • TensorFlowGoogle开发维护的开源机器学习库。
  • Keras:基於TensorFlowTheanoCNTK的高階神經網路API
  • Sympy,支持数学符号运算。

其它著名的第三方库编辑

Python標準庫包含了多個調用作業系统功能的函式庫。

  • SQLAlchemy关系型数据库对象关系映射(ORM)工具。
  • PIL:基于Python的图像处理库,功能强大,对图形文件的格式支持广泛。目前已无维护,另一个第三方库Pillow实现了对PIL库的支持和维护。
  • PyGame:基于Python的多媒体开发和游戏软件开发模块。
  • PyInstaller:能将程序发布为独立的安装程序包。
  • pywin32:通過這個第三方軟體包,Python能夠訪問Windows的COM服務及其它Windows API。
  • Py2exe:将python脚本转换为windows上可以独立运行的可执行程序。

影響的语言编辑

  • Boo,使用了缩进、类似的语法和类似的对象模型[86]
  • Cobra,使用了缩进和类似的语言,而且它的致谢文档将Python列为影响它的首要语言[87]
  • CoffeeScript,是交叉编译至JavaScript的编程语言,有受Python启发的语法。
  • ECMAScript/JavaScript,从Python借鉴了迭代器生成器[88]
  • GDScript,是非常类似Python的脚本语言,内置入了Godot游戏引擎[89]
  • Go,设计为“有动态语言如Python的工作速度”[90],并共享了相同的分片数组的语法。
  • Groovy,动机是将Python的设计哲学带到Java[91]
  • Julia,设计为“像Python一样可用于通用编程”[92]
  • Nim,使用缩进和类似的语法[93]
  • Ruby,创建者松本行弘曾说过:“我想要一种脚本语言比Perl更加强力而且比Python更加面向对象。因此我决定设计自己的语言”[94]
  • Swift,是Apple开发的编程语言,有受Python启发的语法[95]

Python3主要变化编辑

Python3的变化主要在以下几个方面[96]

  • print语句没有了,取而代之的是print()函数。可以使用2to3工具来自动转换。Python 2.6与Python 2.7部分地支持这种形式的print语法。[u]
  • 新的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")[v]
  • 除法运算符/在Python 3.x内总是返回浮点数。而在Python 2.6内会判断被除数与除数是否是整数。如果是整数会返回整数值,相当于整除;浮点数则返回浮点数值。[w]
  • 捕获异常的语法由except exc, var改为except exc as var。使用语法except (exc1, exc2) as var可以同时捕获多种类型的异常。Python 2.6已经支持这两种语法。
  • 集合(set)的新写法:{1,2,3,4}。注意{}仍然表示空的字典(dict)。
  • 八进制数必须写成0o777,原来的形式0777不能用了;二进制必须写成0b111。新增了一个bin()函数用于将一个整数转换成二进制字符串。Python 2.6已经支持这两种语法。
  • dict.keys(), dict.values(), dict.items(), map(), filter(), range(), zip()不再返回列表,而是迭代器。
  • 如果两个对象之间没有定义明确的有意义的顺序。使用<, >, <=, >=比较它们会抛出异常。比如1 < ""在Python 2.6里面会返回True,而在Python 3.0里面会抛出异常。现在cmp(), instance.__cmp__()函数已经被删除。
  • 合并intlong类型。
  • 多个模块被改名(根据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包内。
  • 取消了exec语句,只剩下exec()函数。Python 2.6已经支持exec()函数。
  • 其他变化详见參考文獻[96]。基本上,可以编写出使用Python 3.0语法并运行于Python 2.6, Python 2.7的程序。

普及流行编辑

在很多作業系統裡,Python是標準的系统元件。大多數Linux發行版和Mac OS X都集成了Python,可以在終端機下直接執行Python。有一些Linux發行版的安裝器使用Python語言編寫,比如Ubuntu的Ubiquity安裝器、Red Hat Linux和Fedora的Anaconda安裝器。在RPM系列Linux发行版中,有一些系统组件就是用Python编写的。Gentoo Linux使用Python來編寫它的Portage軟件包管理系统

YouTube、Google、Yahoo!、NASA都在内部大量地使用Python。有些公司会使用Scons代替make构建C++程序。很多遊戲使用C++編寫圖形顯示等高性能模組,而使用Python或者Lua編寫遊戲的邏輯、伺服器。使用Python编写了如下著名应用:

  • Google - 在Google内部的很多项目,例如Google應用服務引擎使用C++編寫性能要求極高的部分,然后用Python或Java/Go調用相應的模組。[97][98]
  • Youtube - 視頻社交网站
  • Reddit - 社交分享网站
  • Dropbox - 文件分享服务
  • 豆瓣网 - 图书、唱片、电影等文化产品的资料数据库网站
  • Plone - 内容管理系统
  • Instagram - 是一款免费提供在线图片及视频分享的社交应用软件,使用Django作为后台
  • Fabric - 用于管理成百上千台Linux主机的程序库
  • Python Wikipedia Robot Framework - MediaWiki的機器人程式
  • MoinMoinWiki - Python寫成的Wiki程序
  • Trac - 使用Python编写的BUG管理系统
  • Mailman - 使用Python编写的邮件列表软件
  • Mezzanine - 基于Django编写的内容管理系统
  • EVE - 网络游戏EVE大量使用Python进行开发,處理遊戲中繁多的邏輯
  • Blender - 使用Python作為建模工具與GUI語言的開源3D繪圖軟體
  • Inkscape - 一个开源的SVG矢量图形编辑器。
  • OLPC - 其作業系统Sugar項目的大多數軟體都是使用Python編寫。
  • 知乎 - 一个问答网站
  • 果壳 - 一个泛科技主题网站
  • Odoo - 仍在持续发展壮大且最受欢迎的ERP软件
  • ZhPy - 周蟒,支持使用繁/簡中文语句编写程序的Python语言。

形成了如下社群:

  • PyCon是各地社群舉辦的會議,通常每年舉辦。各社群在會議中討論Python相關的議題。
  • 台灣Python社群由2012年起舉辦PyCon TW
  • 由女性社群發起的PyLadies英语PyLadies社群,主要注重於發展Python的女性程式設計社群。
  • Django Girls使用Django網頁設計框架,推廣使用Python進行網頁設計的技術。

代码示例编辑

  1. ^ 縮排示例。例如if語句:
    if age < 21:
        print("你不能買酒")  #美國法律規定21歲以下的人不能購買酒
        print("不過你能買口香糖")
    print("這句話處於if語句塊的外面")
    
    • 注:上述例子為Python 3.0以上版本的程式碼。
  2. ^ 列表的推导式示例。比如:
    >>> [x + 3 for x in range(4)]
    [3, 4, 5, 6]
    
  3. ^ 集合推导式{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}
    
  4. ^ 字典推导式{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}
    
  5. ^ 生成器表达式示例。比如计算0-9的平方和:
    >>> sum(x * x for x in range(10))
    285
    
  6. ^ 匿名函数示例。比如:
    >>> add = lambda x, y : x + y
    >>> add(3, 2)
    5
    
  7. ^ 多赋值示例。比如:
    >>> x, y=1, 2 #同时给x,y赋值,最终结果:x=1, y=2
    
  8. ^ 多赋值示例。比如:
    >>> x, y = y, x #最终结果:y=1, x=2
    
  9. ^ 下面几个判断语句为真,表示列表分片结果符合预期:
    >>> 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
    
  10. ^ 词法闭包的例子:
    def f(x):
        def g(y):
            return x + y
        return g  # 返回一个闭包。
    
    def h(x):
        return lambda y: x + y  # 返回一个闭包。
    
    # 将指定闭包赋值给变量。
    a = f(1)
    b = h(1)
    
    # 使用存储在变量中的闭包。
    assert a(5) == 6
    assert b(5) == 6
    
    # 使用闭包而不事先把它们绑定到变量。
    assert f(1)(5) == 6  # f(1)是个闭包。
    assert h(1)(5) == 6  # h(1)是个闭包。
    
  11. ^ 函数的第一类对象性质示例。例如:
    >>> def f(a, L=[]):
    ...     L.append(a)
    ...     return L
    ... 
    >>> print(f(1))
    [1]
    >>> print(f(2))
    [1, 2]
    >>> print(f(3))
    [1, 2, 3]
    
  12. ^ 函数的形实参数二者结合示例。例如:
    def foo(a):
        a.append('haha')
        
    def bar(b):
        b=101 #实际上是重新绑定了另一个整型对象101
    
    a=[]
    b=100
    foo(a)
    bar(b)
    print(a) #结果为['haha']
    print(b) #结果为100
    
  13. ^ 修饰器示例:
    @viking_chorus
    def menu_item():
        print("spam")
    

    等价于:

    def menu_item():
        print("spam")
    menu_item = viking_chorus(menu_item)
    
  14. ^ 调用函数使用帮助信息示例。比如:
    >>> 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.
    
  15. ^ 如下这样给参数增加类型提示信息:
    def send_mail(from_: str, to: str, title: str, body: str) -> bool:
        pass
    
  16. ^ 对象的方法示例。比如:
    class Fish(object):
        def eat(self, food):
            if food is not None:
                self.hungry=False
    class User(object):
        def __init__(myself, name):
            myself.name = name
    
    #构造Fish的实例:
    f=Fish()
    #以下两种调用形式是等价的:
    Fish.eat(f, "earthworm")
    f.eat("earthworm")
    
    u = User('username')
    
    u.name
    
  17. ^ 子类调用超类方法的例子:
    >>> class Thought(object):
    ...     def __init__(self) -> None:
    ...         print("我是类型Thought的新对象!")
    ...     def message(self) -> None:
    ...         print("我觉得我好像斜停在平行宇宙中.")
    ... 
    >>> class Advice(Thought):
    ...     def __init__(self) -> None:
    ...         super(Advice, self).__init__()
    ...     def message(self) -> None:
    ...         print("警告: 日历里的日期比看起来更近了!")
    ...         super(Advice, self).message()
    ... 
    >>> t = Thought()
    我是类型Thought的新对象!
    >>> t.message()
    我觉得我好像斜停在平行宇宙中.
    >>> a = Advice()
    我是类型Thought的新对象!
    >>> a.message()
    警告: 日历里的日期比看起来更近了!
    我觉得我好像斜停在平行宇宙中.
    >>> # 内省一下:
    >>> isinstance(t, Thought)
    True
    >>> isinstance(a, Advice)
    True
    >>> isinstance(a, Thought)
    True
    
  18. ^ 定义了属性的类的例子:
    class MyClass:
        def __init__(self):
            self._a = None
    
        @property
        def a(self):
            return self._a
    
        @a.setter  # 使属性可写
        def a(self, value):
            self._a = value
    
  19. ^ 数学运算示例。比如:
    >>> import math
    >>> print(math.sin(math.pi/2))
    1.0
    
  20. ^ 正文程序示例適用於Python 3.0以上版本以及Python 2.6、Python 2.7。下列示例適用於Python 2.6以下版本:
    print "Hello, world!"
    
    >>> print "Hello, world!"
    Hello, world!
    
  21. ^ 在Python 2.6与Python 2.7里面,以下三种形式是等价的:
    print "fish"
    print ("fish") #注意print后面有个空格
    print("fish") #print()不能带有任何其它参数
    

    然而,Python 2.6实际已经支持新的print()语法:

    from __future__ import print_function
    print("fish", "panda", sep=', ')
    
  22. ^ Python 2.6可以自动地将字节序列识别为Unicode字符串,方法是:
    from __future__ import unicode_literals
    print(repr("fish"))
    
  23. ^ 为了让Python 2.6统一返回浮点数值,可以:
    from __future__ import division
    print(3/2)
    

参考文献编辑

  1. ^ Python 3.8.6. Python Software Foundation. [2020-09-23]. 
  2. ^ Python Releases for Windows. Python Software Foundation. [2020-09-17]. 
  3. ^ PEP 483 -- The Theory of Type Hints. Python.org. 
  4. ^ File extension .pyo was removed in Python 3.5. See PEP 0488
  5. ^ Holth, Moore. PEP 0441 -- Improving Python ZIP Application Support. 30 March 2014 [12 November 2015]. 
  6. ^ 彼德·諾米格. Python for Lisp Programmers. Python can be seen as a dialect of Lisp with "traditional" syntax (what Lisp people call "infix" or "m-lisp" syntax). 
  7. ^ 7.0 7.1 Why was Python created in the first place?. Python FAQ. [March 22, 2007]. 
  8. ^ Whetting Your Appetite. The Python Tutorial. Python Software Foundation. [20 February 2012]. 
  9. ^ Fairchild, Carlie. Guido van Rossum Stepping Down from Role as Python's Benevolent Dictator For Life. Linux Journal. 12 July 2018 [13 July 2018]. 
  10. ^ Guido van Rossum Stepping Down from Role as Python's Benevolent Dictator For Life | Linux Journal. www.linuxjournal.com (英语). 
  11. ^ Python boss Guido van Rossum steps down after 30 years. The Inquirer (英语). 
  12. ^ PEP 8100. python. Python Software Foundation. [4 May 2019]. 
  13. ^ HISTORY. Python source distribution. Python Foundation. [2017-11-23]. 
  14. ^ The Making of Python. Artima Developer. [March 22, 2007]. 
  15. ^ van Rossum, Guido. The fate of reduce() in Python 3000. Artima Developer. [2007-03-22]. 
  16. ^ LJ #37: Python 1.4 Update. [2007-04-29]. (原始内容存档于May 1, 2007). 
  17. ^ Kuchling, A. M.; Zadka, Moshe. What's New in Python 2.0. Python Software Foundation. 16 October 2000 [11 February 2012]. 
  18. ^ Hylton, Jeremy. PEP 227 -- Statically Nested Scopes. 2000-11-01 [2007-03-22]. 
  19. ^ Schemenauer, Neil; Peters, Tim; Hetland, Magnus. PEP 255 -- Simple Generators. 2001-12-21 [2008-09-05]. 
  20. ^ Highlights: Python 2.5. Python.org. 
  21. ^ Python 3.0 Release. Python Software Foundation. [8 July 2009]. 
  22. ^ Automated Python 2 to 3 code translation — Python Documentation. [11 February 2018]. 
  23. ^ van Rossum, Guido. PEP 3000 – Python 3000. Python Enhancement Proposals. Python Software Foundation. 5 April 2006 [27 June 2009]. 
  24. ^ PEP 373 -- Python 2.7 Release Schedule. python.org. [9 January 2017]. 
  25. ^ PEP 466 -- Network Security Enhancements for Python 2.7.x. python.org. [9 January 2017]. 
  26. ^ PEP 8100. Python Software Foundation. [4 May 2019]. 
  27. ^ The Cain Gang Ltd. Python Metaclasses: Who? Why? When? (PDF). [27 June 2009]. (原始内容 (PDF)存档于30 May 2009). 
  28. ^ 3.3. Special method names. The Python Language Reference. Python Software Foundation. [27 June 2009]. 
  29. ^ PyDBC: method preconditions, method postconditions and class invariants for Python. [24 September 2011]. 
  30. ^ Contracts for Python. [24 September 2011]. 
  31. ^ PyDatalog. [22 July 2012]. 
  32. ^ Extending and Embedding the Python Interpreter: Reference Counts. Docs.python.org. [5 June 2020] (英语). Since Python makes heavy use of malloc() and free(), it needs a strategy to avoid memory leaks as well as the use of freed memory. The chosen method is called reference counting. 
  33. ^ 33.0 33.1 Hettinger, Raymond. PEP 289 – Generator Expressions. Python Enhancement Proposals. Python Software Foundation. 30 January 2002 [19 February 2012]. 
  34. ^ 6.5 itertools – Functions creating iterators for efficient looping. Docs.python.org. [22 November 2016]. 
  35. ^ 2. Lexical analysis. Python v3.8.6 documentation. Docs.python.org. [2020-09-26]. 
  36. ^ 2. Lexical analysis. Python v2.7.18 documentation. Docs.python.org. [2020-09-26]. 
  37. ^ New Keywords. Python v3.5 documentation. Docs.python.org. [2016-06-01]. (原始内容存档于2016-06-18). 
  38. ^ In Python, should I use else after a return in an if block?. Stack Overflow. Stack Exchange. 17 February 2011 [6 May 2011]. 
  39. ^ The "with" Statement. [2020-09-26]. 
  40. ^ van Rossum, Guido. Tail Recursion Elimination. Neopythonic.blogspot.be. 22 April 2009 [3 December 2012]. 
  41. ^ van Rossum, Guido. Language Design Is Not Just Solving Puzzles. Artima forums. Artima. 9 February 2006 [21 March 2007]. 
  42. ^ van Rossum, Guido; Eby, Phillip J. PEP 342 – Coroutines via Enhanced Generators. Python Enhancement Proposals. Python Software Foundation. 10 May 2005 [19 February 2012]. 
  43. ^ PEP 380. Python.org. [3 December 2012]. 
  44. ^ division. python.org. 
  45. ^ PEP 0465 -- A dedicated infix operator for matrix multiplication. python.org. [1 January 2016]. 
  46. ^ Python 3.5.1 Release and Changelog. python.org. [1 January 2016]. 
  47. ^ What’s New in Python 3.8. [14 October 2019]. 
  48. ^ Chapter 15. Expressions - 15.21.1. Numerical Equality Operators == and !=. Oracle Corporation. [28 August 2016]. 
  49. ^ Chapter 15. Expressions - 15.21.3. Reference Equality Operators == and !=. Oracle Corporation. [28 August 2016]. 
  50. ^ 4. Built-in Types — Python 3.6.3rc1 documentation. python.org. [1 October 2017]. 
  51. ^ 5.3. Tuples and Sequences — Python 3.7.1rc2 documentation. python.org. [17 October 2018]. 
  52. ^ 52.0 52.1 PEP 498 -- Literal String Interpolation. python.org. [8 March 2017]. 
  53. ^ Python 2.4 Decorators: Reducing code duplication and consolidating knowledge. Dr. Dobb's. 2005-05-01 [2007-02-08]. (原始内容存档于2007-02-06). 
  54. ^ New Tail Recursion Decorator. ASPN: Python Cookbook. 2006-11-14 [2007-02-08]. (原始内容存档于2007-02-09). 
  55. ^ The decorator module. [2007-02-08]. (原始内容存档于2007-02-10). 
  56. ^ Why must 'self' be used explicitly in method definitions and calls?. Design and History FAQ. Python Software Foundation. [19 February 2012]. 
  57. ^ super().method, in Python 3. 
  58. ^ The Python Language Reference, section 3.3. Special method names, for release 3.8.6. [2020-09-25]. 
  59. ^ The Python Language Reference, section 3.3. New-style and classic classes, for release 2.7.18. [2020-09-25]. 
  60. ^ Guido van Rossum. Unifying types and classes in Python 2.2. 
  61. ^ Type hinting for Python. LWN.net. 24 December 2014 [5 May 2015]. 
  62. ^ mypy - Optional Static Typing for Python. [28 January 2017]. 
  63. ^ 15. Floating Point Arithmetic: Issues and Limitations — Python 3.8.3 documentation. docs.python.org. [6 June 2020]. almost all platforms map Python floats to IEEE-754 double precision 
  64. ^ Zadka, Moshe; van Rossum, Guido. PEP 237 – Unifying Long Integers and Integers. Python Enhancement Proposals. Python Software Foundation. 11 March 2001 [24 September 2011]. 
  65. ^ Built-in Types. [3 October 2019]. 
  66. ^ PEP 465 -- A dedicated infix operator for matrix multiplication. python.org. 
  67. ^ Zadka, Moshe; van Rossum, Guido. PEP 238 – Changing the Division Operator. Python Enhancement Proposals. Python Software Foundation. 11 March 2001 [23 October 2013]. 
  68. ^ round, The Python standard library, release 3.2, §2: Built-in functions, [14 August 2011] 
  69. ^ Beazley, David M. Python Essential Reference 4th. 2009: 66. 
  70. ^ Kernighan, Brian W.; Ritchie, Dennis M. The C Programming Language 2nd. 1988: 206. 
  71. ^ Batista, Facundo. PEP 0327 -- Decimal Data Type. Python.org. [26 September 2015]. 
  72. ^ What's New in Python 2.6 — Python v2.6.9 documentation. docs.python.org. [26 September 2015]. 
  73. ^ 10 Reasons Python Rocks for Research (And a Few Reasons it Doesn't) – Hoyt Koepke. www.stat.washington.edu. [3 February 2019]. 
  74. ^ Shell, Scott. An introduction to Python for scientific computing (PDF). 17 June 2014 [3 February 2019]. 
  75. ^ Przemyslaw Piotrowski, Build a Rapid Web Development Environment for Python Server Pages and Oracle, Oracle Technology Network, July 2006. Accessed October 21, 2008.
  76. ^ http://www.Python.org CPython
  77. ^ PyPy compatibility. Pypy.org. [3 December 2012]. 
  78. ^ speed comparison between CPython and Pypy. Speed.pypy.org. [3 December 2012]. 
  79. ^ Shaw, Anthony. Which is the fastest version of Python?. Hacker Noon. 30 March 2018 [20 December 2019]. 
  80. ^ Application-level Stackless features — PyPy 2.0.2 documentation. Doc.pypy.org. [17 July 2013]. 
  81. ^ Nuitka Home | Nuitka Home. nuitka.net. [18 August 2017] (英语). 
  82. ^ Borderies, Olivier. Pythran: Python at C++ speed !. Medium. 24 January 2019. 
  83. ^ Pythran — Pythran 0.9.5 documentation. pythran.readthedocs.io. 
  84. ^ google/grumpy. 10 April 2020 –通过GitHub. 
  85. ^ Projects. opensource.google. 
  86. ^ Gotchas for Python Users. boo.codehaus.org. Codehaus Foundation. [24 November 2008]. (原始内容存档于11 December 2008). 
  87. ^ Esterbrook, Charles. Acknowledgements. cobra-language.com. Cobra Language. [7 April 2010]. 
  88. ^ Proposals: iterators and generators [ES4 Wiki]. wiki.ecmascript.org. [24 November 2008]. (原始内容存档于20 October 2007). 
  89. ^ FAQ: What is GDScript and why should I use it?. 
  90. ^ Kincaid, Jason. Google's Go: A New Programming Language That's Python Meets C++. TechCrunch. 10 November 2009 [29 January 2010]. 
  91. ^ Strachan, James. Groovy – the birth of a new dynamic language for the Java platform. 29 August 2003 [11 June 2007]. (原始内容存档于5 April 2007). 
  92. ^ Why We Created Julia. Julia website. February 2012 [5 June 2014]. We want something as usable for general programming as Python [...] 
  93. ^ Yegulalp, Serdar. Nim language draws from best of Python, Rust, Go, and Lisp. InfoWorld. 16 January 2017. 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). 
  94. ^ An Interview with the Creator of Ruby. Linuxdevcenter.com. [3 December 2012]. 
  95. ^ Lattner, Chris. Chris Lattner's Homepage. Chris Lattner. 3 June 2014 [3 June 2014]. 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. 
  96. ^ 96.0 96.1 Guido van Rossum. What’s New in Python 3.0. Python Software Foundation. 2009-02-14 [2011-02-22] (英语). 
  97. ^ Python Language Guide (v1.0). Google Documents List Data API v1.0. Google. [2012-11-30]. (原始内容存档于2010-08-11). 
  98. ^ 《Python技术手册》的作者马特利(Alex Martelli). Heavy usage of Python at Google. 這很難講,不過,2004年,Python已在Google內部使用,Google召募許多Python高手,但在這之前就已決定使用Python。他們的目的是尽量使用Python,在不得已时改用C++;在操控硬體的場合使用C++,在快速開發時候使用Python。 

延伸閱讀编辑

参见编辑

外部链接编辑