Python

Python英國發音:/ˈpaɪθən/ 美國發音:/ˈpaɪθɑːn/),是一種面向對象直譯式電腦編程語言,具備近二十年的發展歷史,成熟且穩定。它包含了一組完善並且容易理解的標準庫,可以輕鬆完成不少常見的任務。它的語法簡捷和清晰,儘可能使用無異義的英語單詞,與其它大多數程序設計語言使用大括號不同,它使用縮進來定義語句塊。php

SchemeRubyPerlTcl等動態語言同樣,Python具有垃圾回收功能,可以自動管理內存使用。它常常被看成腳本語言用於處理系統管理任務和網絡程序編寫,然而它也很是適合完成各類高級任務。Python虛擬機自己幾乎能夠在全部的做業系統中運行。使用一些諸如py2exePyPyPyInstaller之類的工具能夠將Python源代碼轉換成能夠脫離Python解釋器運行的程序。html

Python的官方解釋器是CPython,該解釋器用C語言編寫,是一個由社羣驅動的自由軟件,目前由Python軟件基金會管理。python

Python支持命令式程序設計面向對象程序設計函數式編程面向側面的程序設計泛型編程多種編程範式。程序員

 

 

歷史[編輯]

Python的創始人爲吉多·範羅蘇姆(Guido van Rossum)。1989年的聖誕節期間,吉多·範羅蘇姆爲了在阿姆斯特丹打發時間,決心開發一個新的腳本解釋程序,做爲ABC語言的一種繼承。之因此選中Python做爲程序的名字,是由於他是一個蒙提·派森(Monty Python)的飛行馬戲團的愛好者。ABC是由吉多參加設計的一種教學語言。就吉多本人看來,ABC這種語言很是優美和強大,是專門爲非專業程序員設計的。可是ABC語言並無成功,究其緣由,吉多認爲是非開放形成的。吉多決心在Python中避免這一錯誤,並取得了很是好的效果,完美結合了C和其餘一些語言。[5]web

就這樣,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版本。shell

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 Engine使用C++編寫性能要求極高的部分,而後用Python或Java/Go調用相應的模塊。[6]《Python技術手冊》的做者馬特利(Alex Martelli)說:「這很難講,不過,2004年,Python已在Google內部使用,Google召募許多Python高手,但在這以前就已決定使用Python。他們的目的是儘可能使用Python,在不得已時改用C++;在操控硬件的場合使用C++,在快速開發時候使用Python。」[7]

設計哲學與定位[編輯]

Python的設計哲學是「優雅」、「明確」、「簡單」。所以其對手Perl語言中「老是有多種方法來作同一件事」的理念在Python開發者中一般是難以忍受的。Python開發者的哲學是「用一種方法,最好是隻有一種方法來作一件事」。在設計Python語言時,若是面臨多種選擇,Python開發者通常會拒絕花俏的語法,而選擇明確沒有或者不多有歧義的語法。因爲這種設計觀念的差別,Python源代碼一般被認爲比Perl具有更好的可讀性,而且可以支撐大規模的軟件開發。這些準則被稱爲「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模塊,Apache能夠運行用Python編寫的Web程序。使用Python語言編寫的Gunicorn做爲Web服務器,也可以運行Python語言編寫的Web程序。Python定義了WSGI標準應用接口來協調Http服務器與基於Python的Web程序之間的溝通。一些Web框架,如DjangoPyramidTurboGearsweb2pyZopeFlask等,可讓程序員輕鬆地開發和管理複雜的Web程序。

Python對於各類網絡協議的支持很完善,所以常常被用於編寫服務器軟件、網絡蠕蟲。第三方庫Twisted支持異步在線編寫程序和多數標準的網絡協議(包含客戶端和服務器),而且提供了多種工具,被普遍用於編寫高性能的服務器軟件。另有gevent這個流行的第三方庫,一樣可以支持高性能高併發的網絡開發。

GUI開發[編輯]

