1. 程式人生 > >入門科普:什麼時候要用Python?用哪個版本?什麼時候不能用?

入門科普:什麼時候要用Python?用哪個版本?什麼時候不能用?

導讀:Python是一種高階、開源、通用的程式語言,廣泛用於指令碼編寫並跨領域使用。Python源自於Guido Van Rossum的創意,20世紀80年代後期被認為是ABC語言的繼承者,兩者都是由荷蘭國家數學和電腦科學研究所(Centrum Wiskunde & Informatica,CWI)開發。Python最初設計為指令碼和解釋語言,而且到目前為止,它仍然是最流行的指令碼語言之一。

Python使用面向物件程式設計(object-oriented programming,OOP)和構造,你可以像任何其它面向物件的語言一樣使用它,譬如Java。

由Guido為該語言起的Python名字不是指蛇,而是意指電視喜劇片“蒙提·派森的飛行馬戲團” (Monty Python's Flying Circus),因為他是一個超級粉絲。

01 瞭解Python

Python是一種通用程式語言,支援多種程式設計正規化,包括以下流行的程式設計正規化:

面向物件程式設計

函數語言程式設計

過程程式設計

面向方面的程式設計

Python中具備很多OOP概念,包括類、物件、資料和方法。諸如抽象、封裝、繼承和多型的原則也可以使用Python來實現和展現。Python中有幾個高階功能,包括迭代器、生成器、列表解析器、lambda表示式和幾個模組(如itertools和functools),它們提供了遵循函式程式設計正規化編寫程式碼的能力。

Python的設計思想:簡單而美麗的程式程式碼應該遵循更加優雅和易於使用的風格,而不是過早優化和編寫難以解釋的程式碼。Python標準庫功能強大,具有從低階硬體介面到處理檔案和處理文字資料的各種功能和特性。易於擴充套件和整合使得在開發Python時,可以輕鬆地實現與現有應用程式整合——甚至可以建立應用程式介面(application programming interfaces,API),以提供與其它應用程式和工具的介面。

Python過去數年在各領域的迅速發展應用,使得Python廣受歡迎。如果在編寫程式碼時不遵循簡單、優雅和極簡主義的Python正確原則,則程式碼被稱為不是“pythonic”。編寫好的Python程式碼有一種眾人熟知的風格和約定,許多文章和書籍教導瞭如何編寫pythonic式的程式碼。

在Python社群中,活躍使用者和開發人員稱其為Pythonistas、Pythoneers以及其它更多有趣的名稱。因為Python及其整個生態系統一直是在積極的改進和發展,繁榮的Python社群使得這門語言更加鼓舞人心。

02 應用:何時使用Python

Python作為通用的多用途程式語言,能為不同領域構建應用程式和系統,並解決各種現實世界中的問題。Python自帶有一個標準庫,它包括大量對於解決各種問題有用的庫和模組。除了標準庫,網際網路上還有數以千計的第三方庫隨時可用,它們用於鼓勵開源和積極開發。官方儲存庫是Python的程式包索引(Python Package Index,PyPI),用於託管第三方庫以及Python增強開發的工具。你可以訪問https://pypi.python.org並檢視各種程式包。目前,可以安裝和使用的程式包超過80,000個。

Python可以用來解決大量問題,下面列出一些最受歡迎的應用領域:

指令碼(Scripting):Python被稱為指令碼語言。它可以用於執行許多工,例如:與網路、硬體的介面,處理檔案和資料庫,執行作業系統操作,以及接收和傳送電子郵件。Python也廣泛用於伺服器端指令碼,甚至用於開發服務網頁的整個Web伺服器。許多Python指令碼是以ad-hoc方式用於自動化操作,譬如:網路套接字通訊,處理電子郵件,解析和提取網頁,通過FTP進行檔案共享和傳輸,通過不同協議進行通訊,以及其它多種操作。

Web開發(Web development):有很多廣泛用於Web開發的強大且穩定的Python框架,包括Django、Flask、Web2Py和Pyramid。你可以使用它們來開發完整的企業Web應用程式,Python支援各種架構風格,如RESTful API和MVC架構。Python還提供資料庫互動的ORM支援,並在其上使用OOP。Python甚至還有像Kivy這樣的框架,可以支援跨平臺開發,用於在iOS、Android、Windows和OS X等多個平臺上開發應用程式。Python也用於在IronPython中開發具有Silverlight框架支援的富網際網路應用程式(rich internet applications,RIA),IronPython是一個受歡迎的Microsoft .NET框架和pyjs完美整合的Python版本,RIA開發架構支援Python到JavaScript的編譯器和AJAX框架。

圖形使用者介面(Graphical user interfaces,GUIs):使用Python可以輕鬆構建大量具有GUI的桌面應用程式。Tkinter、PyQt、PyGTK和wxPython之類的庫和API允許開發人員通過簡單/複雜的介面開發基於GUI的應用程式。多樣化的框架使得開發人員能夠為不同的作業系統和平臺開發基於GUI的應用程式。

系統程式設計(Systems programming):作為一門高階語言,Python具有與低階OS服務和協議的大量介面,並且這些服務之上的抽象使得開發人員能夠編寫強大而可移植的系統監視和管理工具。我們可以使用Python執行作業系統操作,包括建立、處理、搜尋、刪除和管理檔案和目錄。Python標準庫(Python standard library,PSL)提供作業系統和POSIX繫結,可用於處理檔案、多執行緒、多處理、環境變數、控制套接字、管道和程序。這也增強了Python指令碼編寫能力,以最少的工作和程式碼行來執行系統級的管理任務。

資料庫程式設計(Database programming):Python用於連線和訪問來自不同型別資料庫的資料,無論是SQL還是NoSQL。MySQL、MSSQL、MongoDB、Oracle、PostgreSQL和SQLite之類的資料庫都有API和聯結器。事實上,SQLite是一個輕量級的關係資料庫,現在它是作為Python標準釋出版的一部分。SQLAlchemy和SQLObject這類的熱門庫提供了訪問各種關係資料庫的介面,並且還具備ORM元件來幫助在關係表之上實現OOP風格的類和物件。

科學計算(Scientific computing):Python在數值和科學計算等領域展示了多用途的稟賦。你可以使用Python執行簡單和複雜的數學運算,包括代數和微積分。諸如SciPy和NumPy這樣的庫能夠幫助研究人員、科學家和開發人員利用高度優化的函式和介面進行數值和科學程式設計。這些庫也是在機器學習等各個領域開發複雜演算法的基礎。

機器學習(Machine learning):Python被視為當今最流行的機器學習語言之一。Python有一套廣泛的庫和框架,如scikit-learn、h2o、tensorflow、theano,甚至還有numpy和scipy這樣的核心庫,不僅能夠實現機器學習演算法,而且還使用它們來解決現實世界中的高階分析問題。

文字分析(Text analytics):如上所述,Python可以很好地處理文字資料,這方面產生了幾個流行的庫用來進行NLP、資訊檢索和文字分析,如nltk、gensim和pattern。你還可以應用標準機器學習演算法來解決與文字分析相關的問題。Python生態系統中易於使用的程式包可以減少開發的時間和工作量。我們將在本書中探討其中的幾個庫。

儘管上述列表看起來顯得非常強大了,但這些只不過是用Python可能解決的問題領域中的冰山一角。它還廣泛應用於人工智慧(AI)、遊戲開發、機器人、物聯網(IoT)、計算機視覺、多媒體處理以及網路和系統監控等幾個領域,上面僅列舉幾例。

想要閱讀Python在諸如藝術、科學、電腦科學、教育等不同領域所取得的一些廣泛成功案例,可以訪問www.python.org/about/success/。要了解使用Python開發的各種流行應用程式,請參閱www.python.org/about/apps/和https://wiki.python.org/moin/Applications,你一定會找到你已經使用的一些應用程式——其中一些是不可或缺的。

03 缺點:何時不用Python

你或許想知道它有什麼缺點呢?確實如此,像任何工具或語言一樣,Python有一些缺點,在這裡我們將強調其中的一些缺點,以便你在Python中開發和編寫程式碼時瞭解它們:

執行速度效能:效能是一個非常關鍵的方面,可以表示幾件事情,所以我們會精確地確定我們要談論的準確範圍就是指執行速度。因為Python並不是一個完全編譯的語言,因此它總是比完全編譯的低階程式語言(如C和C ++)慢些。你有幾種方法可以優化程式碼,包括多執行緒和多處理。你也可以使用靜態型別和Python的C語言擴充套件(稱為Cython)。你還可以考慮使用PyPy,它比普通Python快得多,因為它使用即時(just-in-time,JIT)編譯器(參見http://pypy.org),但是如果你編寫優化的程式碼,你通常可以在Python中很好地開發應用程式,而不需要依賴其它語言。請記住問題通常不在於工具,而是你編寫的程式碼——所有開發人員和工程師都會隨著時間和經驗而意識到這一點。

全域性直譯器鎖(Global Interpreter Lock ,GIL):GIL是一個互斥鎖,用於多個程式語言直譯器,如Python和Ruby。直譯器使用GIL只允許單個執行緒一次有效執行,即使它在多核處理器上執行時,從而有效限制了多執行緒實現的並行性,這取決於程序是I / O繫結還是CPU繫結,以及在直譯器之外有多少個呼叫。

版本不相容:如果你一直在跟蹤Python的新聞,你知道Python在2.7.x之上釋出了3.x版本,由於它在許多方面都是向後不相容的,這確實會帶來一大堆亟待解決的複雜問題。在Python 2.7中構建的幾個主要庫和程式包會在使用者不經意更新Python版本時開始中斷。因此,由於遺留程式碼問題,一大批企業和開發者社群仍然使用Python 2.7.x,因為這些程式包和庫的新版本從未建成。程式碼棄用和版本更改是系統崩潰中的一些最重要的因素。

上述這些問題,其中許多並不是Python特有的,也適用於其它語言,所以不要僅僅因為前面說的幾點就不再鼓勵你使用Python了——但是,你在編寫程式碼和構建系統時一定要記住它們。

04 Python實現和版本

Python有幾種不同版本的實現方式,因為它們正在積極開發中,版本會定期釋出。目前,有四種產品完備的、強大和穩定的主流Python實現:

CPython是常規的老版本Python,也是我們通常所稱的Python。它既是編譯器也是直譯器,有自己的一套全部用標準C語言編寫的標準程式包和模組。該版本可以直接用於所有流行的當前平臺。大多數的Python第三方程式包和庫與此版本相容。

PyPy是Python實現的一個更快實現,它使用JIT編譯器來使程式碼執行速度比CPython實現的速度更快——有時提供達10x-100x的加速。PyPy還有更高的記憶體效率,支援greenlet和stackless從而具有高並行性和併發性。

Jython是Java平臺的Python實現,它支援Java虛擬機器(Java Virtual Machine,JVM),適用於任何版本的Java(版本最好是7以上)。通過使用Jython,你可以用所有型別的Java庫、包和框架來編寫程式碼。當你更多地瞭解Java語法和Java中廣泛使用的OOP原則(如類、物件和介面)時,它的效果最好。

IronPython是流行的Microsoft .NET框架的Python實現,也稱為通用語言執行時(Common Language Runtime,CLR)。你可以使用IronPython中的所有Microsoft CLR庫和框架,即使你實質上並不需要在C#中編寫程式碼,它也有助於你更多地瞭解C#的語法和構造,以有效地使用IronPython。

我們首先建議你使用預設的Python版本,即CPython實現,只有當你真的有興趣與其它語言(如C#和Java)進行介面並需要在程式碼庫中使用它們時,才可以去嘗試其它版本。

關於使用何種版本的Python尚有許多爭論。最好的方法是你要考慮解決的問題以及需要使用的完整軟體生態系統,從庫、依賴關係和架構開始到實現和部署——同時也要考慮重用現有的舊程式碼庫。

如前所述,兩個主要的Python版本是2.x系列和3.x系列。它們是非常相似的,但是在3.x版本中出現了幾個向後不相容的變化,這導致在使用2.x的人和使用3.x的人之間產生了巨大遷移。PyPI上的大多數遺留程式碼和大部分的Python包都是在Python 2.7.x中開發的,因為所需的工作量不會很小,許多程式包的所有者沒有時間或意願將其將所有程式碼庫移植到Python 3.x。下面是3.x系列中的一些變化:

預設情況下,所有文字字串均為Unicode。

print和exec現在是函式,不再是語句。

range()返回一個記憶體高效的iterable,而不再是一個列表。

修改了類的風格。

基於慣例和型別衝突進行了庫和名稱變更。

要了解更多Python 3.0所引入的變更情況,請檢視https://docs.python.org/3/whatsnew/3.0.html,上面的官方文件列出了變更。如果你將程式碼從Python 2移植到Python 3,關於什麼變化會破壞你的程式碼,這個連結應該給你一個很好的解讀。

對於選擇哪個版本的問題,對此並沒有絕對的答案。它純粹取決於你正在試圖解決的問題,現有程式碼和具有的基礎設施,將來如何維護程式碼以及所有必要的依賴關係。

如果你正在開始一個全新專案,也非常清楚你並不需要任何僅依賴於Python 2.x的外部程式包和庫,那麼你可以繼續使用Python 3.x並啟動系統開發。但是,如果你有很多依賴於外部的程式包,並且可能會破壞Python 3.x或僅僅適用於Python 2.x,那麼你就別無選擇,只能堅持使用Python 2.x了。

05 Python句法和結構

在編寫程式碼時你應該記住,Python程式碼有一個清晰的分層語法。任何大型Python應用程式或系統都由多個模組構建,這些模組本身由Python語句組成。每條語句就像系統的命令或指令,指揮它應該執行什麼操作,這些語句由表示式和物件組成。Python中的所有東西都是物件——包括函式、資料結構、型別、類,等等。下圖顯示了這種層次結構。

▲Python程式層次結構

基本語句由物件、表示式組成,表示式通常使用物件並對其進行處理和執行操作。

物件可以是從簡單資料型別和結構到複雜物件的任何東西,包括函式和具有自己特定作用的保留字。Python有大約37個關鍵字或保留字,它們有自己設定的作用和功能。下表詳細列出了每一個關鍵字,包括你在程式碼中使用它們時應該會感到有用和方便的示例。

SI序號    關鍵字    說明    示例
1    and    邏輯AND運算子    (5==5 and 1==2) == False
2    as    用作某些物件/引用的同義詞    with open('file.txt') as f
3    assert    斷言/檢查表示式是否為True    assert 1==2, "Not Equal"
4    async    函式宣告為非同步(協同:co-routine)    async def get_data():
5    await    用於呼叫協同程式    return await get_data()
6    break    跳出執行迴圈    while True:
break
7    class    建立一個類(OOP)    class ClassifyText(object):
8    continue    繼續迴圈的下一個迭代    while True:
if a==1: continue
9    def    定義一個函式    def add(a,b):
return a+b
10    del    刪除引用    del arr
11    elif    Else-if條件語句    if num==1: print '1'
elif num==2: print '2'
12    else    Else條件語句    if num==1: print '1'
else: print 'not 1'
13    except    捕捉異常    except ValueError, e: print e
14    exec    動態執行程式碼    exec 'print "Hello Python"'
15    FALSE    布林值假    False == 0
16    finally    在try-except之後的最後執行語句    finally: print 'end of
exception'
17    for    for迴圈    for num in arr: print num
18    from    從模組匯入特定元件    from nltk.corpus import
brown
19    global    宣告變數為全域性變數    global var
20    if    if條件    if num==1: print '1'
21    import    匯入現有模組    import numpy
22    in    對現有物件檢查或迴圈    for num in arr \ if x in y
23    is    用於檢查是否相等    type('a') is str
24    lambda    建立一個匿名函式    lambda a: a**a
25    None    表示無值或空值    num = None
26    nonlocal    在函式中修改外部的但非全域性範圍的變數值    nonlocal var
27    not    邏輯NOT運算子    not 1 == 2
28    or    邏輯OR運算子    1 or 2 == 1
29    pass    用作指示空塊的佔位符    if a == 1: pass
30    print    列印字串或其它物件    print 'Hello World!'
31    raise    引發異常    raise Exception('overflow')
32    return    從函式退出後返回物件    return a, b
33    try    執行try語句的程式碼塊,如果發生異常,執行except語句    try: read_file()
except Exception, e: print e
34    while    while迴圈    while True: print value
35    with    對錶達式中的物件執行操作    with open('file.txt') as f:
data = f.read()
36    yield    生成器功能,暫停並返回給呼叫者    def generate_func(arr):
for num in arr: yield num+1
▲Python保留字

有幾點事項需要記住。關鍵字async和await僅在Python 3.5.x之後的版本中才可用。關鍵字exec和print是僅用在Python 2.x系列中的語句——從Python 3.x開始,它們是函式。關鍵字列表中的False、True和nonlocal是從Python 3.x系列開始引入。

Python語句通常指示直譯器在執行語句時應該做什麼。一串語句通常形成一個邏輯的程式碼塊。包括函式和迴圈以及條件的各種構造有助於分隔和執行基於使用者決策邏輯和設計的程式碼塊。

Python也非常關注程式碼的可讀性——因此縮排是Python程式碼的重要組成部分。預設情況下,Python不使用像分號的標點符號來表示語句結束。它還使用製表符或空格來顯示和分隔特定的程式碼塊,而不是像C、C ++、Java等語言中使用傳統的括號或關鍵字。

Python接受空格和製表符作為縮排,通常的規範是一個製表符或四個空格來表示每個特定的程式碼塊。未縮排的程式碼總是會引起語法錯誤,所以任何人在編寫Python程式碼時都必須格外小心,要注意程式碼的格式和縮排。

Python程式通常圍繞前面提到的層次結構。每個模組通常都是一個帶有_init__.py檔案的目錄,該檔案使目錄成為一個包,它還可能有多個模組,每個模組都是一個單獨的Python(.py)檔案。每個模組通常都有類和物件,例如其它模組和程式碼呼叫的函式。所有互連的模組最終構成了一個完整的Python程式、應用或系統。通常,你可以通過在Python(.py)檔案中編寫必要的程式碼來啟動任意的專案,並在專案因為新增更多元件而增大時要使其變得更模組化。

06 Python之禪

你或許想知道Python之禪究竟是什麼,在你對Python很熟悉時,這是你應首先了解的事情之一。Python之美在於其簡潔和優雅的風格。在程式設計中,Python有20條有影響力的指導原則或格言。資深的Python開拓者(Pythoneer)Tim Peters在1999年記錄了其中19個,可以通過https://hg.python.org/peps/file/tip/pep-0020.txt訪問它們,它們已作為Python增強建議(Python Enhancement Proposals,PEP)第20號(PEP 20)的一部分。如果你已經安裝了Python,這些最好的原則部分內容可以隨時通過在Python或IPython shell中執行以下程式碼來訪問Python的Zen:

In [5]: 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!

上述輸出的顯示形成Python之禪的19條原則,其作為復活節彩蛋被包括在Python語言本身中。這些原則是用簡單的英語編寫,即使你以前沒有寫過程式碼,很多都是很一目瞭然的,其中很多蘊含著笑話!Python專注於編寫可讀的、簡單幹淨的程式碼。Python還旨在確保你能專注於錯誤處理和實現易於解釋和理解的程式碼。

請你記住的一個原則是“簡單勝過複雜”(Simple is better than complex),它不僅適用於Python,而且適用於在解決問題世界時所遇到的很多事情。只要你知道在做什麼,有時一個簡單的方法比一個更復雜的會更好。