本頁使用了標題或全文手工轉換

Python

維基百科,自由的百科全書
跳至導覽 跳至搜尋
Python
Python logo and wordmark.svg
編程範型 多泛型面向對象指令式編程函數式編程程序編程面向切面編程
設計者 吉多·范羅蘇姆
實作者 Python軟件基金會
面市時間 1991年,​28年前​(1991
穩定版本
3.7.2 /
2018年12月23日 (2018-12-23)[1]
2.7.15 /
2018年5月1日 (2018-05-01)[2]
預覽版本
3.7.2rc1 /
2018年12月11日 (2018-12-11)[3]
3.6.8rc1 /
2018年12月11日 (2018-12-11)[4]
型態系統 "duck"動態類型強類型
作業系統 跨平台
許可證 Python軟件基金會許可證
文件擴展名 .py、.pyw、.pyc、.pyo、.pyd、.pyz
網站 www.python.org
主要實作產品
CPythonPyPyIronPythonJython
衍生副語言
CythonRPythonStackless Python
啟發語言
ABCALGOL 68CC++Dylan英語Dylan (programming language)HaskellIconJavaLispModula-3Perl
影響語言
BooCobraDF#FalconGoGroovyJavaScriptRuby

Python英國發音:/ˈpaɪθən/ 美國發音:/ˈpaɪθɑːn/),是一種廣泛使用的高級編程語言,屬於通用型編程語言,由吉多·范羅蘇姆創造,第一版發布於1991年。可以視之為一種改良(加入一些其他程式語言的優點,如物件導向)的LISP。作為一種解釋型語言,Python的設計哲學強調代碼的可讀性和簡潔的語法(尤其是使用空格縮進劃分代碼塊,而非使用大括號或者關鍵詞)。相比於C++或Java,Python讓開發者能夠用更少的代碼表達想法。不管是小型還是大型程序,該語言都試圖讓程序的結構清晰明了。

SchemeRubyPerlTcl等動態類型編程語言一樣,Python擁有動態類型系統垃圾回收功能,能夠自動管理內存使用,並且支持多種編程範式,包括面向對象、命令式、函數式和過程式編程。其本身擁有一個巨大而廣泛的標準庫。

Python 解釋器本身幾乎可以在所有的操作系統中運行。Python的正式直譯器CPython是用C語言編寫的、是一個由社群驅動的自由軟件,目前由Python軟件基金會管理。

歷史[編輯]

Python的創始人為吉多·范羅蘇姆(Guido van Rossum)。

Python的創始人為吉多·范羅蘇姆。1989年的聖誕節期間,吉多·范羅蘇姆為了在阿姆斯特丹打發時間,決心開發一個新的腳本解釋程式,作為ABC語言的一種繼承。之所以選中Python作為程式的名字,是因為他是BBC電視劇——蒙提·派森的飛行馬戲團的愛好者。ABC是由吉多參加設計的一種教學語言。就吉多本人看來,ABC這種語言非常優美和強大,是專門為非專業程式設計師設計的。但是ABC語言並沒有成功,究其原因,吉多認為是非開放造成的。吉多決心在Python中避免這一錯誤,並取得了非常好的效果,完美結合了C和其他一些語言。[5]

就這樣,Python在吉多手中誕生了。實際上,第一個實現是在Mac機上。可以說,Python是從ABC發展起來,主要受到了Modula-3(另一種相當優美且強大的語言,為小型團體所設計的)的影響。並且結合了Unix shell和C的習慣。

目前吉多仍然是Python的主要開發者,決定整個Python語言的發展方向。Python社群經常稱呼他是終身仁慈獨裁者(BDFL)。

Python 2.0於2000年10月16日發布,增加了實現完整的垃圾回收,並且支持Unicode。同時,整個開發過程更加透明,社群對開發進度的影響逐漸擴大。

Python 3.0於2008年12月3日發布,此版不完全兼容之前的Python原始碼。不過,很多新特性後來也被移植到舊的Python 2.6/2.7版本。

特性與設計哲學[編輯]

