Python(電腦程式設計語言)

Python(電腦程式設計語言)

本詞條是多義詞,共2個義項
更多義項 ▼ 收起列表 ▲

Python是一種電腦程式設計語言。是一種面向對象的動態類型語言,最初被設計用於編寫自動化腳本(shell),隨著版本的不斷更新和語言新功能的添加,越來越多被用於獨立的、大型項目的開發。

基本介紹

  • 中文名:蟒蛇
  • 外文名:Python
  • 經典教材:Head First Python
  • 發行時間:1991年
  • 設計者:Guido van Rossum
  • 最新版本:3.8.0a1
  • 榮譽:2017年度程式語言
Python簡介及套用領域,下載Python,發展歷程,風格,與MATLAB的對比,設計定位,執行,基本語法,控制語句,表達式,函式,對象的方法,類型,數學運算,幫助,1. 列出模組中的函式,2.查看完整的python內置函式清單,3. 查看某個函式的文檔幫助信息,CGI,伺服器,程式,環境變數,特點,優點,缺點,套用,工具功能,標準庫,開發環境,解釋器,著名套用,學習網站,

Python簡介及套用領域

Python是一種解釋型腳本語言,可以套用於以下領域:
  • Web 和 Internet開發
  • 科學計算和統計
  • 教育
  • 桌面界面開發
  • 軟體開發
  • 後端開發

下載Python

在您開始之前,在你的計算機將需要Python,但您可能不需要下載它。首先檢查(在命令行視窗輸入python)有沒有安裝Python!如果你看到了一個Python解釋器的回響,那么就能在它的顯示視窗中得到一個版本號。通常較新的版本都可以做到Python的向前兼容。
如果您需要安裝, 您不妨下載最近穩定的版本。 就是那個以沒有被標記作為alpha或Beta發行的最高的版本。目前最穩定的版本是Python3.0以上
如果你使用的作業系統是Windows:當前最穩定的Windows版本下載是"Python 3.7.3 for Windows"
如果你使用的是Mac,MacOS 10.2 (Jaguar), 10.3 (Panther) and 10.4 (Tiger)已經集成安裝了Python,但是你大概需要安裝最近通用的構架(build)。
對於Red Hat,安裝python2和python2-devel包。
對於Debian,安裝python2.5和python2.5-dev包。

發展歷程

