python

python

#Python
維基百科,自由的百科全書
跳至導覽跳至搜尋
Disambig gray.svg 關於與「Python」名稱相近或相同的條目,請見「Python (消歧義)」。
Python
Python logo and wordmark.svg
編程範型 多泛型、物件導向、指令式編程、函式語言程式設計、程式編程、面向切面編程
設計者 吉多·范羅蘇姆
實作者 Python軟體基金會
釋出時間 1991年,​28年前
穩定版本
3.7.3 /
2019年3月25日[1]
2.7.16 /
2019年3月4日[2]
預覽版本
3.8.0a2 /
2019年2月25日[3]
3.7.3rc1 /
2019年3月12日[4]
型態系統 “duck”、動態型別、強型別
作業系統 跨平台
特許條款 Python軟體基金會特許條款
副檔名 .py、.pyw、.pyc、.pyo、.pyd、.pyz
網站 www.python.org
主要實作產品
CPython、PyPy、IronPython、Jython
衍生副語言
Cython、RPython、Stackless Python
啟發語言
ABC、ALGOL 68、C、C++、Dylan、Haskell、Icon、Java、Lisp、Modula-3、Perl
影響語言
Boo、Cobra、D、F#、Falcon、Go、Groovy、JavaScript、Ruby
維基教科書中有關zh:Python的文字
Python(英國發音:/ˈpaɪθən/ 美國發音:/ˈpaɪθɑːn/),是一種廣泛使用的直譯式,進階編程,通用型程式語言,由吉多·范羅蘇姆創造,第一版釋出於1991年。可以視之為一種改良(加入一些其他程式語言的優點,如物件導向)的LISP。Python的設計哲學強調程式碼的可讀性和簡潔的語法(尤其是使用空格縮排劃分程式碼塊,而非使用大括號或者關鍵詞)。相比於C++或Java,Python讓開發者能夠用更少的代碼表達想法。不管是小型還是大型程式,該語言都試圖讓程式的結構清晰明了。

與Scheme、Ruby、Perl、Tcl等動態型別程式語言一樣,Python擁有動態型別系統和垃圾回收功能,能夠自動管理記憶體使用,並且支援多種編程範式,包括物件導向、命令式、函數式和程序式編程。其本身擁有一個巨大而廣泛的標準庫。

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

目錄
1 歷史
2 特性與設計哲學
3 應用範圍
3.1 網絡應用程式
3.2 GUI開發
3.3 作業系統
3.4 科學計算
4 Hello World
4.1 單步執行
5 語法
5.1 縮排
5.2 識別元
5.3 陳述式和控制流
5.4 運算式
5.5 函數
5.6 物件導向開發方法
5.7 數據類型與動態型別
5.8 數學運算
6 標準庫
7 著名第三方庫
7.1 Web框架
7.2 科學計算
7.3 GUI
7.4 其它
8 Python 3.0
8.1 主要變化
9 實現
10 開發環境
10.1 通用IDE / 文字編輯器
10.2 專門為Python設計的IDE軟體
11 使用Python編寫的著名應用
12 社群
13 影響
14 參考文獻
15 延伸閱讀
16 外部連結
17 參見
歷史

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)提供了與Haskell和Standard ML中類似的函數式程式設計工具。

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

Python本身被設計為可擴充的。並非所有的特性和功能都整合到語言核心。Python提供了豐富的API和工具,以便程式設計師能夠輕鬆地使用C、C++、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模組,Apache可以運行用Python編寫的Web程式。使用Python語言編寫的Gunicorn作為Web伺服器,也能夠執行Python語言編寫的Web程式。Python定義了WSGI標準應用介面來協調Http伺服器與基於Python的Web程式之間的溝通。一些Web框架,如Django、Pyramid、TurboGears、Tornado、web2py、Zope、Flask等,可以讓程式設計師輕鬆地開發和管理複雜的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。

科學計算
NumPy、SciPy、Matplotlib可以讓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是動態語言,它不像其他的靜態語言如C、Pascal那樣需要書寫聲明陳述式。

縮排
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語言那樣按照位置與形參符合;也可以按照命名參數形式呼叫,即 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變數,但是我們還可以使用任何其它合法的參數名,比如this和mine等,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()外,大多數數學函數處於math和cmath模組內。前者用於實數運算,而後者用於複數運算。使用時需要先匯入它們,比如:

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 < c與a < 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
基於TensorFlow,Theano與CNTK的高階神經網絡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()函數已經被刪除。
Python 3.5支援型態提示(Type Hints),可以注釋函數的參數與返回值。此特性可方便IDE對原始碼進行更深入的分析。例如給參數增加類型資訊:
def send_mail(from_: str, to: str, title: str, body: str) -> bool:
pass
合併int與long類型。
多個模組被改名(根據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()函數。
其他變化詳見參考文獻[13]。基本上,可以編寫出使用Python 3.0語法並執行於Python 2.6, Python 2.7的程式。
實現
Python是一門跨平台的手稿語言,Python規定了一個Python語法規則,根據該規則可編寫Python直譯器。

CPython[14],官方的直譯器。需要區別於其他直譯器的時候才以CPython稱呼。這是最常用的Python版本。
Jython(原名JPython;Java語言實現的Python,現已正式釋出)。Jython可以直接呼叫Java的各種函數庫。
PyPy(使用Python語言寫的Python)
IronPython(面向.NET和ECMA CLI的Python實現)。IronPython能夠直接呼叫.net平台的各種函數庫。可以將Python程式編譯成.net程式。
ZhPy(周蟒,支援使用繁/簡中文陳述式編寫程式的Python語言)
開發環境
通用IDE / 文字編輯器
很多並非整合式開發環境軟體的文字編輯器,也對Python有不同程度的支援,並且加上專門為Python設計的編輯器外掛程式也會有很高的可用性。

Eclipse + pydev外掛程式,目前對Python 3.X只支援到3.0
emacs +外掛程式
NetBeans +外掛程式
SlickEdit
TextMate
Python Tools for Visual Studio
Visual Studio Code +外掛程式
Vim +外掛程式
Sublime Text +外掛程式
EditPlus
UltraEdit
PSPad
Editra,由Python開發的程式編輯器。
Notepad++

你可能感兴趣的:(python)