Python自己包含的Tkinter庫可以支持簡單的GUI開發。可是愈來愈多的Python程序員選擇wxPython或者PyQt來開發跨平臺的桌面軟件。使用它們開發的桌面軟件運行速度快,與用戶的桌面環境相契合。經過PyInstaller還能將程序發佈爲獨立的安裝程序包。與C++相比較,使用Python開發桌面軟件一般更快更容易。

操做系統[編輯]

在不少操做系統裏,Python是標準的系統組件。大多數Linux發佈版以及NetBSD、OpenBSD和Mac OS X都集成了Python,能夠在終端機下直接運行Python。有一些Linux發佈版的安裝器使用Python語言編寫,好比Ubuntu的Ubiquity安裝器、Red Hat Linux和Fedora的Anaconda安裝器。Gentoo Linux使用Python來編寫它的Portage包管理系統。Python標準庫包含了多個調用做業系統功能的庫。經過pywin32這個第三方軟件包,Python可以訪問Windows的COM服務及其它Windows API。使用IronPython,Python程序可以直接調用.Net Framework。通常說來,Python編寫的系統管理腳本在可讀性、性能、源代碼重用度、擴展性幾方面都優於普通的shell腳本。

其餘[編輯]

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.六、Python 2.7
print("Hello, world!") 
  • 適用於Python 2.6如下版本以及Python 2.六、Python 2.7
print "Hello, world!" 

將這行程序碼保存爲myhello.py。而後在Linux終端機下輸入python myhello.py,或者在Windows命令編輯字符下輸入myhello.py運行。

單步運行[編輯]

Python也能夠單步直譯運行。運行Python解釋器進入交互式命令行的環境,你能夠在提示符號>>>旁輸入print("Hello, world!"),按Enter鍵輸出結果:

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

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

語法[編輯]

Python的設計目標之一是讓代碼具有高度的可閱讀性。它設計時儘可能使用其它語言常用的標點符號和英文單字,讓代碼看起來整潔美觀。它不像其餘的靜態語言如C、Pascal那樣須要書寫聲明語句,也不像它們的語法那樣常常有特殊狀況。

縮進[編輯]

Python開發者有意讓違反了縮進規則的程序不能經過編譯,以此來強迫程序員養成良好的編程習慣。而且Python語言利用縮進表示語句塊的開始和退出(Off-side規則),而非使用花括號或者某種關鍵字。增長縮進表示語句塊的開始,而減小縮進則表示語句塊的退出。縮進成爲了語法的一部分。例如if語句:

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

根據PEP的規定,必須使用4個空格來表示每級縮進。使用Tab字符和其它數目的空格雖然均可以編譯經過,但不符合編碼規範。支持Tab字符和其它數目的空格僅僅是爲兼容很舊的Python程序和某些有問題的編輯程序。

語句和控制流[編輯]

  • if語句,當條件成立時運行語句塊。常常與elseelif(至關於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使用andornot表示邏輯運算。
  • 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的賦值操做是把(變量)名字綁定到對象上。形實結合也是這種方式。若是形參綁定到一個mutable對象,則經過形參對此對象內容的修改,在函數外也是可見的。若是形參綁定到一個immutable對象,則經過形參是不能修改此對象內容,但能夠把形參從新綁定到其它對象上,這並不影響函數外的對象的值。例如:

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:
    def eat(self, food): if food is not None: self.hungry=False class User: 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內置豐富的數據類型。與Java、C++相比,這些數據類型有效地減小代碼的長度。下面這個列表簡要地描述了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)