自從20世紀90年代初Python語言誕生至今,它已被逐漸廣泛套用於系統管理任務的處理和Web編程。
Python的創始人為荷蘭人吉多·范羅蘇姆(Guido van Rossum)。1989年聖誕節期間,在阿姆斯特丹,Guido為了打發聖誕節的無趣,決心開發一個新的腳本解釋程式,作為ABC 語言的一種繼承。之所以選中Python(大蟒蛇的意思)作為該程式語言的名字,是取自英國20世紀70年代首播的電視喜劇《蒙提.派森乾的飛行馬戲團》(Monty Python's Flying Circus)。
ABC是由Guido參加設計的一種教學語言。就Guido本人看來,ABC 這種語言非常優美和強大,是專門為非專業程式設計師設計的。但是ABC語言並沒有成功,究其原因,Guido 認為是其非開放造成的。Guido 決心在Python 中避免這一錯誤。同時,他還想實現在ABC 中閃現過但未曾實現的東西。
就這樣,Python在Guido手中誕生了。可以說,Python是從ABC發展起來,主要受到了Modula-3(另一種相當優美且強大的語言,為小型團體所設計的)的影響。並且結合了Unix shell和C的習慣。
Python已經成為最受歡迎的程式設計語言之一。自從2004年以後,python的使用率呈線性增長。Python 2於2000年10月16日發布,穩定版本是Python 2.7。Python 3於2008年12月3日發布,不完全兼容Python 2。2011年1月,它被TIOBE程式語言排行榜評為2010年度語言。
由於Python語言的簡潔性、易讀性以及可擴展性,在國外用Python做科學計算的研究機構日益增多,一些知名大學已經採用Python來教授程式設計課程。例如卡耐基梅隆大學的編程基礎、麻省理工學院的計算機科學及編程導論就使用Python語言講授。眾多開源的科學計算軟體包都提供了Python的調用接口,例如著名的計算機視覺庫OpenCV、三維可視化庫VTK、醫學圖像處理庫ITK。而Python專用的科學計算擴展庫就更多了,例如如下3個十分經典的科學計算擴展庫:NumPy、SciPy和matplotlib,它們分別為Python提供了快速數組處理、數值運算以及繪圖功能。因此Python語言及其眾多的擴展庫所構成的開發環境十分適合工程技術、科研人員處理實驗數據、製作圖表,甚至開發科學計算應用程式。2018年3月,該語言作者在郵件列表上宣布Python 2.7將於2020年1月1日終止支持。用戶如果想要在這個日期之後繼續得到與Python 2.7有關的支持,則需要付費給商業供應商。
標識標識

風格

Python在設計上堅持了清晰劃一的風格,這使得Python成為一門易讀、易維護,並且被大量用戶所歡迎的、用途廣泛的語言
設計者開發時總的指導思想是,對於一個特定的問題,只要有一種最好的方法來解決就好了。這在由Tim Peters寫的Python格言(稱為The Zen of Python)裡面表述為:There should be one-- and preferably only one --obvious way to do it. 這正好和Perl語言(另一種功能類似的高級動態語言)的中心思想TMTOWTDI(There's More Than One Way To Do It)完全相反。
Python的作者有意的設計限制性很強的語法,使得不好的編程習慣(例如if語句的下一行不向右縮進)都不能通過編譯。其中很重要的一項就是Python的縮進規則。
一個和其他大多數語言(如C)的區別就是,一個模組的界限,完全是由每行的首字元在這一行的位置來決定的(而C語言是用一對花括弧{}來明確的定出模組的邊界的,與字元的位置毫無關係)。這一點曾經引起過爭議。因為自從C這類的語言誕生後,語言的語法含義與字元的排列方式分離開來,曾經被認為是一種程式語言的進步。不過不可否認的是,通過強制程式設計師們縮進(包括if,for和函式定義等所有需要使用模組的地方),Python確實使得程式更加清晰和美觀。

與MATLAB的對比

說起科學計算,首先會被提到的可能是MATLAB。然而除了MATLAB的一些專業性很強的工具箱還無法被替代之外,MATLAB的大部分常用功能都可以在Python世界中找到相應的擴展庫。和MATLAB相比,用Python做科學計算有如下優點:
● 首先,MATLAB是一款商用軟體,並且價格不菲。而Python完全免費,眾多開源的科學計算庫都提供了Python的調用接口。用戶可以在任何計算機上免費安裝Python及其絕大多數擴展庫。
● 其次,與MATLAB相比,Python是一門更易學、更嚴謹的程式設計語言。它能讓用戶編寫出更易讀、易維護的代碼。
● 最後,MATLAB主要專注於工程和科學計算。然而即使在計算領域,也經常會遇到檔案管理、界面設計網路通信等各種需求。而Python有著豐富的擴展庫,可以輕易完成各種高級任務,開發者可以用Python實現完整應用程式所需的各種功能。

設計定位

Python的設計哲學是“優雅”、“明確”、“簡單”。因此,Perl語言中“總是有多種方法來做同一件事”的理念在Python開發者中通常是難以忍受的。Python開發者的哲學是“用一種方法,最好是只有一種方法來做一件事”。在設計Python語言時,如果面臨多種選擇,Python開發者一般會拒絕花俏的語法,而選擇明確的沒有或者很少有歧義的語法。由於這種設計觀念的差異,Python原始碼通常被認為比Perl具備更好的可讀性,並且能夠支撐大規模的軟體開發。這些準則被稱為Python格言。在Python解釋器內運行import this可以獲得完整的列表。
Python開發人員儘量避開不成熟或者不重要的最佳化。一些針對非重要部位的加快運行速度的補丁通常不會被合併到Python內。所以很多人認為Python很慢。不過,根據二八定律,大多數程式對速度要求不高。在某些對運行速度要求很高的情況,Python設計師傾向於使用JIT技術,或者用使用C/C++語言改寫這部分程式。可用的JIT技術是PyPy
Python是完全面向對象的語言。函式、模組、數字、字元串都是對象。並且完全支持繼承、重載、派生、多繼承,有益於增強原始碼的復用性。Python支持重載運算符和動態類型。相對於Lisp這種傳統的函式式程式語言,Python對函式式設計只提供了有限的支持。有兩個標準庫(functools, itertools)提供了Haskell和Standard ML中久經考驗的函式式程式設計工具。
雖然Python可能被粗略地分類為“腳本語言”(script language),但實際上一些大規模軟體開發計畫例如ZopeMnetBitTorrentGoogle也廣泛地使用它。Python的支持者較喜歡稱它為一種高級動態程式語言,原因是“腳本語言”泛指僅作簡單程式設計任務的語言,如shellscript、VBScript等只能處理簡單任務的程式語言,並不能與Python相提並論。
Python本身被設計為可擴充的。並非所有的特性和功能都集成到語言核心。Python提供了豐富的API和工具,以便程式設計師能夠輕鬆地使用C語言C++、Cython來編寫擴充模組。Python編譯器本身也可以被集成到其它需要腳本語言的程式內。因此,很多人還把Python作為一種“膠水語言”(glue language)使用。使用Python將其他語言編寫的程式進行集成和封裝。在Google內部的很多項目,例如Google Engine使用C++編寫性能要求極高的部分,然後用Python或Java/Go調用相應的模組。《Python技術手冊》的作者馬特利(Alex Martelli)說:“這很難講,不過,2004 年,Python 已在Google 內部使用,Google 召募許多 Python 高手,但在這之前就已決定使用Python,他們的目的是 Python where we can, C++ where we must,在操控硬體的場合使用C++,在快速開發時候使用 Python。”

執行

Python在執行時,首先會將.py檔案中的原始碼編譯成Python的byte code(位元組碼),然後再由Python Virtual Machine(Python虛擬機)來執行這些編譯好的byte code。這種機制的基本思想跟Java,.NET是一致的。然而,Python Virtual Machine與Java或.NET的Virtual Machine不同的是,Python的Virtual Machine是一種更高級的Virtual Machine。這裡的高級並不是通常意義上的高級,不是說Python的Virtual Machine比Java或.NET的功能更強大,而是說和Java 或.NET相比,Python的Virtual Machine距離真實機器的距離更遠。或者可以這么說,Python的Virtual Machine是一種抽象層次更高的Virtual Machine。基於C的Python編譯出的位元組碼檔案,通常是.pyc格式。除此之外,Python還可以以互動模式運行,比如主流作業系統Unix/Linux、Mac、Windows都可以直接在命令模式下直接運行Python互動環境。直接下達操作指令即可實現互動操作。
Python(電腦程式設計語言)

基本語法

Python的設計目標之一是讓代碼具備高度的可閱讀性。它設計時儘量使用其它語言經常使用的標點符號和英文單字,讓代碼看起來整潔美觀。它不像其他的靜態語言如C、Pascal那樣需要重複書寫聲明語句,也不像它們的語法那樣經常有特殊情況和意外。
Python(電腦程式設計語言)
Python開發者有意讓違反了縮進規則的程式不能通過編譯,以此來強制程式設計師養成良好的編程習慣。並且Python語言利用縮進表示語句塊的開始和退出(Off-side規則),而非使用花括弧或者某種關鍵字。增加縮進表示語句塊的開始,而減少縮進則表示語句塊的退出。縮進成為了語法的一部分。例如if語句:python3
if age<21:    print("你不能買酒。")    print("不過你能買口香糖。")print("這句話在if語句塊的外面。")
根據PEP的規定,必須使用4個空格來表示每級縮進(不清楚4個空格的規定如何,在實際編寫中可以自定義空格數,但是要滿足每級縮進間空格數相等)。使用Tab字元和其它數目的空格雖然都可以編譯通過,但不符合編碼規範。支持Tab字元和其它數目的空格僅僅是為兼容很舊的的Python程式和某些有問題的編輯程式。

控制語句

if語句,當條件成立時運行語句塊。經常與else, elif(相當於else if) 配合使用。
for語句,遍歷列表、字元串、字典、集合等疊代器,依次處理疊代器中的每個元素。
while語句,當條件為真時,循環運行語句塊。
try語句,與except,finally配合使用處理在程式運行中出現的異常情況。
class語句,用於定義類型
def語句,用於定義函式和類型的方法。
pass語句,表示此行為空,不運行任何操作。
assert語句,用於程式調試階段時測試運行條件是否滿足。
with語句,Python2.6以後定義的語法,在一個場景中運行語句塊。比如,運行語句塊前加密,然後在語句塊運行退出後解密。
yield語句,在疊代器函式內使用,用於返回一個元素。自從Python 2.5版本以後。這個語句變成一個運算符。
raise語句,製造一個錯誤。
import語句,導入一個模組或包。
from import語句,從包導入模組或從模組導入某個對象。
import as語句,將導入的對象賦值給一個變數。
in語句,判斷一個對象是否在一個字元串/列表/元組裡。

表達式

Python的表達式寫法與C/C++類似。只是在某些寫法有所差別。
主要的算術運算符與C/C++類似。+, -, *, /, //, **, ~, %分別表示加法或者取正、減法或者取負、乘法、除法、整除、乘方、取補、取余。>>, <<表示右移和左移。&, |, ^表示二進制的AND, OR, XOR運算。>, <, ==, !=, <=, >=用於比較兩個表達式的值,分別表示大於、小於、等於、不等於、小於等於、大於等於。在這些運算符裡面,~, |, ^, &, <<, >>必須套用於整數。
Python使用and, or, not表示邏輯運算。
is, is not用於比較兩個變數是否是同一個對象。in, not in用於判斷一個對象是否屬於另外一個對象。
Python支持“列表推導式”(list 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 inrange[a, b], including both end points.

對象的方法

對象的方法是指綁定到對象的函式。調用對象方法的語法是instance.method(arguments)。它等價於調用Class.method(instance, arguments)。當定義對象方法時,必須顯式地定義第一個參數,一般該參數名都使用self,用於訪問對象的內部數據。這裡的self相當於C++, Java裡面的this變數,但是我們還可以使用任何其它合法的參數名,比如this 和 mine 等,self與C++,Java裡面的this不完全一樣,它可以被看作是一個習慣性的用法,我們傳入任何其它的合法名稱都行,比如:
class Fish:    def eat(self,food):        if food is not None:        self.hungry=Falseclass User:    def__init__(myself,name):        myself.name=name#構造Fish的實例:f=Fish()#以下兩種調用形式是等價的:Fish.eat(f,"earthworm")f.eat("earthworm")u=User('username')print(u.name)
Python認識一些以“__”開始並以“__”結束的特殊方法名,它們用於實現運算符重載和實現多種特殊功能。

類型

Python採用動態類型系統。在編譯的時候,Python不會檢查對象是否擁有被調用的方法或者屬性,而是直至運行時,才做出檢查。所以操作對象時可能會拋出異常。不過,雖然Python採用動態類型系統,它同時也是強類型的。Python禁止沒有明確定義的操作,比如數字加字元串。
與其它面向對象語言一樣,Python允許程式設計師定義類型。構造一個對象只需要像函式一樣調用類型即可,比如,對於前面定義的Fish類型,使用Fish()。類型本身也是特殊類型type的對象(type類型本身也是type對象),這種特殊的設計允許對類型進行反射編程。
Python內置豐富的數據類型。與Java、C++相比,這些數據類型有效地減少代碼的長度。下面這個列表簡要地描述了Python內置數據類型(適用於Python 3.x):
類型描述例子備註
一個由字元組成的不可更改的有序串列。
'Wikipedia'
"Wikipedia"
"""Spanning
multiple
lines"""
在Python 3.x里,字元串由Unicode字元組成
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模組用於支持高精度的浮點數運算。
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進行比較。

幫助

1. 列出模組中的函式


用import導出模組後,可使用函式dir(m)列出模組的所有函式,import是導出模組的命令,m是模組名。
例子:
>>>import math    >>>dir(math)['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']

這個例子列出math模組的一些函式,以雙下劃線( _ _ )開頭的名稱用於較複雜的python編程。

2.查看完整的python內置函式清單

查看完整的python內置函式清單,可在提示符後輸入 >>>dir(_ _builtins_ _)。
例子:
>>> dir(__builtins__)['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '_', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']

3. 查看某個函式的文檔幫助信息

可以用函式help(函式)來查看某個函式的文檔幫助信息。
例子:
>>>help(sum)Help on built-in function sum in module builtins:sum(iterable, start=0, /)             Return the sum of a 'start' value (default: 0) plus an iterable of numbers      When the iterable is empty, return the start value.              This function is intended specifically for use with numeric values and may    reject non-numeric types.
可以直接在提示符下輸入help(),然後輸入某個模組或函式名得到詳細的幫助信息。

CGI

CGI 目前由NCSA維護,NCSA定義CGI如下:
CGI(Common Gateway Interface),通用網關接口,它是一段程式,運行在伺服器上如:HTTP伺服器,提供同客戶端HTML頁面的接口。
CGI程式可以是Python腳本、Perl腳本、Shell腳本、C或者C++程式等。

伺服器

在你進行CGI編程前,確保您的Web伺服器支持CGI及已經配置了CGI的處理程式。
所有的HTTP伺服器執行CGI程式都保存在一個預先配置的目錄。這個目錄被稱為CGI目錄,並按照慣例,它被命名為/var/www/cgi-bin目錄。
CGI檔案的擴展名為.cgi,python也可以使用.py擴展名。
默認情況下,Linux伺服器配置運行的cgi-bin目錄中為/var/www。
如果想指定的其他運行CGI腳本的目錄,可以修改httpd.conf配置檔案,如下所示:
<Directory"/var/www/cgi-bin">Allow Override NoneOptions ExecCGIOrder allow,denyAllow from all</Directory><Directory"/var/www/cgi-bin">Options All</Directory>

程式

使用Python創建第一個CGI程式,檔案名稱為hello.py,檔案位於/var/www/cgi-bin目錄中,內容如下,修改檔案的許可權為755:
#!/usr/bin/env pythonprint("Content-type:text/html\r\n\r\n")print("<html>")print("<head>")print("")print("</head>")print("<body>")print("<h2>Hello World! This is my first CGI program</h2>")print("</body>")print("</html>")
以上程式在瀏覽器訪問顯示結果如下:
Hello World! This is my first CGI program
這個的hello.py腳本是一個簡單的Python腳本,腳本第一的輸出內容"Content-type:text/html\r\n\r\n"傳送到瀏覽器並告知瀏覽器顯示的內容類型為"text/html"。

環境變數

所有的CGI程式都接收以下的環境變數,這些變數在CGI程式中發揮了重要的作用:
變數名描述
CONTENT_TYPE
這個環境變數的值指示所傳遞來的信息的MIME類型。目前,環境變數CONTENT_TYPE一般都是:application/x-www-form-urlencoded,他表示數據來自於HTML表單。
CONTENT_LENGTH
如果伺服器與CGI程式信息的傳遞方式是POST,這個環境變數即使從標準輸入STDIN中可以讀到的有效數據的位元組數。這個環境變數在讀取所輸入的數據時必須使用。
HTTP_COOKIE
客戶機內的 COOKIE 內容。
HTTP_USER_AGENT
提供包含了版本數或其他專有數據的客戶瀏覽器信息。
PATH_INFO
這個環境變數的值表示緊接在CGI程式名之後的其他路徑信息。它常常作為CGI程式的參數出現。
QUERY_STRING
如果伺服器與CGI程式信息的傳遞方式是GET,這個環境變數的值即使所傳遞的信息。這個信息經跟在CGI程式名的後面,兩者中間用一個問號'?'分隔。
REMOTE_ADDR
這個環境變數的值是傳送請求的客戶機的IP位址,例如上面的192.168.1.67。這個值總是存在的。而且它是Web客戶機需要提供給Web伺服器的唯一標識,可以在CGI程式中用它來區分不同的Web客戶機。
REMOTE_HOST
這個環境變數的值包含傳送CGI請求的客戶機的主機名。如果不支持你想查詢,則無需定義此環境變數。
REQUEST_METHOD
提供腳本被調用的方法。對於使用 HTTP/1.0 協定的腳本,僅 GET 和 POST 有意義。
SCRIPT_FILENAME
CGI腳本的完整路徑
SCRIPT_NAME
CGI腳本的的名稱
SERVER_NAME
這是你的 WEB 伺服器的主機名、別名或IP位址。
SERVER_SOFTWARE
這個環境變數的值包含了調用CGI程式的HTTP伺服器的名稱和版本號。例如,上面的值為Apache/2.2.14(Unix)
以下是一個簡單的CGI腳本輸出CGI的環境變數:
#!/usr/bin/pythonimport osprint"Content-type:text/html\r\n\r\n"print"Environment"for param in os.environ.keys():    print"<b>%20s</b>:%s<\br>" %(param,os.environ[param])

特點

優點

簡單:Python是一種代表簡單主義思想的語言。閱讀一個良好的Python程式就感覺像是在讀英語一樣。它使你能夠專注於解決問題而不是去搞明白語言本身。
易學:Python極其容易上手,因為Python有極其簡單的說明文檔。
速度快:Python 的底層是用 C 語言寫的,很多標準庫和第三方庫也都是用 C 寫的,運行速度非常快。
免費、開源:Python是FLOSS(自由/開放源碼軟體)之一。使用者可以自由地發布這個軟體的拷貝、閱讀它的原始碼、對它做改動、把它的一部分用於新的自由軟體中。FLOSS是基於一個團體分享知識的概念。
高層語言:用Python語言編寫程式的時候無需考慮諸如如何管理你的程式使用的記憶體一類的底層細節。
可移植性:由於它的開源本質,Python已經被移植在許多平台上(經過改動使它能夠工作在不同平台上)。這些平台包括Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE、PocketPC、Symbian以及Google基於linux開發的android平台。
解釋性:一個用編譯性語言比如C或C++寫的程式可以從源檔案(即C或C++語言)轉換到一個你的計算機使用的語言(二進制代碼,即0和1)。這個過程通過編譯器和不同的標記、選項完成。
運行程式的時候,連線/轉載器軟體把你的程式從硬碟複製到記憶體中並且運行。而Python語言寫的程式不需要編譯成二進制代碼。你可以直接從原始碼運行 程式。
在計算機內部,Python解釋器把原始碼轉換成稱為位元組碼的中間形式,然後再把它翻譯成計算機使用的機器語言並運行。這使得使用Python更加簡單。也使得Python程式更加易於移植。
面向對象:Python既支持面向過程的編程也支持面向對象的編程。在“面向過程”的語言中,程式是由過程或僅僅是可重用代碼的函式構建起來的。在“面向對象”的語言中,程式是由數據和功能組合而成的對象構建起來的。
可擴展性:如果需要一段關鍵代碼運行得更快或者希望某些算法不公開,可以部分程式用C或C++編寫,然後在Python程式中使用它們。
可嵌入性:可以把Python嵌入C/C++程式,從而向程式用戶提供腳本功能。
豐富的庫:Python標準庫確實很龐大。它可以幫助處理各種工作,包括正則表達式、文檔生成、單元測試執行緒、資料庫、網頁瀏覽器、CGI、FTP、電子郵件、XML、XML-RPC、HTML、WAV檔案、密碼系統、GUI(圖形用戶界面)、Tk和其他與系統有關的操作。這被稱作Python的“功能齊全”理念。除了標準庫以外,還有許多其他高質量的庫,如wxPython、Twisted和Python圖像庫等等。
規範的代碼:Python採用強制縮進的方式使得代碼具有較好可讀性。而Python語言寫的程式不需要編譯成二進制代碼。

缺點

單行語句和命令行輸出問題:很多時候不能將程式連寫成一行,如import sys;for i in sys.path:print i。而perl和awk就無此限制,可以較為方便的在shell下完成簡單程式,不需要如Python一樣,必須將程式寫入一個.py檔案。
獨特的語法
這也許不應該被稱為局限,但是它用縮進來區分語句關係的方式還是給很多初學者帶來了困惑。即便是很有經驗的Python程式設計師,也可能陷入陷阱當中。
運行速度慢:這裡是指與C和C++相比。

套用

系統編程:提供APIApplication Programming Interface應用程式編程接口),能方便進行系統維護和管理,Linux下標誌性語言之一,是很多系統管理員理想的編程工具。
圖形處理:有PIL、Tkinter等圖形庫支持,能方便進行圖形處理。
數學處理:NumPy擴展提供大量與許多標準數學庫的接口。
文本處理:python提供的re模組能支持正則表達式,還提供SGMLXML分析模組,許多程式設計師利用python進行XML程式的開發。
資料庫編程:程式設計師可通過遵循Python DB-API(資料庫應用程式編程接口)規範的模組與Microsoft SQL Server,Oracle,Sybase,DB2,MySQL、SQLite等資料庫通信。python自帶有一個Gadfly模組,提供了一個完整的SQL環境。
網路編程:提供豐富的模組支持sockets編程,能方便快速地開發分散式應用程式。很多大規模軟體開發計畫例如Zope,Mnet 及BitTorrent. Google都在廣泛地使用它。
Web編程:套用的開發語言,支持最新的XML技術。
多媒體套用:Python的PyOpenGL模組封裝了“OpenGL應用程式編程接口”,能進行二維和三維圖像處理。PyGame模組可用於編寫遊戲軟體。
pymo引擎:PYMO全稱為python memories off,是一款運行於Symbian S60V3,Symbian3,S60V5, Symbian3, Android系統上的AVG遊戲引擎。因其基於python2.0平台開發,並且適用於創建秋之回憶memories off)風格的AVG遊戲,故命名為PYMO。
黑客編程:python有一個hack的庫,內置了你熟悉的或不熟悉的函式,但是缺少成就感。
用Python寫簡單爬蟲
首先,要通過urllib2這個Module獲得對應的HTML源碼。(PS:在python3.3之後urllib2已經不能再用,代之以urllib)
import urllib2  #調用urllib2  url='http://www.baidu.com/s?wd=cloga' #把等號右邊的網址賦值給urlhtml=urllib2.urlopen(url).read()   #html隨意取名 等號後面的動作是打開原始碼頁面,並閱讀print html #列印
通過上面這三句就可以將URL的源碼存在content變數中,其類型為字元型。
接下來是要從這堆HTML源碼中提取我們需要的內容。用Chrome查看一下對應的內容的代碼(也可以用Firefox的Firebug)。
可以看到url的信息存儲在span標籤中,要獲取其中的信息可以用正則式。

工具功能

Tkinter
Python默認的圖形界面接口。Tkinter是一個和Tk接口的Python模組,Tkinter庫提供了對Tk API的接口,它屬於Tcl/Tk的GUI工具組。
用於python GUI程式開發的GTK+庫。GTK就是用來實現GIMP和Gnome的庫。
用於python的Qt開發庫。QT就是實現了KDE環境的那個庫,由一系列的模組組成,有qt, qtcanvas, qtgl, qtnetwork, qtsql, qttable, qtui and qtxml,包含有300個類和超過5750個的函式和方法。PyQt還支持一個叫qtext的模組,它包含一個QScintilla庫。該庫是Scintillar編輯器類的Qt接口。
GUI編程框架,熟悉MFC的人會非常喜歡,簡直是同一架構(對於初學者或者對設計要求不高的用戶來說,使用Boa Constructor可以方便迅速的進行wxPython的開發)
python提供強大的圖形處理的能力,並提供廣泛的圖形檔案格式支持,該庫能進行圖形格式的轉換、列印和顯示。還能進行一些圖形效果的處理,如圖形的放大、縮小和旋轉等。是Python用戶進行圖象處理的強有力工具。
Psyco
一個Python代碼加速度器,可使Python代碼的執行速度提高到與編譯語言一樣的水平。
xmpppy
Jabber伺服器採用開發的XMPP協定,Google Talk也是採用XMPP協定的IM系統。在Python中有一個xmpppy模組支持該協定。也就是說,我們可以通過該模組與Jabber伺服器通信,是不是很Cool。
PyMedia
用於多媒體操作的python模組。它提供了豐富而簡單的接口用於多媒體處理(wav, mp3, ogg, avi, divx, dvd, cdda etc)。可在Windows和Linux平台下使用。
Pmw
Python megawidgets,Python超級GUI組件集,一個在python中利用Tkinter模組構建的高級GUI組件,每個Pmw都合併了一個或多個Tkinter組件,以實現更有用和更複雜的功能。
PyXML
用Python解析和處理XML文檔的工具包,包中的4DOM是完全相容於W3C DOM規範的。它包含以下內容:
xmlproc: 一個符合規範的XML解析器。Expat: 一個快速的,非驗證的XML解析器。還有其他和他同級別的還有 PyHtml PySGML。
用於多媒體開發和遊戲軟體開發的模組。
PyOpenGL
模組封裝了“OpenGL應用程式編程接口”,通過該模組python程式設計師可在程式中集成2D和3D的圖形。
NumPy、NumArray、SAGE
NumArray是Python的一個擴展庫,主要用於處理任意維數的固定類型數組,簡單說就是一個矩陣庫。它的底層代碼使用C來編寫,所以速度的優勢很明顯。SAGE是基於NumPy和其他幾個工具所整合成的數學軟體包,目標是取代Magma, Maple, Mathematica和Matlab 這類工具。
用於連線MySQL資料庫。還有用於zope的ZMySQLDA模組,通過它就可在zope中連線mysql資料庫。
Sqlite3
用於連線sqlite資料庫。
Python-ldap
提供一組面向對象的API,可方便地在python中訪問ldap目錄服務,它基於OpenLDAP2.x。
smtplib
傳送電子郵件。
ftplib
定義了FTP類和一些方法,用以進行客戶端的ftp編程。如果想了解ftp協定的詳細內容,請參考RFC959。
PyOpenCL
OpenCL的Python接口,通過該模組可以使用GPU實現並行計算。

標準庫

Python擁有一個強大的標準庫。Python語言的核心只包含數字、字元串、列表、字典、檔案等常見類型和函式,而由Python標準庫提供了系統管理、網路通信、文本處理、資料庫接口、圖形系統、XML處理等額外的功能。Python標準庫命名接口清晰、文檔良好,很容易學習和使用。
Python社區提供了大量的第三方模組,使用方式與標準庫類似。它們的功能無所不包,覆蓋科學計算、Web開發、資料庫接口、圖形系統多個領域,並且大多成熟而穩定。第三方模組可以使用Python或者C語言編寫。SWIG,SIP常用於將C語言編寫的程式庫轉化為Python模組。Boost C++ Libraries包含了一組庫,Boost.Python,使得以 Python 或 C++ 編寫的程式能互相調用。藉助於擁有基於標準庫的大量工具、能夠使用低級語言如C和可以作為其他庫接口的C++,Python已成為一種強大的套用於其他語言與工具之間的膠水語言
Python標準庫的主要功能有:
文本處理,包含文本格式化、正則表達式匹配、文本差異計算與合併、Unicode支持,二進制數據處理等功能
檔案處理,包含檔案操作、創建臨時檔案、檔案壓縮與歸檔、操作配置檔案等功能
作業系統功能,包含執行緒與進程支持、IO復用、日期與時間處理、調用系統函式、寫日記(logging)等功能
網路通信,包含網路套接字,SSL加密通信、異步網路通信等功能
網路協定,支持HTTP,FTP,SMTP,POP,IMAP,NNTP,XMLRPC等多種網路協定,並提供了編寫網路伺服器的框架
W3C格式支持,包含HTML,SGML,XML的處理。
其它功能,包括國際化支持、數學運算、HASH、Tkinter等

開發環境

●IDLE:Python內置IDE (隨python安裝包提供)
●PyCharm:詳見中文百科PyCharm,由著名的JetBrains公司開發,帶有一整套可以幫助用戶在使用Python語言開發時提高其效率的工 具,比如調試、語法高亮、Project管理、代碼跳轉、智慧型提示、自動完成、單元測試、版本控制。此外,該IDE提供了一些高級功能,以用於支持Django框架下的專業Web開發。
●Komodo和Komodo Edit:後者是前者的免費精簡版
●Spyder:安裝Anaconda自帶的高級IDE
●PythonWin:ActivePython或pywin32均提供該IDE,僅適用於Windows
●SPE(Stani's Python Editor):功能較多的自由軟體,基於wxPython
●Ulipad:功能較全的自由軟體,基於wxPython;作者是中國Python高手limodou
●WingIDE:可能是功能最全的IDE,但不是自由軟體(教育用戶和開源用戶可以申請免費key)
●Eric:基於PyQt的自由軟體,功能強大。全名是:The Eric Python IDE
●DrPython
PyScripter:使用Delphi開發的輕量級的開源Python IDE, 支持Python2.6和3.0。
PyPE:一個開源的跨平台的PythonIDE。
bpython: 類Unix作業系統下使用curses庫開發的輕量級的Python解釋器。語法提示功能。
●eclipse + pydev外掛程式:方便調試程式
●emacs:自帶python支持,自動補全、refactor等功能需要外掛程式支持
Vim: 最新7.3版編譯時可以加入python支持,提供python代碼自動提示支持
●Visual Studio 2003 + VisualPython:僅適用Windows,已停止維護,功能較差
●Visual Studio 2010 + Python Tools for Visual Studio
●Netbeans IDE
●ipython
另外,諸如Notepad++EditPlusUltraEdit等通用的程式設計師文本編輯器軟體也能對Python代碼編輯提供一定的支持,比如代碼自動著色、注釋快捷鍵等,但是否夠得上集成開發環境的水平,尚有待評估。

解釋器

Python是一門跨平台的腳本語言,Python規定了一個Python語法規則,實現了Python語法的解釋程式就成為了Python的解釋器
CPython(ClassicPython,也就是原始的Python實現,需要區別於其他實現的時候才以CPython稱呼;或解作C語言實現的Python)。這是最常用的Python版本。
Jython(原名JPythonJava語言實現的Python,現已正式發布)。Jython可以直接調用Java的各種函式館。
PyPy(使用Python語言寫的Python)
IronPython(面向.NET和ECMA CLI的Python實現)。IronPython能夠直接調用.net平台的各種函式館。可以將Python程式編譯成.net程式。
ZhPy(周蟒)(支持使用繁/簡中文語句編寫程式的Python語言)

著名套用

Digwebs-Web套用框架
Zope- 套用伺服器
Plone- 內容管理系統
Django- 鼓勵快速開發的Web套用框架
Uliweb- 國人開發的輕量級Web框架
TurboGears- 另一個Web套用快速開發框架
Twisted--Python的網路應用程式框架
Python Wikipedia Robot Framework- MediaWiki的機器人程式
MoinMoinWiki- Python寫成的Wiki程式
flask- Python 微Web框架
tornado- 非阻塞式伺服器
Webpy- Python 微Web框架
Bottle- Python 微Web框架
EVE- 網路遊戲EVE大量使用Python進行開發
Reddit - 社交分享網站
Dropbox - 檔案分享服務
TurboGears - 另一個Web套用快速開發框架
Fabric - 用於管理成百上千台Linux主機的程式庫
Trac - 使用Python編寫的BUG管理系統
Mailman - 使用Python編寫的郵件列表軟體
Mezzanine - 基於Django編寫的內容管理系統
Blender - 以C與Python開發的開源3D繪圖軟體

學習網站

Python官方文檔
python 網路教育-百度傳課

相關詞條

熱門詞條

聯絡我們