Python是完全物件導向的語言。函數、模組、數字、字串都是物件。並且完全支持繼承、重載、派生、多重繼承,有益於增強原始碼的複用性。Python支持重載運算符,因此Python也支持泛型設計。相對於Lisp這種傳統的函數式程式語言,Python對函數式編程只提供了有限的支持。有兩個標準庫(functools, itertools)提供了與HaskellStandard ML中類似的函數式程式設計工具。

雖然Python可能被粗略地分類為「腳本語言」,但實際上一些大規模軟體開發計劃例如Zope、Mnet及BitTorrentGoogle也廣泛地使用它。Python的支持者較喜歡稱它為一種高階動態程式語言,原因是「腳本語言」泛指僅作簡單程式設計任務的語言,如shell script、VBScript等只能處理簡單任務的程式語言,並不能與Python相提並論。

Python本身被設計為可擴充的。並非所有的特性和功能都集成到語言核心。Python提供了豐富的API和工具,以便程式設計師能夠輕鬆地使用CC++Cython來編寫擴充模組。Python編譯器本身也可以被集成到其它需要腳本語言的程式內。因此,有很多人把Python作為一種「膠水語言」使用。使用Python將其他語言編寫的程式進行集成和封裝。在Google內部的很多項目,例如Google應用服務引擎使用C++編寫性能要求極高的部分,然後用Python或Java/Go調用相應的模組。[6]《Python技術手冊》的作者馬特利(Alex Martelli)說:「這很難講,不過,2004年,Python已在Google內部使用,Google召募許多Python高手,但在這之前就已決定使用Python。他們的目的是儘量使用Python,在不得已時改用C++;在操控硬體的場合使用C++,在快速開發時候使用Python。」[7]

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

>>> import this

The Zen of Python

by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

--From: Python.org

Python開發人員盡量避開不成熟或者不重要的優化。一些針對非重要部位的加快運行速度的補丁通常不會被合併到Python內。再加上因為Python屬於動態類型語言,動態類型語言是在運行期間檢查數據的類型,不得不保持描述變量值的實際類型標記,程序在每次操作變量時,需要執行數據依賴分支,而靜態類型語言相對於動態類型語言,在聲明變量時已經指定了數據類型和表示方法,根據這一原理導致Python相對於C、Visual Basic等靜態類型語言來說運行速度較慢。不過,根據二八定律,大多數程式對速度要求不高。在某些對運行速度要求很高的情況,Python設計師傾向於使用JIT技術,或者用使用C/C++語言改寫這部分程式。[來源請求]目前可用的JIT技術是PyPy

應用範圍[編輯]

網絡應用程式[編輯]

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這個流行的第三方庫,同樣能夠支持高性能高並發的網絡開發。

GUI開發[編輯]

Python本身包含的Tkinter庫能夠支持簡單的GUI開發。但是越來越多的Python程序員選擇wxPython或者PyQt等GUI套件來開發跨平台的桌面軟件。使用它們開發的桌面軟件運行速度快,與用戶的桌面環境相契合。通過PyInstaller還能將程序發布為獨立的安裝程序包。

作業系統[編輯]

在很多作業系統裡,Python是標準的系統元件。大多數Linux發行版和Mac OS X都集成了Python,可以在終端機下直接執行Python。有一些Linux發行版的安裝器使用Python語言編寫,比如Ubuntu的Ubiquity安裝器、Red Hat Linux和Fedora的Anaconda安裝器。在RPM系列Linux發行版中,有一些系統組件就是用Python編寫的。Gentoo Linux使用Python來編寫它的Portage軟件包管理系統。Python標準庫包含了多個調用作業系統功能的函式庫。通過pywin32這個第三方軟體包,Python能夠訪問Windows的COM服務及其它Windows API。使用IronPython,Python程式能夠直接調用.Net Framework。

科學計算[編輯]

NumPySciPyMatplotlib可以讓Python程式設計師編寫科學計算程式。有些公司會使用Scons代替make構建C++程序。