setfrozenset 與數學中集合的概念相似。無序的、每一個元素惟一。 {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模塊用於支持高精度的浮點數運算。

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標準庫命名接口清晰、文檔良好,很容易學習和使用。

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++ 編寫的程序能互相調用。藉助於擁有基於標準庫的大量工具、可以使用低級語言如C和能夠做爲其餘庫接口的C++,Python已成爲一種強大的應用於其餘語言與工具之間的「膠水」語言。

著名第三方庫[編輯]

Web框架[編輯]

Django
開源web開發框架,它鼓勵快速開發,並遵循MVC設計,開發週期短。
ActiveGrid
企業級的Web2.0解決方案。
Karrigell
簡單的Web框架,自身包含了Web服務,py腳本引擎和純python的數據庫PyDBLite。
webpy
一個小巧靈活的Web框架,雖然簡單可是功能強大。
CherryPy
基於Python的Web應用程序開發框架。
Pylons
基於Python的一個極其高效和可靠的Web開發框架。
Zope
開源的Web應用服務器。
TurboGears
基於Python的MVC風格的Web應用程序框架。
Twisted
流行的網絡編程庫,大型Web框架。
Quixote
Web開發框架。

科學計算[編輯]

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

GUI[編輯]

PyGtk
基於Python的GUI程序開發GTK+庫。
PyQt
用於Python的QT開發庫。

WxPython

Python下的GUI編程框架,與MFC的架構類似。

其它[編輯]

BeautifulSoup
基於Python的HTML/XML解析器,簡單易用。
PIL
基於Python的圖像處理庫,功能強大,對圖形文件的格式支持普遍。
PyGame
基於Python的多媒體開發和遊戲軟件開發模塊。
Py2exe
將python腳本轉換爲windows上能夠獨立運行的可執行程序。

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, py2exe, 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的跨平臺出身,這些軟件每每也具有各類操做系統的版本或必定的移植性。

  • Eric:基於PyQt的自由軟件,功能強大。支持自動補全、智能感知、自動語法檢查、工程管理、svn/cvs集成、自動單元測試等功能。調試功能與Visual Studio和Eclipse相似。目前同時有兩個版本。Eric4支持Python2.x,Eric5支持Python3.x。使用前須要先安裝相應的PyQt版本。
  • IDLE:Python「標準」IDE。通常隨Python而安裝,支持較少的編輯功能。調試功能也比較弱。
  • KomodoKomodo Edit:後者是前者的免費精簡版。也能夠用於PHP,Ruby,Javascript,Perl,Web和雲開發。
  • PyCharm:由JetBrains打造,該公司的Java IDE軟件IntelliJ擁有海量的用戶;PyCharm具有通常IDE的功能,好比,調試、語法高亮、Project管理、代碼跳轉、智能提示、自動完成、單元測試、版本控制等等,同時另外,PyCharm還提供了一些很好的功能用於Django開發,同時支持Google App Engine,更酷的是,PyCharm支持IronPython。PyCharm是商業軟件,目前已經到3.1版本。
  • PythonWin:包含在pywin32內的編輯器,僅適用於Windows。
  • SPE(Stani's Python Editor):功能較多的免費軟件,依賴wxPython
  • Ulipad:功能較全的免費軟件,依賴wxPython
  • WingIDE:多是功能最全的IDE,但不是免費軟件。
  • PyScripter:功能較全的開源IDE,使用Delphi開發。

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

影響[編輯]

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

參考文獻[編輯]

  1. ^ Python 3.4.1. Python Software Foundation. [18 May 2014].
  2. ^ Python 2.7.8 Release. Python Software Foundation. [1 July 2014].
  3. ^ Python 3.3.5 Release Candidate 1. Python Software Foundation. [24 February 2014].
  4. ^ Python 3.4.0 Release Candidate 2. Python Software Foundation. [24 February 2014].
  5. ^ Guido van Rossum. Foreword for "Programming Python" (1st ed.). 1996/5/1 (英文).
  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/8/20 [2008/8/30] (英文).
  11. ^ Python Software Foundation. Conversion tool for Python 2.x code: 2to3[2008/8/30] (英文).
  12. ^ Python Software Foundation. Should I use Python 2 or Python 3 for my development activity?. 2010/9/14 (英文).
  13. 13.0 13.1 Guido van Rossum. What’s New in Python 3.0. Python Software Foundation. 2009/2/14 [2011/2/22] (英文).
  14. ^ http://www.Python.org CPython
  15. ^ http://editra.org
相關文章
相關標籤/搜索