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

Python

維基百科,自由的百科全書
前往: 導覽搜尋
Python
Python logo and wordmark.svg
編程範型 多泛型物件導向指令式編程函數語言程式設計程式編程面向切面編程
設計者 吉多·范羅蘇姆
實作者 Python軟體基金會
面市時間 1991年,​26年前​(1991
最近釋出日期 3.6.2 /
2017年7月17日 (2017-07-17)[1]
2.7.13 /
2016年12月17日 (2016-12-17)[2]
最近測試版釋出日 3.6.2rc2 /
2017年7月7日 (2017-07-07)[3]
2.7.13 rc1 /
2016年12月4日 (2016-12-04)[4]
型態系統 "duck"動態型別強型別
作業系統 跨平台
授權條款 Python軟體基金會授權條款英語Python Software Foundation License
常用副檔名 .py、.pyw、.pyc、.pyo、.pyd、.pyz
網站 www.python.org

Python英國發音:/ˈpaɪθən/ 美國發音:/ˈpaɪθɑːn/),是一種物件導向直譯式電腦程式語言。它包含了一組功能完備的標準庫,能夠輕鬆完成很多常見的任務。它的語法簡單,與其它大多數程式設計語言使用大括弧不一樣,它使用縮排來定義語句塊。

SchemeRubyPerlTcl動態語言一樣,Python具備垃圾回收功能,能夠自動管理記憶體使用。它經常被當作腳本語言用於處理系統管理任務和網路程式編寫,然而它也非常適合完成各種高階任務。Python虛擬機本身幾乎可以在所有的作業系統中運行。使用一些諸如py2exePyPyPyInstaller之類的工具可以將Python原始碼轉換成可以脫離Python解釋器執行的程式。

Python的官方直譯器是CPython,該直譯器用C語言編寫,是一個由社群驅動的自由軟體,目前由Python軟體基金會管理。

Python支援命令式程式設計物件導向程式設計函數式編程面向側面的程式設計泛型編程多種編程範式。

歷史[編輯]

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

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

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

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

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

Python本身被設計為可擴充的。並非所有的特性和功能都整合到語言核心。Python提供了豐富的API和工具,以便程式設計師能夠輕鬆地使用CC++Cython來編寫擴充模組。Python編譯器本身也可以被整合到其它需要腳本語言的程式內。因此,有很多人把Python作為一種「膠水語言」(glue language)使用。使用Python將其他語言編寫的程式進行整合和封裝。在Google內部的很多專案,例如Google App Engine使用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

應用範圍[編輯]

Web程式[編輯]

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以下版本以及Python 2.6、Python 2.7
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以下版本以及Python 2.6、Python 2.7
>>> print "Hello, world!"
Hello, world!

注意,低於3.0版本的Python,"Hello, world!"周圍不需要括號。Python 3.x與Python 2.x的print語法是不一樣的。

語法[編輯]

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

縮排[編輯]

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

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

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

語句和控制流[編輯]

  • 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語言那樣按照位置與形參符合;也可以按照keyword argument形式呼叫,即param_name=value形式的實參。在一個函式呼叫的實參表中,keyword argument必須出現在位置參數之後。

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

Python的函式作為first-class citizen,具有和普通變數平等的地位。函式一旦定義,即可視作為普通物件,其形參會保留上次呼叫時的值,但在函式新的一次呼叫時會被實參值覆蓋。因此函式的預設參數值在連續多次呼叫該函式時,如果不被實參值覆蓋,就會一直保留。例如:

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或map 一個可改變的由鍵值對組成的無序列。 {'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開發框架。

科學計算[編輯]

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)。
  • 字典推導式(Dictionary comprehensions){expr1: expr2 for k, v in d},這個語法等價於:
result={}
for k, v in d.items():
    result[expr1]=expr2
return result
  • 集合推導式(Set Comprehensions){expr1 for x in stuff}。這個語法等價於:
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 sendMail(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是商業軟體,目前已經到2016.3版本。PyCharm也具有社群版。
  • PyScripter:功能較全的開源IDE,使用Delphi開發。
  • PythonWin:包含在pywin32內的編輯器,僅適用於Windows。
  • SPE(Stani's Python Editor):功能較多的免費軟體,依賴wxPython
  • Spyder:開源的跨平台科學計算IDE。
  • Ulipad:功能較全的免費軟體,依賴wxPython
  • WingIDE:商業軟體,有免費的Wing IDE 101,功能有限,適用於入門者教學。

使用Python編寫的著名應用[編輯]

社群[編輯]

  • 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.6.2. Python Software Foundation. [2017-07-17]. 
  2. ^ Python 2.7.13 Release. Python Software Foundation. [2016-12-17]. 
  3. ^ What’s New In Python 3.6. Python Software Foundation. [2017-07-07]. 
  4. ^ Python 2.7.13 rc1 Release. Python Software Foundation. [2016-12-04]. 
  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. (原始內容存檔於10 August 2010). 
  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] (英語). 
  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

外部連結[編輯]