很多遊戲使用C++編寫圖形顯示等高性能模組,而使用Python或者Lua編寫遊戲的邏輯、伺服器。相較於Python,Lua的功能更簡單、體積更小;而Python則支援更多的特性和數據類型。很多遊戲,如EVE Online使用Python來處理遊戲中繁多的邏輯。

YouTube、Google、Yahoo!、NASA都在內部大量地使用Python。OLPC的作業系統Sugar項目的大多數軟體都是使用Python編寫。

Hello World[編輯]

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

  • 適用於Python 3.0以上版本以及Python 2.6、Python 2.7
print("Hello, world!")
  • 適用於Python 2.6以下版本
print "Hello, world!"

單步執行[編輯]

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

  • 適用於Python 3.0以上版本以及Python 2.6、Python 2.7
>>> print('Hello, world!')
Hello, world!
  • 適用於Python 2.6以下版本
>>> print "Hello, world!"
Hello, world!

注意,在3.0及以上版本中,需要在"Hello,world"周圍加上圓括號。其原因是在3.0及以上版本中,print命令不再是一個關鍵字,而是一個函數。

語法[編輯]

Python的設計目標之一是讓程式碼具備高度的可閱讀性。它設計時盡量使用其它語言經常使用的標點符號和英文單字,讓程式碼看起來整潔美觀。因為Python是動態語言,它不像其他的靜態語言如CPascal那樣需要書寫聲明語句。

縮排[編輯]

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

if age < 21:
    print("你不能買酒")#美國法律規定21歲以下的人不能購買酒
    print("不過你能買口香糖")
print("這句話處於if語句塊的外面")
  • 註:上述例子為Python 3.0以上版本的程式碼。

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

標識符[編輯]

  • _單下劃線開頭:弱「內部使用」標識。對於「from M import *」,將不導入所有以下劃線開頭的對象,包括包、模塊、成員。
  • 單下劃線結尾_:為了避免與python關鍵字的命名衝突
  • __雙下劃線開頭:模塊內的成員,表示私有成員,外部無法直接調用
  • __雙下劃線開頭雙下劃線結尾__:指那些包含在用戶無法控制的命名空間中的「魔術」對象或屬性,如類成員的name 、doc、init、import、file、等。推薦永遠不要將這樣的命名方式應用於自己的變量或函數。

語句和控制流[編輯]

  • if語句,當條件成立時執行語句塊。經常與else, elif(相當於else if)配合使用。
  • for語句,遍歷列表、字符串、字典、集合等迭代器,依次處理迭代器中的每個元素。
  • while語句,當條件為真時,循環執行語句塊。
  • try語句。與except, finally, else配合使用處理在程式執行中出現的異常情況。
  • class語句。用於定義類型。
  • def語句。用於定義函數和類型的方法。
  • pass語句。表示此行為空,不執行任何操作。
  • assert語句。用於程式調適階段時測試執行條件是否滿足。
  • with語句。Python2.6以後定義的語法,在一個場景中執行語句塊。比如,執行語句塊前加鎖,然後在語句塊執行結束後釋放鎖。
  • yield語句。在迭代器函數內使用,用於返回一個元素。自從Python 2.5版本以後。這個語句變成一個運算符。
  • raise語句。拋出一個異常。
  • import語句。導入一個模塊或包。常用寫法:from module import name, import module as name, from module import name as anothername

表達式[編輯]

Python的表達式寫法與C/C++類似。只是在某些寫法有所差別。

  • 主要的算術運算符與C/C++類似。+, -, *, /, //, **, ~, %分別表示加法或者取正、減法或者取負、乘法、除法、整除、乘方、取反、取餘數。>>, <<表示右移和左移。&, |, ^表示二進制的AND, OR, XOR運算。>, <, ==, !=, <=, >=用於比較兩個表達式的值,分別表示大於、小於、等於、不等於、小於等於、大於等於。在這些運算符裡面,~, |, ^, &, <<, >>必須應用於整數。
  • Python使用and, or, not表示邏輯運算。
  • is, is not用於比較兩個變量是否是同一個對象。in, not in用於判斷一個對象是否屬於另外一個對象。
  • Python支持字典、集合、列表的推導式(dict comprehension, set comprehension, list comprehension)。比如:
>>> [x + 3 for x in range(4)]
[3, 4, 5, 6]
>>> {x + 3 for x in range(4)}
{3, 4, 5, 6}
>>> {x: x + 3 for x in range(4)}
{0: 3, 1: 4, 2: 5, 3: 6}
  • Python支持「迭代表達式」(generator comprehension),比如計算0-9的平方和:
>>> sum(x * x for x in range(10))
285
  • Python使用lambda表示匿名函數。匿名函數體只能是表達式。比如:
>>> add = lambda x, y : x + y
>>> add(3, 2)
5
  • Python使用y if cond else x表示條件表達式。意思是當cond為真時,表達式的值為y,否則表達式的值為x。相當於C++和Java里的cond?y:x
  • Python區分列表(list)和元組(tuple)兩種類型。list的寫法是[1,2,3],而tuple的寫法是(1,2,3)。可以改變list中的元素,而不能改變tuple。在某些情況下,tuple的括號可以省略。tuple對於賦值語句有特殊的處理。因此,可以同時賦值給多個變量,比如:
>>> x, y=1, 2 #同时给x,y赋值,最终结果:x=1, y=2

特別地,可以使用以下這種形式來交換兩個變量的值:

>>> x, y = y, x #最终结果:y=1, x=2
  • Python使用'(單引號)和"(雙引號)來表示字符串。與Perl、Unix Shell語言或者Ruby、Groovy等語言不一樣,兩種符號作用相同。一般地,如果字符串中出現了雙引號,就使用單引號來表示字符串;反之則使用雙引號。如果都沒有出現,就依個人喜好選擇。出現在字符串中的\(反斜槓)被解釋為特殊字符,比如\n表示換行符。表達式前加r指示Python不解釋字符串中出現的\。這種寫法通常用於編寫正則表達式或者Windows文件路徑。
  • Python支持列表切割(list slices),可以取得完整列表的一部分。支持切割操作的類型有str, bytes, list, tuple等。它的語法是...[left:right]或者...[left:right:stride]。假定nums變量的值是[1, 3, 5, 7, 8, 13, 20],那麼下面幾個語句為真:
    • nums[2:5] == [5, 7, 8]從下標為2的元素切割到下標為5的元素,但不包含下標為5的元素。
    • nums[1:] == [3, 5, 7, 8, 13, 20]切割到最後一個元素。
    • nums[:-3] == [1, 3, 5, 7]從最開始的元素一直切割到倒數第3個元素。
    • nums[:] == [1, 3, 5, 7, 8, 13, 20]返回所有元素。改變新的列表不會影響到nums。
    • nums[1:5:2] == [3, 7]從下標為1的元素切割到下標為5的元素但不包含下標為5的元素,且步長為2

函數[編輯]

Python的函數支持遞歸、默認參數值、可變參數、閉包,但不支持函數重載。為了增強代碼的可讀性,可以在函數後書寫「文檔字符串」(Documentation Strings,或者簡稱docstrings),用於解釋函數的作用、參數的類型與意義、返回值類型與取值範圍等。可以使用內置函數help()打印出函數的使用幫助。比如:

>>> 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.

函數調用時,實參可以如同C語言那樣按照位置與形參匹配;也可以按照命名參數英語Named parameter形式調用,即 param_name=value 形式的實參。在一個函數調用的實參表中,關鍵字引數必須出現在位置參數之後。

可變參數用*args或**dictargs表示,即在形式參數名字前加一個*號,表示這是由多個實參組成的可變參數,該形參視作tuple數據類型;在形式參數名字前加**號,表示這是由多個實參組成的可變參數,該形參視作dict數據類型。實際上,在一個"集合(collection)類型"(包括set、list、tuple甚至bytes、str等)的變量前加一個*號,獲得了其中所有元素作為多個對象。

Python的函數作為第一類物件,具有和普通變量平等的地位。函數一旦定義,即可視作為普通對象,其形參會保留上次調用時的值,但在函數新的一次調用時會被實參值覆蓋。因此函數的缺省參數值在連續多次調用該函數時,如果不被實參值覆蓋,就會一直保留。例如:

