入門科普:什麼時候要用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),因為他是一個超級粉絲。


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

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社區使得這門語言更加鼓舞人心。

入門科普:什麼時候要用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,你一定會找到你已經使用的一些應用程序——其中一些是不可或缺的。

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

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了——但是,你在編寫代碼和構建系統時一定要記住它們。

入門科普:什麼時候要用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程序層次結構

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

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

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

▲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)文件中編寫必要的代碼來啟動任意的項目,並在項目因為添加更多組件而增大時要使其變得更

模塊化

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


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 thisThe Zen of Python, by Tim PetersBeautiful 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,而且適用於在解決問題世界時所遇到的很多事情。只要你知道在做什麼,有時一個簡單的方法比一個更復雜的會更好。

關於作者:迪潘簡·撒卡爾,Intel公司的數據科學家,研究領域涉及數據科學與軟件工程,有著豐富的文本分析研究和工程方面的經驗,出版過多本R語言和機器學習方面的書籍。

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


分享到:


相關文章: