Python

歷史

Python的創始人為吉多·范羅蘇姆。1989年的聖誕節期間，吉多·范羅蘇姆為了在阿姆斯特丹打發時間，決心開發一個新的指令碼解釋程式，作為ABC語言的一種繼承。之所以選中Python作為程式的名字，是因為他是BBC電視劇——蒙提·派森的飛行馬戲團的愛好者。ABC是由吉多參加設計的一種教學語言。就吉多本人看來，ABC這種語言非常優美和強大，是專門為非專業程式設計師設計的。但是ABC語言並沒有成功，究其原因，吉多認為是非開放造成的。吉多決心在Python中避免這一錯誤，並取得了非常好的效果，完美結合了C和其他一些語言。
就這樣，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調用相應的模組。《Python技術手冊》的作者馬特利（Alex Martelli）說：「這很難講，不過，2004年，Python已在Google內部使用，Google召募許多Python高手，但在這之前就已決定使用Python。他們的目的是儘量使用Python，在不得已時改用C++；在操控硬體的場合使用C++，在快速開發時候使用Python。」
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編寫。

語法

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

函式

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 Lprint(f(1))print(f(2))print(f(3))
結果為：
[1]
[1, 2]
[1, 2, 3]
函式的預設參數值在函式被定義時被一次性計算其初值。
Python的函式實參與形參之間的結合是傳遞物件的參照。這是因為Python的賦值操作是把（變數）名字繫結到物件上。形實結合也是這種方式。如果形參繫結到一個可變的物件，則通過形參對此物件內容的修改，在函式外也是可見的。如果形參繫結到一個不可變的物件，則通過形參是不能修改此物件內容，但可以把形參重新繫結到其它物件上，這並不影響函式外的物件的值。例如：
def foo(a):
    a.append('haha')
    
def bar(b):
    b=101 #实际上是重新绑定了另一个整型对象101a=[]b=100foo(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=Falseclass 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使用與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 3.0

Python的3.0版本，常被稱為Python 3000，或簡稱Py3k。相對於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。
新的Python程式建議使用Python 3.0版本的語法。除非執行環境無法安裝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語法。