def f(a, L=[]):
    L.append(a)
    return L

print(f(1))
print(f(2))
print(f(3))

結果為:

[1]
[1, 2]
[1, 2, 3]

函數的缺省參數值在函數被定義時被一次性計算其初值。

Python的函數實參與形參之間的結合是傳遞對象的引用[8]。這是因為Python的賦值操作是把(變量)名字綁定到對象上。形實結合也是這種方式。如果形參綁定到一個可變的對象,則通過形參對此對象內容的修改,在函數外也是可見的。如果形參綁定到一個不可變的對象,則通過形參是不能修改此對象內容,但可以把形參重新綁定到其它對象上,這並不影響函數外的對象的值。例如:

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

面向對象開發方法[編輯]

面向對象開發方法是指綁定到對象的函數。調用對象方法的語法是instance.method(arguments)。它等價於調用Class.method(instance, arguments)。當定義對象方法時,必須顯式地定義第一個參數,一般該參數名都使用self,用於訪問對象的內部數據。這裡的self相當於C++, Java裡面的this變量,但是我們還可以使用任何其它合法的參數名,比如thismine等,self與C++,Java裡面的this不完全一樣,它可以被看作是一個習慣性的用法,我們傳入任何其它的合法名稱都行,比如:

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

Python支持一些以「__」開始並以「__」結束的特殊方法名,它們用於實現運算符重載和實現多種特殊功能。

數據類型與動態類型[編輯]

Python採用動態類型系統。在編譯的時候,Python不會檢查對象是否擁有被調用的方法或者屬性,而是直至運行時,才做出檢查。所以操作對象時可能會拋出異常。不過,雖然Python採用動態類型系統,它同時也是強類型的。Python禁止沒有明確定義的操作,比如數字加字符串。

與其它面向對象語言一樣,Python允許程序員定義類型。構造一個對象只需要像函數一樣調用類型即可,比如,對於前面定義的Fish類型,使用Fish()。類型本身也是特殊類型type的對象(type類型本身也是type對象),這種特殊的設計允許對類型進行反射編程。

Python內置多種數據類型。下面這個列表簡要地描述了Python內置數據類型(適用於Python 3.x):

類型 描述 例子
str 一個由字符組成的不可更改的有序列。在Python 3.x里,字符串由Unicode字符組成。 'Wikipedia'
"Wikipedia"
"""Spanning
multiple
lines"""
bytes 一個由字節組成的不可更改的有序列。 b'Some ASCII'
b"Some ASCII"
list 可以包含多種類型的可改變的有序列 [4.0, 'string', True]
tuple 可以包含多種類型的不可改變的有序列 (4.0, 'string', True)
set, frozenset 與數學中集合的概念類似。無序的、每個元素唯一。 {4.0, 'string', True}
frozenset([4.0, 'string', True])
dict 一個可改變的由鍵值對組成的無序列。 {'key1': 1.0, 3: False}
int 精度不限的整數 42
float 浮點數。精度與系統相關。 3.1415927
complex 複數 3+2.7j
bool 邏輯值。只有兩個值:真、假 True
False

除了各種數據類型,Python語言還用類型來表示函數、模塊、類型本身、對象的方法、編譯後的Python代碼、運行時信息等等。因此,Python具備很強的動態性。

數學運算[編輯]

Python使用與C、Java類似的運算符,支持整數與浮點數的數學運算。同時還支持複數運算與無窮位數(實際受限於計算機的能力)的整數運算。除了求絕對值函數abs()外,大多數數學函數處於mathcmath模塊內。前者用於實數運算,而後者用於複數運算。使用時需要先導入它們,比如:

>>> import math
>>> print(math.sin(math.pi/2))
1.0

fractions模塊用於支持分數運算;decimal模塊用於支持高精度的浮點數運算;第三方庫Sympy用於支持數學符號運算。

Python定義求余運行a % b的值處於開區間[0, b)內,如果b是負數,開區間變為(b, 0]。這是一個很常見的定義方式。不過其實它依賴於整除的定義。為了讓方程式:b * (a // b) + a % b = a恆真,整除運行需要向負無窮小方向取值。比如7 // 3的結果是2,而(-7) // 3的結果卻是-3。這個算法與其它很多編程語言不一樣,需要注意,它們的整除運算會向0的方向取值。

Python允許像數學的常用寫法那樣連着寫兩個比較運行符。比如a < b < ca < b and b < c等價。C++的結果與Python不一樣,首先它會先計算a < b,根據兩者的大小獲得0或者1兩個值之一,然後再與c進行比較。

標準庫[編輯]

Python擁有一個強大的標準庫[9]。Python語言的核心只包含數字、字符串、列表、字典、文件等常見類型和函數,而由Python標準庫提供了系統管理、網絡通信、文本處理、數據庫接口、圖形系統、XML處理等額外的功能。

Python標準庫的主要功能有:

  • 文本處理,包含文本格式化、正則表達式匹配、文本差異計算與合併、Unicode支持,二進制數據處理等功能
  • 文件處理,包含文件操作、創建臨時文件、文件壓縮與歸檔、操作配置文件等功能
  • 操作系統功能,包含線程與進程支持、IO復用、日期與時間處理、調用系統函數、日誌(logging)等功能
  • 網絡通信,包含網絡套接字,SSL加密通信、異步網絡通信等功能
  • 網絡協議,支持HTTP,FTP,SMTP,POP,IMAP,NNTP,XMLRPC等多種網絡協議,並提供了編寫網絡服務器的框架
  • W3C格式支持,包含HTML,SGML,XML的處理。
  • 其它功能,包括國際化支持、數學運算、HASH、Tkinter等

Python社區提供了大量的第三方模塊,使用方式與標準庫類似。它們的功能覆蓋科學計算、Web開發、數據庫接口、圖形系統多個領域。第三方模塊可以使用Python或者C語言編寫。SWIG,SIP常用於將C語言編寫的程序庫轉化為Python模塊。Boost C++ Libraries包含了一組函式庫,Boost.Python,使得以Python或C++編寫的程式能互相調用。Python常被用做其他語言與工具之間的「膠水」語言。

著名第三方庫[編輯]

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異步特性。

科學計算[編輯]

Matplotlib
用Python實現的類matlab的第三方庫,用以繪製一些高質量的數學二維圖形。
Pandas
用於數據分析、數據建模、數據可視化的第三方庫。
SciPy
基於Python的matlab實現,旨在實現matlab的所有功能。
NumPy
基於Python的科學計算第三方庫,提供了矩陣,線性代數,傅立葉變換等等的解決方案。

GUI[編輯]

PyGtk
基於Python的GUI程序開發GTK+庫。
PyQt
用於Python的QT開發庫。
WxPython
Python下的GUI編程框架,與MFC的架構相似。

其它[編輯]

BeautifulSoup
基於Python的HTML/XML解析器,簡單易用。
gevent
python的一個高性能並發框架,使用了epoll事件監聽、協程等機制將異步調用封裝為同步調用。
PIL
基於Python的圖像處理庫,功能強大,對圖形文件的格式支持廣泛。目前已無維護,另一個第三方庫Pillow實現了對PIL庫的支持和維護。
PyGame
基於Python的多媒體開發和遊戲軟件開發模塊。
Py2exe
將python腳本轉換為windows上可以獨立運行的可執行程序。
Requests
適合於人類使用的HTTP庫,封裝了許多繁瑣的HTTP功能,極大地簡化了HTTP請求所需要的代碼量。
scikit-learn
機器學習第三方庫,實現許多知名的機器學習演算法。
TensorFlow
Google開發維護的開源機器學習庫。
Keras
基於TensorFlowTheanoCNTK的高階神經網路API
SQLAlchemy
關係型數據庫對象關係映射(ORM)工具

Python 3.0[編輯]

Python的3.0版本,常被稱為Python 3000,或簡稱Py3k[10]。相對於Python的早期版本,這是一個較大的升級。為了不帶入過多的累贅,Python 3.0在設計的時候沒有考慮向下兼容。許多針對早期Python版本設計的程序都無法在Python 3.0上正常運行。為了照顧現有程序,Python 2.6作為一個過渡版本,基本使用了Python 2.x的語法和,同時考慮了向Python 3.0的遷移,允許使用部分Python 3.0的語法與函數。基於早期Python版本而能正常運行於Python 2.6並無警告的程序可以通過一個2 to 3的轉換工具無縫遷移到Python 3.0[11]

新的Python程序建議使用Python 3.0版本的語法[12]。除非運行環境無法安裝Python 3.0或者程序本身使用了不支持Python 3.0的第三方庫。目前不支持Python 3.0的第三方庫有Twisted, PIL等。大多數第三方庫都正在努力地兼容Python 3.0版本。即使無法立即使用Python 3.0,也建議編寫兼容Python 3.0版本的程序,然後使用Python 2.6, Python 2.7來運行。

Python 2.7被確定為最後一個Python 2.x版本,它除了支持Python 2.x語法外,還支持部分Python 3.1語法。

主要變化[編輯]

Python 3.0的變化主要在以下幾個方面[13]

  • print語句沒有了,取而代之的是print()函數。可以使用2to3工具來自動轉換。Python 2.6與Python 2.7部分地支持這種形式的print語法。在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=', ')
  • 新的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
print(repr("fish"))
  • 除法運算符/在Python 3.x內總是返回浮點數。而在Python 2.6內會判斷被除數與除數是否是整數。如果是整數會返回整數值,相當於整除;浮點數則返回浮點數值。為了讓Python 2.6統一返回浮點數值,可以:
from __future__ import division
print(3/2)
  • 捕獲異常的語法由except exc, var改為except exc as var。使用語法except (exc1, exc2) as var可以同時捕獲多種類型的異常。Python 2.6已經支持這兩種語法。
  • 集合(set)的新寫法:{1,2,3,4}。注意{}仍然表示空的字典(dict)。
result={}
for k, v in d.items():
    result[expr1]=expr2
return result
result = set()
for x in stuff:
    result.add(expr1)
return result
  • 八進制數必須寫成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__()函數已經被刪除。
  • 可以注釋函數的參數與返回值。此特性可方便IDE對源代碼進行更深入的分析。例如給參數增加類型信息:
def send_mail(from_: str, to: str, title: str, body: str) -> bool:
    pass
  • 合併intlong類型。
  • 多個模塊被改名(根據PEP8):
舊的名字 新的名字
_winreg winreg
ConfigParser configparser
copy_reg copyreg
Queue queue
SocketServer socketserver
repr reprlib
  1. StringIO模塊現在被合併到新的io模塊內。new, md5, gopherlib等模塊被刪除。Python 2.6已經支持新的io模塊。
  2. httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib被合併到http包內。
  3. 取消了exec語句,只剩下exec()函數。Python 2.6已經支持exec()函數。
  • 其他變化詳見參考文獻[13]。基本上,可以編寫出使用Python 3.0語法並運行於Python 2.6, Python 2.7的程序。

實現[編輯]

Python是一門跨平台的腳本語言,Python規定了一個Python語法規則,根據該規則可編寫Python直譯器

  • CPython[14],官方的直譯器。需要區別於其他直譯器的時候才以CPython稱呼。這是最常用的Python版本。
  • Jython(原名JPythonJava語言實現的Python,現已正式發布)。Jython可以直接調用Java的各種函數庫。
  • PyPy(使用Python語言寫的Python)
  • IronPython(面向.NETECMA CLI的Python實現)。IronPython能夠直接調用.net平台的各種函數庫。可以將Python程序編譯成.net程序。
  • ZhPy(周蟒,支持使用繁/簡中文語句編寫程序的Python語言)

開發環境[編輯]

通用IDE / 文本編輯器[編輯]

很多並非集成開發環境軟件的文本編輯器,也對Python有不同程度的支持,並且加上專門為Python設計的編輯器插件也會有很高的可用性。

專門為Python設計的IDE軟件[編輯]

適用於Python的集成開發環境(IDE)軟件,除了標準二進制發布包所附的IDLE之外,還有許多其他選擇。其中有些軟件設計有語法着色、語法檢查、運行調試、自動補全、智能感知等便利功能。由於Python的跨平台出身,這些軟件往往也具備各種操作系統的版本或一定的移植性。

  • Anaconda:適用於windows和Linux等多個平台,採用conda對其包管理,隨軟件打包了許多科學計算的第三方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編寫的著名應用[編輯]

  • Youtube - 視頻社交網站
  • Reddit - 社交分享網站
  • Dropbox - 文件分享服務
  • 豆瓣網 - 圖書、唱片、電影等文化產品的資料數據庫網站
  • Django - 鼓勵快速開發的Web應用框架
  • Pylons - Web應用框架
  • Zope - 應用服務器
  • Plone - 內容管理系統
  • Instagram - 是一款免費提供在線圖片及視頻分享的社交應用軟件,使用Django作為後台
  • TurboGears - 另一個Web應用快速開發框架
  • Twisted - Python的網絡應用程序框架
  • Fabric - 用於管理成百上千台Linux主機的程序庫
  • Python Wikipedia Robot Framework - MediaWiki的機器人程式
  • MoinMoinWiki - Python寫成的Wiki程序
  • Trac - 使用Python編寫的BUG管理系統
  • Mailman - 使用Python編寫的郵件列表軟件
  • Mezzanine - 基於Django編寫的內容管理系統
  • Flask - Python微Web框架
  • Webpy - Python微Web框架
  • Bottle - Python微Web框架
  • EVE - 網絡遊戲EVE大量使用Python進行開發
  • Blender - 使用Python作為建模工具與GUI語言的開源3D繪圖軟體
  • Inkscape - 一個開源的SVG矢量圖形編輯器。
  • 知乎 - 一個問答網站
  • 果殼 - 一個泛科技主題網站
  • Odoo-仍在持續發展壯大且最受歡迎的ERP軟件

社群[編輯]

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

影響[編輯]

  • ECMAScript從Python參考了iterators,generators,以及list comprehensions。
  • OCaml有個optional syntax,稱為twt(The Whitespace Thing),取材自Python與Haskell

參考文獻[編輯]

  1. ^ Python 3.7.2. Python Software Foundation. [2018-12-23]. 
  2. ^ Python 2.7.15 Release. Python Software Foundation. [2018-05-01]. 
  3. ^ Python Releases for Windows. Python Software Foundation. [2018-12-11]. 
  4. ^ Python Releases for Windows. Python Software Foundation. [2018-12-11]. 
  5. ^ Guido van Rossum. Foreword for "Programming Python" (1st ed.). 1996-05-01 (英語). 
  6. ^ Python Language Guide (v1.0). Google Documents List Data API v1.0. Google. [2012-11-30]. (原始內容存檔於2010-08-11). 
  7. ^ Heavy usage of Python at Google
  8. ^ call by value (where the value is always an object reference, not the value of the object)或者稱作call by object reference
  9. ^ Przemyslaw Piotrowski, Build a Rapid Web Development Environment for Python Server Pages and Oracle, Oracle Technology Network, July 2006. Accessed October 21, 2008.
  10. ^ Python Software Foundation. Python 3.0b3 Release. 2008-08-20 [2008-08-30] (英語). 
  11. ^ Python Software Foundation. Conversion tool for Python 2.x code: 2to3. [2008-08-30]. (原始內容存檔於2012-07-29) (英語). 
  12. ^ Python Software Foundation. Should I use Python 2 or Python 3 for my development activity?. 2010-09-14 (英語). 
  13. ^ 13.0 13.1 Guido van Rossum. What’s New in Python 3.0. Python Software Foundation. 2009-02-14 [2011-02-22] (英語). 
  14. ^ http://www.Python.org CPython

延伸閱讀[編輯]

外部連結[編輯]

參見[編輯]