【Python学习教程】Python编程基础
文章目錄
- 編程語言是什么
- 編譯型語言和解釋型語言的區別
- 編譯型語言
- 1) 可執行程序不能跨平臺
- 2) 源代碼不能跨平臺
- 解釋型語言
- 關于 Python
- 總結
- Python是什么,Python簡介
- Python的特點(優點和缺點)
- Python 的優點
- 1) 語法簡單
- 2) Python 是開源的
- 3) Python 是免費的
- 4) Python 是高級語言
- 5) Python 是解釋型語言,能跨平臺
- 5) Python 是面向對象的編程語言
- 6) Python 功能強大(模塊眾多)
- 7) Python 可擴展性強
- Python 的缺點
- 1) 運行速度慢
- 2) 代碼加密困難
- 學Python,不需要有編程基礎!
- Python能干什么,Python的應用領域
- Web應用開發
- 自動化運維
- 人工智能領域
- 網路爬蟲
- 科學計算
- 游戲開發
- 怎樣學習Python才能成為高手?
- 編程語言都是相通的
- Python對初學者很友好
- 1) 多實踐,積累代碼量
- 2) 時刻注意代碼規范
- 3) 開發經驗是必不可少的
- Python版本區別,Python 3和Python 2區別詳解
- Python 3.x print函數代替了print語句
- Python 3.x 默認使用 UTF-8 編碼
- Python 3.x 除法運算
- / 運算符
- 運算符 //
- Python 3.x 異常
- Python 3.x 八進制字面量表示
- Python 3.x 不等于運算符
- Python 3.x 數據類型
- Python 2.x和Python 3.x,初學者應如何選擇?
- Python 2to3:自動將Python 2.x代碼轉換成Python3.x代碼
- Python PEP文檔:及時追蹤Python最新變化
- Python PEP文檔
- Python底層是用什么語言實現的?
- Stackless Python
- JPython
- IronPython
- PyPy
- 了解Jupyter Notebook,你已然超越了90%的Python程序員
- 什么是Jupyter Notebook
- Jupyter Notebook的影響力
- Jupyter Notebook的優勢
- 1) 整合了所有資源
- 2) 交互性編程體驗
- 3) 輕松運行他人編寫的代碼
轉載于http://c.biancheng.net/python/
Python 并不是一門新的編程語言,1991 年就發行了第一個版本,2010 年以后隨著大數據和人工智能的興起,Python 又重新煥發出了耀眼的光芒。在 2019 年 12 月份世界編程語言排行榜中,Python 排名第三,僅次于 Java 和C語言。
Python 是一門開源免費的腳本編程語言,它不僅簡單易用,而且功能強大。
Python 是一門推崇“極簡主義”的編程語言,閱讀優秀的 Python 程序就像閱讀一段英文,非專業人士也可以使用 Python。
本章主要介紹和 Python 編程相關的基礎知識,并沒有真正涉及 Python 語法,算是一道“開胃菜”。
編程語言是什么
其實,程序指的就是一系列指令,用來告訴計算機做什么,而編寫程序的關鍵在于,我們需要用計算機可以理解的語言來提供這些指令。
雖然借助 Siri(Apple)、Google Now(Android)、Cortana(Microsoft)等技術,我們可以使用漢語直接告訴計算機做什么,比如“Siri,打開酷狗音樂”,但使用過這些系統的讀者都知道,它尚未完全成熟,再加上我們語言充滿了模糊和不精確因素,使得設計一個完全理解人類語言的計算機程序,仍然是一個有待解決的問題。
為了有效避開所有影響給計算機傳遞指令的因素,計算機科學家設計了一些符號,這些符號各有其含義,且之間無二義性,通常稱它們為編程語言。編程語言中的每個結構,都有固定的使用格式(稱為語法)以及精確的含義(稱為語義)。換句話說,編程語言指定了成套的規則,用來編寫計算機可以理解的指令。習慣上,我們將這一條條指令稱為計算機代碼,而用編程語言來編寫算法的過程稱為編碼。
本教程要講解的 Python 就是一種編程語言,除此之外,你肯定也聽說過其他一些編程語言,如 C、C++、Java、Ruby 等。至今,計算機科學家已經開發了成百上千種編程語言,且隨著時間演變,這些編程語言又產生了多個不同的版本。但無論是哪個編程語言,也無論有多少個版本,雖然它們在細節上可能有所不同,無疑它們都有著固定的、無二義性的語法和語義。
以上提到的編程語言,都是高級計算機語言,設計它們的目的是為了方便程序員理解和使用。但嚴格來說,計算機硬件只能理解一種非常低級的編程語言,稱為機器語言。
比如說,讓計算機對 2 個數做求和操作,那么 CPU 可能要執行以下指令:
可以看到,對 2 個數執行求和操作需要做這么多工作,且這還只是籠統地描述,實際會更加復雜。
而使用 Python 這樣的高級語言,對 2 個數求和可以很自然地用 c = a + b 表示,但由此帶來的問題是,我們需要設計一種方法,將高級語言翻譯成計算機可以執行的機器語言,有兩種方法可以實現,分別是使用編譯器和解釋器。
使用編譯器將自身等效轉換成機器語言的高級語言,通常稱為編譯型語言;而使用解釋器將自身轉換成機器語言的高級語言,稱為解釋型語言,Python 就是解釋型編程語言的一種。
關于編譯型語言和解釋型語言的含義和區別,后續章節會進行詳細介紹。
編譯型語言和解釋型語言的區別
我們編寫的源代碼是人類語言,我們自己能夠輕松理解;但是對于計算機硬件(CPU),源代碼就是天書,根本無法執行,計算機只能識別某些特定的二進制指令,在程序真正運行之前必須將源代碼轉換成二進制指令。
所謂的二進制指令,也就是機器碼,是 CPU 能夠識別的硬件層面的“代碼”,簡陋的硬件(比如古老的單片機)只能使用幾十個指令,強大的硬件(PC 和智能手機)能使用成百上千個指令。
然而,究竟在什么時候將源代碼轉換成二進制指令呢?不同的編程語言有不同的規定:
- 有的編程語言要求必須提前將所有源代碼一次性轉換成二進制指令,也就是生成一個可執行程序(Windows 下的 .exe),比如C語言、C++、Golang、Pascal(Delphi)、匯編等,這種編程語言稱為編譯型語言,使用的轉換工具稱為編譯器。
- 有的編程語言可以一邊執行一邊轉換,需要哪些源代碼就轉換哪些源代碼,不會生成可執行程序,比如 Python、JavaScript、PHP、Shell、MATLAB 等,這種編程語言稱為解釋型語言,使用的轉換工具稱為解釋器。
簡單理解,編譯器就是一個“翻譯工具”,類似于將中文翻譯成英文、將英文翻譯成俄文。但是,翻譯源代碼是一個復雜的過程,大致包括詞法分析、語法分析、語義分析、性能優化、生成可執行文件等五個步驟,期間涉及到復雜的算法和硬件架構。解釋器與此類似,有興趣的讀者請參考《編譯原理》一書,本文不再贅述。
Java 和 C# 是一種比較奇葩的存在,它們是半編譯半解釋型的語言,源代碼需要先轉換成一種中間文件(字節碼文件),然后再將中間文件拿到虛擬機中執行。Java 引領了這種風潮,它的初衷是在跨平臺的同時兼顧執行效率;C# 是后來的跟隨者,但是 C# 一直止步于 Windows 平臺,在其它平臺鮮有作為。
圖 1 編譯型語言和解釋型語言的執行流程
那么,編譯型語言和解釋型語言各有什么特點呢?它們之間有什么區別?
編譯型語言
對于編譯型語言,開發完成以后需要將所有的源代碼都轉換成可執行程序,比如 Windows 下的.exe文件,可執行程序里面包含的就是機器碼。只要我們擁有可執行程序,就可以隨時運行,不用再重新編譯了,也就是“一次編譯,無限次運行”。
在運行的時候,我們只需要編譯生成的可執行程序,不再需要源代碼和編譯器了,所以說編譯型語言可以脫離開發環境運行。
編譯型語言一般是不能跨平臺的,也就是不能在不同的操作系統之間隨意切換。
編譯型語言不能跨平臺表現在兩個方面:
1) 可執行程序不能跨平臺
可執行程序不能跨平臺很容易理解,因為不同操作系統對可執行文件的內部結構有著截然不同的要求,彼此之間也不能兼容。不能跨平臺是天經地義,能跨平臺反而才是奇葩。
比如,不能將 Windows 下的可執行程序拿到 Linux 下使用,也不能將 Linux 下的可執行程序拿到 Mac OS 下使用(雖然它們都是類 Unix 系統)。
另外,相同操作系統的不同版本之間也不一定兼容,比如不能將 x64 程序(Windows 64 位程序)拿到 x86 平臺(Windows 32 位平臺)下運行。但是反之一般可行,因為 64 位 Windows 對 32 位程序作了很好的兼容性處理。
2) 源代碼不能跨平臺
不同平臺支持的函數、類型、變量等都可能不同,基于某個平臺編寫的源代碼一般不能拿到另一個平臺下編譯。我們以C語言為例來說明。
【實例1】在C語言中要想讓程序暫停可以使用“睡眠”函數,在 Windows 平臺下該函數是 Sleep(),在 Linux 平臺下該函數是 sleep(),首字母大小寫不同。其次,Sleep() 的參數是毫秒,sleep() 的參數是秒,單位也不一樣。
以上兩個原因導致使用暫停功能的C語言程序不能跨平臺,除非在代碼層面做出兼容性處理,非常麻煩。
【實例2】雖然不同平臺的C語言都支持 long 類型,但是不同平臺的 long 的長度卻不同,例如,Windows 64 位平臺下的 long 占用 4 個字節,Linux 64 位平臺下的 long 占用 8 個字節。
我們在 Linux 64 位平臺下編寫代碼時,將 0x2f1e4ad23 賦值給 long 類型的變量是完全沒有問題的,但是這樣的賦值在 Windows 平臺下就會導致數值溢出,讓程序產生錯誤的運行結果。
讓人苦惱的,這樣的錯誤一般不容易察覺,因為編譯器不會報錯,我們也記不住不同類型的取值范圍。
解釋型語言
對于解釋型語言,每次執行程序都需要一邊轉換一邊執行,用到哪些源代碼就將哪些源代碼轉換成機器碼,用不到的不進行任何處理。每次執行程序時可能使用不同的功能,這個時候需要轉換的源代碼也不一樣。
因為每次執行程序都需要重新轉換源代碼,所以解釋型語言的執行效率天生就低于編譯型語言,甚至存在數量級的差距。計算機的一些底層功能,或者關鍵算法,一般都使用 C/C++ 實現,只有在應用層面(比如網站開發、批處理、小工具等)才會使用解釋型語言。
在運行解釋型語言的時候,我們始終都需要源代碼和解釋器,所以說它無法脫離開發環境。
當我們說“下載一個程序(軟件)”時,不同類型的語言有不同的含義:
- 對于編譯型語言,我們下載到的是可執行文件,源代碼被作者保留,所以編譯型語言的程序一般是閉源的。
- 對于解釋型語言,我們下載到的是所有的源代碼,因為作者不給源代碼就沒法運行,所以解釋型語言的程序一般是開源的。
相比于編譯型語言,解釋型語言幾乎都能跨平臺,“一次編寫,到處運行”是真是存在的,而且比比皆是。那么,為什么解釋型語言就能快平臺呢?
這一切都要歸功于解釋器!
我們所說的跨平臺,是指源代碼跨平臺,而不是解釋器跨平臺。解釋器用來將源代碼轉換成機器碼,它就是一個可執行程序,是絕對不能跨平臺的。
官方需要針對不同的平臺開發不同的解釋器,這些解釋器必須要能夠遵守同樣的語法,識別同樣的函數,完成同樣的功能,只有這樣,同樣的代碼在不同平臺的執行結果才是相同的。
你看,解釋型語言之所以能夠跨平臺,是因為有了解釋器這個中間層。在不同的平臺下,解釋器會將相同的源代碼轉換成不同的機器碼,解釋器幫助我們屏蔽了不同平臺之間的差異。
關于 Python
Python 屬于典型的解釋型語言,所以運行 Python 程序需要解釋器的支持,只要你在不同的平臺安裝了不同的解釋器,你的代碼就可以隨時運行,不用擔心任何兼容性問題,真正的“一次編寫,到處運行”。
Python 幾乎支持所有常見的平臺,比如 Linux、Windows、Mac OS、Android、FreeBSD、Solaris、PocketPC 等,你所寫的 Python 代碼無需修改就能在這些平臺上正確運行。也就是說,Python 的可移植性是很強的。
總結
我們將編譯型語言和解釋型語言的差異總結為下表:
| 編譯型語言 | 通過專門的編譯器,將所有源代碼一次性轉換成特定平臺(Windows、Linux 等)執行的機器碼(以可執行文件的形式存在)。 | 編譯一次后,脫離了編譯器也可以運行,并且運行效率高。 | 可移植性差,不夠靈活。 |
| 解釋型語言 | 由專門的解釋器,根據需要將部分源代碼臨時轉換成特定平臺的機器碼。 | 跨平臺性好,通過不同的解釋器,將相同的源代碼解釋成不同平臺下的機器碼。 | 一邊執行一邊轉換,效率很低。 |
Python是什么,Python簡介
編程語言有“高低”之分,而高級語言又有很多種,比如 C++、Java、C#、PHP、JavaScript 等,Python 也是其中之一。從本節開始,我們將正式開始學習 Python 這門高級編程語言,但是在此之前,我們有必要先討論一下“Python 是什么”。
Python 英文原意為“蟒蛇”,直到 1989 年荷蘭人 Guido van Rossum (簡稱 Guido)發明了一種面向對象的解釋型編程語言,并將其命名為 Python,才賦予了它表示一門編程語言的含義。
我們將在《編譯型語言和解釋型語言的區別》一文中講解什么是解釋型語言。
圖 1 Python 的標志(Logo)
說道 Python,它的誕生是極具戲曲性的,據 Guido 的自述記載,Python 語言是他在圣誕節期間為了打發時間開發出來的,之所以會選擇 Python 作為該編程語言的名字,是因為他是一個叫 Monty Python 戲劇團體的忠實粉絲。
Python 語言是在 ABC 教學語言的基礎上發展來的;遺憾的是,ABC 語言雖然非常強大,但卻沒有普及應用,Guido 認為是它不開放導致的。
基于這個考慮,Guido 在開發 Python 時,不僅為其添加了很多 ABC 沒有的功能,還為其設計了各種豐富而強大的庫,利用這些 Python 庫,程序員可以把使用其它語言制作的各種模塊(尤其是C語言和 C++)很輕松地聯結在一起,因此 Python 又常被稱為“膠水”語言。
這里的庫和模塊,簡單理解就是一個個的源文件,每個文件中都包含可實現各種功能的方法(也可稱為函數)。
從整體上看,Python 語言最大的特點就是簡單,該特點主要體現在以下 2 個方面:
- Python 語言的語法非常簡潔明了,即便是非軟件專業的初學者,也很容易上手。
- 和其它編程語言相比,實現同一個功能,Python 語言的實現代碼往往是最短的。
對于 Python,網絡上流傳著“人生苦短,我用 Python”的說法。
因此,看似 Python 是“不經意間”開發出來的,但絲毫不比其它編程語言差。事實也是如此,自 1991 年 Python 第一個公開發行版問世后:
- 2004 年起 Python 的使用率呈線性增長,不斷受到編程者的歡迎和喜愛;
- 2010 年,Python 榮膺 TIOBE 2010 年度語言桂冠;
- 2017 年,IEEE Spectrum 發布的 2017 年度編程語言排行榜中,Python 位居第 1 位。
直至現在(2019 年 12 月份),根據 TIOBE 排行榜的顯示,Python 也居于第 3 位,且有繼續提升的態勢(如表 2 所示)。
| 1 | 1 | Java | 17.253% | +1.32% |
| 2 | 2 | C | 16.086% | +1.80% |
| 3 | 3 | Python | 10.308% | +1.93% |
| 4 | 4 | C++ | 6.196% | -1.37% |
| 5 | 6 | C# | 4.801% | +1.35% |
| 6 | 5 | Visual Basic .NET | 4.743% | -2.38% |
| 7 | 7 | JavaScript | 2.090% | -0.97% |
| 8 | 8 | PHP | 2.048% | -0.39% |
| 9 | 9 | SQL | 1.843% | -0.34% |
| 10 | 14 | Swift | 1.490% | +0.27% |
| 11 | 17 | Ruby | 1.314% | +0.21% |
| 12 | 11 | Delphi/Object Pascal | 1.280% | -0.12% |
| 13 | 10 | Objective-C | 1.204% | -0.27% |
| 14 | 12 | Assembly language | 1.067% | -0.30% |
| 15 | 15 | Go | 0.995% | -0.19% |
| 16 | 16 | R | 0.995% | -0.12% |
| 17 | 13 | MATLAB | 0.986% | -0.30% |
| 18 | 25 | D | 0.930% | +0.42% |
| 19 | 19 | Visual Basic | 0.929% | -0.05% |
| 20 | 18 | Perl | 0.899% | -0.11% |
顯然,Python 已經將 C++ 語言甩在了后邊,直逼 C 語言和 Java,而且未來有可能超越它們,成為編程語言排行榜冠軍。
我們不妨再看一下 Python 歷年來的市場份額變化曲線,Python 的未來大勢可期。
圖 2 Python 歷年來市場份額變化曲線
錯過了 C/C++ 的 PC 時代,又錯過了 Java 的互聯網和智能手機時代,你還想錯過 Python 的人工智能和大數據時代嗎?Python 正位于軟件產業的第四次風口之上,把握好風口,你就能飛起來。
Python的特點(優點和缺點)
Python 是一種面向對象的、解釋型的、通用的、開源的腳本編程語言,它之所以非常流行,我認為主要有三點原因:
- Python 簡單易用,學習成本低,看起來非常優雅干凈;
- Python 標準庫和第三庫眾多,功能強大,既可以開發小工具,也可以開發企業級應用;
- Python 站在了人工智能和大數據的風口上,站在風口上,豬都能飛起來。
舉個簡單的例子來說明一下 Python 的簡單。比如要實現某個功能,C語言可能需要 100 行代碼,而 Python 可能只需要幾行代碼,因為C語言什么都要得從頭開始,而 Python 已經內置了很多常見功能,我們只需要導入包,然后調用一個函數即可。
簡單就是 Python 的巨大魅力之一,是它的殺手锏,用慣了 Python 再用C語言簡直不能忍受。
本文就來匯總一下 Python 的特性,綜合對比一下它的優缺點。
Python 的優點
1) 語法簡單
和傳統的 C/C++、Java、C# 等語言相比,Python 對代碼格式的要求沒有那么嚴格,這種寬松使得用戶在編寫代碼時比較舒服,不用在細枝末節上花費太多精力。我來舉兩個典型的例子:
- Python 不要求在每個語句的最后寫分號,當然寫上也沒錯;
- 定義變量時不需要指明類型,甚至可以給同一個變量賦值不同類型的數據。
這兩點也是 PHP、JavaScript、MATLAB 等常見腳本語言都具備的特性。
Python 是一種代表極簡主義的編程語言,閱讀一段排版優美的 Python 代碼,就像在閱讀一個英文段落,非常貼近人類語言,所以人們常說,Python 是一種具有偽代碼特質的編程語言。
偽代碼(Pseudo Code)是一種算法描述語言,它介于自然語言和編程語言之間,使用偽代碼的目的是為了使被描述的算法可以容易地以任何一種編程語言(Pascal,C,Java,etc)實現。因此,偽代碼必須結構清晰、代碼簡單、可讀性好,并且類似自然語言。
如果你學過數據結構,閱讀過嚴蔚敏的書籍,那你一定知道什么是偽代碼。
為什么說簡單就是殺手锏?一旦簡單了,一件事情就會變得很純粹;我們在開發 Python 程序時,可以專注于解決問題本身,而不用顧慮語法的細枝末節。在簡單的環境中做一件純粹的事情,那簡直是一種享受。
2) Python 是開源的
開源,也即開放源代碼,意思是所有用戶都可以看到源代碼。
Python 的開源體現在兩方面:
① 程序員使用 Python 編寫的代碼是開源的。
比如我們開發了一個 BBS 系統,放在互聯網上讓用戶下載,那么用戶下載到的就是該系統的所有源代碼,并且可以隨意修改。這也是解釋型語言本身的特性,想要運行程序就必須有源代碼。
② Python 解釋器和模塊是開源的。
官方將 Python 解釋器和模塊的代碼開源,是希望所有 Python 用戶都參與進來,一起改進 Python 的性能,彌補 Python 的漏洞,代碼被研究的越多就越健壯。
這個世界上總有那么一小撮人,他們或者不慕名利,或者為了達到某種目的,會不斷地加強和改善 Python。千萬不要認為所有人都是只圖眼前利益的,總有一些精英會放長線釣大魚,總有一些極客會做一些炫酷的事情。
3) Python 是免費的
開源并不等于免費,開源軟件和免費軟件是兩個概念,只不過大多數的開源軟件也是免費軟件;Python 就是這樣一種語言,它既開源又免費。
如果你想區分開源和免費的概念,請猛擊:開源就等于免費嗎?用事實來說話
用戶使用 Python 進行開發或者發布自己的程序,不需要支付任何費用,也不用擔心版權問題,即使作為商業用途,Python 也是免費的。
4) Python 是高級語言
這里所說的高級,是指 Python 封裝較深,屏蔽了很多底層細節,比如 Python 會自動管理內存(需要時自動分配,不需要時自動釋放)。
高級語言的優點是使用方便,不用顧慮細枝末節;缺點是容易讓人淺嘗輒止,知其然不知其所以然。
5) Python 是解釋型語言,能跨平臺
解釋型語言一般都是跨平臺的(可移植性好),Python 也不例外,我們已經在《編譯型語言和解釋型語言的區別》中進行了講解,這里不再贅述。
5) Python 是面向對象的編程語言
面向對象是現代編程語言一般都具備的特性,否則在開發中大型程序時會捉襟見肘。
Python 支持面向對象,但它不強制使用面向對象。Java 是典型的面向對象的編程語言,但是它強制必須以類和對象的形式來組織代碼。
6) Python 功能強大(模塊眾多)
Python 的模塊眾多,基本實現了所有的常見的功能,從簡單的字符串處理,到復雜的 3D 圖形繪制,借助 Python 模塊都可以輕松完成。
Python 社區發展良好,除了 Python 官方提供的核心模塊,很多第三方機構也會參與進來開發模塊,這其中就有 Google、Facebook、Microsoft 等軟件巨頭。即使是一些小眾的功能,Python 往往也有對應的開源模塊,甚至有可能不止一個模塊。
7) Python 可擴展性強
Python 的可擴展性體現在它的模塊,Python 具有腳本語言中最豐富和強大的類庫,這些類庫覆蓋了文件 I/O、GUI、網絡編程、數據庫訪問、文本操作等絕大部分應用場景。
這些類庫的底層代碼不一定都是 Python,還有很多 C/C++ 的身影。當需要一段關鍵代碼運行速度更快時,就可以使用 C/C++ 語言實現,然后在 Python 中調用它們。Python 能把其它語言“粘”在一起,所以被稱為“膠水語言”。
Python 依靠其良好的擴展性,在一定程度上彌補了運行效率慢的缺點。
Python 的缺點
除了上面提到的各種優點,Python 也是有缺點的。
1) 運行速度慢
運行速度慢是解釋型語言的通病,Python 也不例外。
Python 速度慢不僅僅是因為一邊運行一邊“翻譯”源代碼,還因為 Python 是高級語言,屏蔽了很多底層細節。這個代價也是很大的,Python 要多做很多工作,有些工作是很消耗資源的,比如管理內存。
Python 的運行速度幾乎是最慢的,不但遠遠慢于 C/C++,還慢于 Java。
但是速度慢的缺點往往也不會帶來什么大問題。首先是計算機的硬件速度運來越快,多花錢就可以堆出高性能的硬件,硬件性能的提升可以彌補軟件性能的不足。
其次是有些應用場景可以容忍速度慢,比如網站,用戶打開一個網頁的大部分時間是在等待網絡請求,而不是等待服務器執行網頁程序。服務器花 1ms 執行程序,和花 20ms 執行程序,對用戶來說是毫無感覺的,因為網絡連接時間往往需要 500ms 甚至 2000ms。
2) 代碼加密困難
不像編譯型語言的源代碼會被編譯成可執行程序,Python 是直接運行源代碼,因此對源代碼加密比較困難。
開源是軟件產業的大趨勢,傳統程序員需要轉變觀念。
學Python,不需要有編程基礎!
“編程零基礎,可以學習 Python 嗎”,這是很多初學者經常問我的一個問題。當然,在計算機方面的基礎越好,對學習任何一門新的編程語言越有利。但如果你在編程語言的學習上屬于零基礎,也不用擔心,因為無論用哪門語言作為學習編程的入門語言,總是要有一個開始。
就我個人的觀點,Python 作為學習編程的入門語言是再合適不過的。凡是在大學計算機專業學習過 C 語言的同學都感同身受,認為 C 語言不是很好的入門語言,很多曾經立志學習編程的讀者,在學習了 C 語言之后,就決心不再學習編程。因此,是否學會 C 語言,好像成為了進入編程行業的篩選標準。
但是,如果將 Python 作為編程入門語言,就不會出現類似 C 語言的那些窘境問題。目前,逐漸有高校開始使用 Python 作為軟件專業大學生(甚至也包含非軟件專業)的入門編程語言。
本教程始終貫徹的思想就是,零基礎也能學 Python,教程的目標就是和初學者一起,從零基礎開始學習 Python。因此,編程零基礎的你,無需猶豫,盡管放膽來學。
除此之外,很多初學者還面臨這樣一個問題,那就是教程已經學完啦,教程中的代碼也都已經親自編寫并運行通過了,但還是不知道如何開發一個真正的應用程序,面對問題還是不知道如何下手解決。
如果你深有同感,只能說明你缺乏練習,代碼編輯量太少。從編程零基礎到專業程序員的過程,除了學習更多的基礎知識,更要刻意地去培養自己的編程思維,這沒有捷徑,只有靠不斷積累自己的代碼量。
當然,增加代碼量并不是要我們去盲目地編寫代碼,如果找不到增加代碼量的方向,可以從閱讀別人的代碼開始。需要注意的是,在閱讀他人編寫的代碼時,要邊閱讀邊思考,多問幾個為什么,例如代碼為什么要這么寫,有什么意圖,有沒有更簡單的方法可以實現等等,必要情況下還可以給代碼進行必要的注釋。不僅如此,在完全理解他人代碼的前提下,還可以試圖對代碼做修改,實現一些自己的想法。做到這些,才能說明你將別人的代碼消化吸收了。
初學者在寫代碼或者調試代碼的過程中,肯定會遇到很多問題,怎么辦呢?最好的方法就是借助網絡尋找答案,看看類似的問題別人是如何解決的,千萬不要總是局限在自己的思維范圍中。在這里,給大家推薦一個專門針對編程答疑解惑的網站 Stack OverFlow。
Python能干什么,Python的應用領域
Python 作為一種功能強大的編程語言,因其簡單易學而受到很多開發者的青睞。那么,Python 的應用領域有哪些呢?
Python 的應用領域非常廣泛,幾乎所有大中型互聯網企業都在使用 Python 完成各種各樣的任務,例如國外的 Google、Youtube、Dropbox,國內的百度、新浪、搜狐、騰訊、阿里、網易、淘寶、知乎、豆瓣、汽車之家、美團等等。
概括起來,Python 的應用領域主要有如下幾個。
Web應用開發
Python 經常被用于 Web 開發,盡管目前 PHP、JS 依然是 Web 開發的主流語言,但 Python 上升勢頭更猛勁。尤其隨著 Python 的 Web 開發框架逐漸成熟(比如 Django、flask、TurboGears、web2py 等等),程序員可以更輕松地開發和管理復雜的 Web 程序。
例如,通過 mod_wsgi 模塊,Apache 可以運行用 Python 編寫的 Web 程序。Python 定義了 WSGI 標準應用接口來協調 HTTP 服務器與基于 Python 的 Web 程序之間的通信。
舉個最直觀的例子,全球最大的搜索引擎 Google,在其網絡搜索系統中就廣泛使用 Python 語言。另外,我們經常訪問的集電影、讀書、音樂于一體的豆瓣網(如圖 1 所示),也是使用 Python 實現的。
圖 1 用 Python 實現的豆瓣網
不僅如此,全球最大的視頻網站 Youtube 以及 Dropbox(一款網絡文件同步工具)也都是用 Python 開發的。
自動化運維
很多操作系統中,Python 是標準的系統組件,大多數 Linux 發行版以及 NetBSD、OpenBSD 和 Mac OS X 都集成了 Python,可以在終端下直接運行 Python。
有一些 Linux 發行版的安裝器使用 Python 語言編寫,例如 Ubuntu 的 Ubiquity 安裝器、Red Hat Linux 和 Fedora 的 Anaconda 安裝器等等。
另外,Python 標準庫中包含了多個可用來調用操作系統功能的庫。例如,通過 pywin32 這個軟件包,我們能訪問 Windows 的 COM 服務以及其他 Windows API;使用 IronPython,我們能夠直接調用 .Net Framework。
通常情況下,Python 編寫的系統管理腳本,無論是可讀性,還是性能、代碼重用度以及擴展性方面,都優于普通的 shell 腳本。
人工智能領域
人工智能是項目非常火的一個研究方向,如果要評選當前最熱、工資最高的 IT 職位,那么人工智能領域的工程師最有話語權。而 Python 在人工智能領域內的機器學習、神經網絡、深度學習等方面,都是主流的編程語言。
可以這么說,基于大數據分析和深度學習發展而來的人工智能,其本質上已經無法離開 Python 的支持了,原因至少有以下幾點:
VS Code 是微軟推出的一款代碼編輯工具(IDE),有關它的下載、安裝和使用,后續章節會做詳細介紹。
總之,AI 時代的來臨,使得 Python 從眾多編程語言中脫穎而出,Python 作為 AI 時代頭牌語言的位置,基本無人可撼動!
網路爬蟲
Python 語言很早就用來編寫網絡爬蟲。Google 等搜索引擎公司大量地使用 Python 語言編寫網絡爬蟲。
從技術層面上將,Python 提供有很多服務于編寫網絡爬蟲的工具,例如 urllib、Selenium 和 BeautifulSoup 等,還提供了一個網絡爬蟲框架 Scrapy。
科學計算
自 1997 年,NASA 就大量使用 Python 進行各種復雜的科學運算。
并且,和其它解釋型語言(如 shell、js、PHP)相比,Python 在數據分析、可視化方面有相當完善和優秀的庫,例如 NumPy、SciPy、Matplotlib、pandas 等,這可以滿足 Python 程序員編寫科學計算程序。
游戲開發
很多游戲使用 C++ 編寫圖形顯示等高性能模塊,而使用 Python 或 Lua 編寫游戲的邏輯。和 Python 相比,Lua 的功能更簡單,體積更小;而 Python 則支持更多的特性和數據類型。
比如說,國際上指明的游戲 Sid Meier’s Civilization(文明,如圖 2 所示)就是使用 Python 實現的。
圖 2 Python 開發的游戲
除此之外,Python 可以直接調用 Open GL 實現 3D 繪制,這是高性能游戲引擎的技術基礎。事實上,有很多 Python 語言實現的游戲引擎,例如 Pygame、Pyglet 以及 Cocos 2d 等。
以上也僅是介紹了 Python 應用領域的“冰山一角”,例如,還可以利用 Pygame 進行游戲編程;用 PIL 和其他的一些工具進行圖像處理;用 PyRo 工具包進行機器人控制編程,等等。有興趣的讀者,可自行搜索資料進行詳細了解。
怎樣學習Python才能成為高手?
在學習過程中,很多小伙伴經常抱怨,計算機編程語言種類太多,根本學不過來,可能用了 Java 很多年,突然最近的項目需要用 Python,就感到不知所措,壓力山大。
再舉個例子,Facebook 的主流語言是 Hack(PHP 的進化版本),但對于剛剛入職的工程師而言,100 個里至少有 95 個之前根本沒有用過 Hack 或者 PHP。不過,這些人上手都特別快,基本上只需要 1~2 周,日常編程就變得毫無壓力。
那么,他們是怎么做到的呢?
編程語言都是相通的
首先,如果你具有一定的編程基礎,接觸一門新的編程語言時會發現,不同的編程語言之間其實是相通的,因為編程語言本就是人類控制計算機的一系列指令,即便是不同的編程語言,它們在語法規則方面也大同小異。
因此,在原有編程基礎上再學習一門新的編程語言,并沒有那么難。學習過程中,首先要做到的就是明確區別。例如,學習 Python 的條件和循環語句時,可以比對 C 語言或者 C++ 語言的語法是怎樣的;學習 Python 中的字符串相加時,可以對比 Java 語言中字符串相加的語法。
除了能夠明確區分各編程語言的不同點,還要能將它們聯系起來靈活運用。比如說,Python 語言的優勢是擅長數據分析,因此它廣泛應用于人工智能(AI)、機器學習等領域(例如機器學習用到的 TensorFlow 框架就是用 Python 寫的),但是涉及到底層的矩陣運算等操作時,就需要依賴 C++ 語言,因為它的速度快,運行效率更高。
事實上,很多公司都是根據不同的需求選擇不同的編程語言進行開發。畢竟,哪怕只是幾十到幾百毫秒的速度差距,對用戶體驗來說都是決定性的。
Python對初學者很友好
如果 Python 是你接觸的第一門編程語言,那也不必擔心。我們知道,雖然同為人機交互的橋梁,但 Python 比 C++、Java 等,語言更簡潔,也更接近英語,對初學者很友好,這也是 Python 語言的一個顯著特點。
對于初學者來說,要做的就是專注于 Python 這一門語言,明確學習的重點,把握好學習節奏,由淺入深循序漸進地學習。根據本人多年的學習工作經驗,把編程語言的學習分為以下 3 步,無論你是否有編程基礎,都可以對照著來做。
1) 多實踐,積累代碼量
任何一門編程語言,其囊括的知識面都是非常廣泛的,從基本的變量賦值、條件循環、到文件操作、并發編程等,千萬不要等到把所有知識點都學完了才開始練習,因為到那時你會發現,前面好不容易記住的知識都忘記了。
學習編程,是十分講究實戰的,沒有捷徑可走,越早練習,練得越多越勤,學習效果就越好。
2) 時刻注意代碼規范
學習編程語言,在追求快和高效的同時,每一種編程語言都有必要的編碼規范,一定不能忽略。
要想成為一名優秀的程序員,從起步階段就要刻意地去培養自己的編程規范。例如,在剛開始編寫代碼時,不要將原本多行的代碼全部寫到一行,也不要隨便用 a、b、c 等字母作為變量的名稱。
3) 開發經驗是必不可少的
要想真正熟練地掌握 Python(或者其它編程語言),擁有大中型產品的開發經驗是必不可少的,它會讓你站得更高,望得更遠。
例如,我們幾乎每天都會用搜索引擎,但你了解一個搜索引擎的服務器端實現嗎?這是一個典型的面向對象設計,需要定義一系列相關的類和函數,還要從產品需求、代碼復雜度、效率以及可讀性等多個方面綜合考量,同時在上線后還要進行各種優化等。
本教程中無法讓你完成一個上億用戶級產品的實踐,但設置有一些小項目,可以幫你掌握必要的開發知識。最后,這里為你準備了一章 Python 學習的知識圖譜,涵蓋了 Python 的核心知識,其中的大部分內容本教程都會做詳細講解。
Python知識體系框架(點擊查看高清大圖)
Python版本區別,Python 3和Python 2區別詳解
和 Python 2.x 版本相比,Python 3.x 版本在語句輸出、編碼、運算和異常等方面做出了一些調整,本節就對這些調整一一做一下簡單介紹。
本節適合有 Python 基礎的學員閱讀,初學者可先跳過本節,整體學完 Python 之后,再回過頭來閱讀。
Python 3.x print函數代替了print語句
在 Python2.x 中,輸出數據使用的是 Print 語句,例如:
>>> print “3,4”
3,4
或者
>>> print(3,4)
(3,4)
但是在 Python 3.x 中,print 語句沒有了,取而代之的是 print 函數,例如:
>>> print(3,4)
3 4
如果還像 Python 2.x 中那樣使用 print 語句,Python 編譯器就會報錯,例如:
>>> print “3,4”
File “”, line 1
print “3,4”
^
SyntaxError: Missing parentheses in call to ‘print’
Python 3.x 默認使用 UTF-8 編碼
相比 Python 2.x 默認采用的 ASCII 編碼,Python 3.x 默認使用 UTF-8 編碼,可以很好地支持中文或其它非英文字符。
例如,輸出一句中文,使用 Python 2.x 和 Python 3.x 的區別如下:
#Python 2.x
>>>str =“C語言中文網”
>>>str
‘C\xe8\xaf\xad\xe8\xa8\x80\xe4\xb8\xad\xe6\x96\x87\xe7\xbd\x91’
#Python 3.x
>>>str =“C語言中文網”
>>>str
‘C語言中文網’
不僅如此,在 Python 3.x 中,下面的代碼也是合法的:
>>>中國=“China”
>>>print(中國)
China
Python 3.x 除法運算
和其他語言相比,Python 的除法運算要高端很多,它的除法運算包含 2 個運算符,分別是 / 和 //,這 2 個運算符在 Python 2.x 和 Python 3.x 的使用方法如下:
/ 運算符
在 Python 2.x 中,使用運算符 / 進行除法運算的方式和 Java、C 語言類似,整數相除的結果仍是一個整數,浮點數除法會保留小數點部分,例如:
>>>1/2
0
>>>1.0/2
0.5
但是在 Python 3.x 中使用 / 運算符,整數之間做除法運算,結果也會是浮點數。例如:
>>>1/2
0.5
運算符 //
使用運算符 // 進行的除法運算叫做 floor 除法,也就是輸出不大于結果值的一個最大的整數(向下取整)。此運算符的用法在 Python 2.x 和Python 3.x 中是一樣的,舉個例子:
#Python 2.x
>>> -1//2
-1
#Python 3.x
>>> -1//2
-1
Python 3.x 異常
在 Python 3.x 版本中,異常處理改變的地方主要在以下幾個方面:
有關 Python 2.x 版本和 Python 3.x 版本處理異常的示例代碼如下所示:
#Python 2.x
>>> try:
… raise TypeError,“類型錯誤”
… except TypeError,err:
… print err.message
…
類型錯誤
#Python 3.x
>>> try:
… raise TypeError(“類型錯誤”)
… except TypeError as err:
… print(err)
…
類型錯誤
Python 3.x 八進制字面量表示
在 Python 3.x 中,表示八進制字面量的方式只有一種,并且必須寫成“0o1000”這樣的方式,原來“01000”的方式不能使用了。舉個例子:
#Python 2.x
>>> 0o1000
512
>>> 01000
512
#Python 3.x
>>> 01000
File “”, line 1
01000
^
SyntaxError: invalid token
>>> 0o1000
512
Python 3.x 不等于運算符
Python 2.x 中的不等于運算符有 2 種寫法,分別為 != 和 <>,但在 Python 3.x 中去掉了 <>,只有 != 這一種寫法,例如:
#Python 2.x
>>> 1!=2
True
>>> 1<>2
True
#Python 3.x
>>> 1!=2
True
>>> 1<>2
File “”, line 1
1<>2
^
SyntaxError: invalid syntax
Python 3.x 數據類型
Python 3.x 中對數據類型也做了改動,比如說:
-
Python 3.x 去除了 long 類型,現在只有一種整形 int,但它的行為就像是 Python 2.x 版本中的 long。
-
Python 3.x 新增了 bytes 類型,對應 Python 2.x 版本的八位串,定義 bytes 字面量的方法如下所示:
>>>b=b’China’
>>>type(b)
<type ‘bytes’>字符串對象和 bytes 對象可以使用 .encode() 或者 .decode()方法相互轉化,例如:
>>>s=b.decode()
>>>s
‘China’
>>>b1=s.encode()
>>>b1
b’China’ -
Python 3.x 中,字典的 keys()、items() 和 values() 方法用返回迭代器,且之前的 iterkeys() 等函數都被廢棄。同時去掉的還有 dict.has_key(),改為用 in 替代。
本節所介紹的只是 Python 3.x 的一部分改動,由于篇幅有限,這里不再具體指出,教程中涉及到時再給大家詳細介紹。
Python 2.x和Python 3.x,初學者應如何選擇?
Python 自發布以來,主要有 3 個版本,分別是:
3 個版本中,Python 3.0 是一次重大的升級,為了避免引入歷史包袱,Python 3.0 沒有考慮與 Python 2.x 的兼容,這也就導致很長時間以來,Python 2.x 的用戶不愿意升級到 Python 3.0。
除此之外,造成目前這種狀況的另一個原因是,將現有應用從 Python 2.x 遷移到 Python 3.x 是一項不小的挑戰。雖然有 2to3(后續會介紹)之類的工具可以進行代碼的自動轉換,但無法保證轉換后的代碼 100% 正確。而且,如果不做人工修改的話,轉換后的代碼性能可能還不如轉換前。因此,將現有的復雜代碼庫遷移到 Python 3.x 上可能需要付出巨大的精力和成本,某些公司無法負擔這些成本。
目前,根據統計顯示,使用 Python 2.x 的開發者仍占 63.7%,而Python 3.x 的用戶占 36.3%,由此可見,使用 Python 2.x 的用戶還是占多數。在 2014 年,Python 創始人宣布,將 Python 2.7 支持時間延長到 2020 。
那么,初學者應該選擇什么版本呢?本教程建議大家選擇 Python 3.x 版本,理由有以下幾點:
-
使用 Python 3.x 已經是大勢所趨
目前,雖然使用 Python 2.x 的開發者居多,但使用 Python 3.x 的開發者正在迅速增加,如圖 1 所示:
圖 1 Python 3.x 是大勢所趨另外,根據 PEP-404 這份文檔,Python 2.x 版本將不會再發布 2.8 版本,且未來非常重要的項目(如 Django、Flask 和 Numpy)可能都將放棄對 2.x 的支持,僅支持 Python 3.x。因此,從長遠來看,學習 Python 3.x 只有好處。
本教程也是以 Python 3.x 來介紹 Python 編程,因此,為了同步,強烈建議初學者選擇 Python 3.x。
-
Python 3.x在 Python 2.x 的基礎上做了功能升級
Python 3.x 對 Python 2.x 的標準庫進行了一定程序的重新拆分和整合,比 Python 2.x 更容易理解,特別是在字符編碼方面。Python 2.x 中對于中文字符串的支持性能不夠好,需要編寫單獨的代碼對中文進行處理,否則不能正確顯示中文,而 Python 3.x 已經將該問題成功解決了。 -
Python 3.x 和 Python 2.x 思想基本是共通的
Python 3.x 和 Python 2.x 思想基本上是共通的,只有少量的語法差別,學會的 Python 3.x,只要稍微花點時間學習 Python 2.x 的語法,即可靈活運用這兩個不同版本了。
注意,選擇 Python 3.x 也不是沒有弊端,很多擴展庫的發行總是會滯后于 Python 的發行版本,甚至目前還有很多庫不支持 Python 3.x。
因此,在選擇 Python 時,一定要先考慮清楚自己的學習目的,比如說,打算做哪方面的開發,此方向需要用法哪些擴展庫,以及這些擴展庫支持的最高 Python 版本等,明確這些問題后,再選擇適合自己的版本。
關于 Python 3.x 和 Python 2.x 具體的區別,可閱讀《Python 3 和 Python 2 區別》一節。
Python 2to3:自動將Python 2.x代碼轉換成Python3.x代碼
本節內容針對已有 Python 基礎的學員,初學者可直接跳過本節內容,繼續往下學習。
由于 Python 2.x 和 Python 3.x 的差別較大,因此 Python 2.x 的多數代碼無法直接在 Python 3.x 環境中運行。而由于兼容性的原因,我們在網絡上查找的資源多數是Python 2.x 的代碼,如果想要在 Python 3.x 環境下運行,就需要修改源代碼。
針對這一問題,Python 官方提供了一個將 Python 2.x 代碼自動轉換為 Python 3.x 代碼的小工具,它就是 2to3.py,通過該工具可以將大部分 Python 2.x 代碼轉換為 Python 3.x 代碼。
接下來,就給大家詳細介紹一下,如何使用 2to3.py 將 Python 2.x 代碼轉換成 Python 3.x 代碼。
假設我們現在有 Python 2.x 的代碼,要將其轉換成 Python 3.x 代碼,需要按照一下幾個步驟進行操作:
找到 2to3.py 文件,該文件保存在 Python 安裝路徑下的 “Tools\scripts” 目錄中。比如說,我們將 Python 安裝在了“G:\Python\Python36”目錄中,那么 2to3.py 文件則保存在 “G:\Python\Python36\Tools\scripts ”目錄中,如圖 1 所示:
圖 1 Python 2.x 轉 Python 3.x 的工具
將 2to3.py 文件復制到要轉換代碼所在的目錄中。
打開命令行窗口,并進入要轉換代碼文件所在的目錄。例如,該文件保存在“E:\change”目錄下,則在命令行窗口中可輸入如下命令:
C:\users\Demo>E:
E:>cd change
E:\change>
調用 2to3.py 工具轉化代碼。例如,要轉化的文件名稱為 demo.py 文件,可以使用下面的代碼:
Python 2to3.py -w demo.py
執行此行代碼之后,將會在 “E:\change” 目錄下創建一個 demo.py 文件的備份文件,名稱為 demo.py.bak,同時,原 demo.py 文件的內容被轉換為 Python 3.x 對應的代碼。
注意,在使用 2to3.py 轉換 python 2.x 代碼前,盡量不要把要轉換的代碼保存在 C 盤中,因此如果保存在 C 盤,可能會因權限問題導致轉換不能正常完成。
Python PEP文檔:及時追蹤Python最新變化
通過前面章節對 Python 語言的介紹,到目前為止,Python 已經歷經了 3 個版本的迭代,讀者不禁要問,Python 為什么要不斷的升級呢?作為程序猿的我們,怎樣才能及時了解 Python 的最新變化呢?
首先解決第一個問題,Python 不斷升級的原因很簡單,因為用戶有了更高的需求。人們之所以設計新的編程語言,是因為他們發現現有的語言已經無法以最佳方式來解決問題。此外,Python 的使用范圍越來越廣,人們發現它有許多可以改進的地方,應該做出這樣的改進。
Python 的很多改進都是有特定應用領域的需求驅動的,其中最重要的領域是 Web 開發,這一領域需要 Python 改進對并發的處理。
還有一些是由于 Python 的歷史原因導致的,隨著使用 Python 的不斷深入,發現了 Python 的一些不合理之處。比如,有些是標準庫模塊結構混亂或冗余,有些是程序設計缺陷。
那么,怎樣才能及時追蹤 Python 的更新動態呢?這就需要借助 Python PEP 文檔。
Python PEP文檔
要知道,雖然各種各樣的 Python 語句修改方案會以郵件列表的形式進行討論,但 Python 社區有一種應對變化的固定方法,即只有發布了名為 PEP 的新文檔,新的變化才會生效。
PEP(Python Enhancement Proposal),全稱是 Python 改進方案。它是提交 Python 變化的書面文檔,也是社區對這一變化進行討論的出發點。值得一提得是,PEP 文檔的整個目的,格式以及工作流程的標準格式,都包含 PEP 1 文檔中。
PEP 文檔對 Python 十分重要,它主要有以下 3 個用途:
所有提交過的 PEP 都被匯總在 PEP 0 文檔中。
需要注意的是,如果讀者對 Python 語言的未來發展方向感興趣,但苦于沒有時間追蹤 Python 郵件列表中的討論,那么 PEP 0 是信息來源的不錯選擇,它會告訴你哪些文檔已被接受但尚未實施,哪些文檔仍在審議中。
不僅如此,PEP 還有其他的用途,比如說,人們常常會問以下類似的問題:
- A 功能為什么要以這樣的方式運行?
- Python 為什么沒有 B 功能?
多數情況下,關于該功能的某個 PEP 文檔已經給出了上述問題的詳細回答。
另外,還有關于 Python 語言功能的 PEP 文檔并沒有通過,這些文檔可作為歷史資料來參考。
Python底層是用什么語言實現的?
確切地說,本教程介紹的是用 C 語言編寫實現的 Python,又稱為 CPython。平時我們所討論的 Python,指的其實就是 CPython。
隨著編程語言的不斷發展,Python 的實現方式也發生了變化,除了用 C 語言實現外,Python 還有其他的實現方式。例如,用 Java 語言實現的 Python 稱為 JPython,用 .net 實現的 Python 稱為 IronPython 等等。
Python 的這些實現方式雖然誕生比 CPython 晚,但一直在努力地跟上主流,并在不同的生產環境中不斷地使用并推廣 Python。
Python 的實現方式有很多種,Python 官網上介紹了 20 多種語言變體、方言或 C 語言之外的 Python 解釋器實現。其中一些只是實現了語言核心語法、功能和內置擴展的一個子集,但至少有幾個與 CPython 幾乎完全兼容。更重要的是,在這些不同的實現方式中,雖然有些只是玩具項目或實驗,但大部分都是為了解決某些實際問題而創建的,這些問題要么使用 CPython 無法解決,要么需要開發人員花費巨大的精力,這里舉幾個例子:
- 在嵌入式系統中運行 Python 代碼。
- 與運行框架(如 Java 或 .NET)或其他語言做代碼集成。
- 在 Web 瀏覽器中運行 Python 代碼。
由于受到篇幅的限制,本節僅給大家介紹幾種 Python 開發人員最常用的幾種 Python 實現方式。
Stackless Python
Stackless Python 自稱 Python 增強版。之所以名為 Stackless(無棧),是因為它沒有依賴 C 語言的調用棧,實際上就是對 CPython 做了一些修改,添加了一些新的功能。
在新添加的功能中,最重要就是由解釋器管理的微線程,用來替代依賴系統內核上下文切換和任務調度的普通線程,既輕量化又節約資源。
Stackless Python 最新可用的版本是 2.7.9 和 3.3.5,分別實現的是 Python 2.7 和 3.3。在 Stackless Python 中,所有的額外功能都是內置 stackless 模塊內的框架。
Stackless Python 并不是最有名的 Python 實現,但很值得一提,因為它引入的思想對編程語言社區有很大的影響。例如,將 Stackless Python 中的內核切換功能提取出來并作為一個獨立包發布,名為 greenlet,是許多有用的庫和框架的基礎。
此外,Stackless Python 的大部分功能都在 PyPy 中重新實現,PyPy 是另一個 Python 實現,我們將稍后介紹。
JPython
Jython 是 Python 語言的 Java 實現。它將代碼編譯為 Java 字節代碼,開發人員在 Python 模塊中可以無縫使用 Java 類。
Jython 允許人們在復雜應用系統(例如 J2EE)中使用 Python 作為頂層腳本語言,它還將 Java 應用引入到 Python 中,一個很好的例子就是,在 Python 程序中可以使用 Apache Jackrabbit(這是一個基于 JCR 的文檔倉庫 API)。
Jython 最新可用的版本是 Jython 2.7,對應的是 Python 2.7 版。它宣稱幾乎實現了 Python 所有的核心標準庫,并使用相同的回歸測試套件。Jython 3.x 版正在開發中。
Jython 與 CPython 實現的主要區別如下所示:
- 真正的 Java 垃圾回收,而不是引用計數。
- 沒有全局解釋器鎖(GlobakInterpreter Lock,GIL),在多線程應用中可以充分利用多個內核。
這一語言實現的主要缺點是缺少對 C/Python 擴展 API 的支持,因此用 C 語言編寫的 Python 擴展在 Jython 中無法運行。這種情況未來可能會發生改變,因為 Jython 3.x 計劃支持 C/Python 擴展 API。
某些 Python Web 框架(例如 Pylons)被認為是促進 Jython 的開發,使其可用于 Java 世界。
IronPython
IronPython 將 Python 引入 .NET 框架中,這個項目受到微軟的支持,因為 IronPython 的主要開發人員都在微軟工作。可以這么說,IronPython 是推廣語言的一種重要實現。
除了 Java,.NET社區是最大的開發者社區之一。
值得一提的是,微軟提供了一套免費開發工具,名為 PTVS(Python Tools for Visual Studio,用于Visual Studio 的 Python 工具),可以將 Visual Studio 轉換為成熟的 Python IDE。這是作為 Visual Studio 的插件發布的,在 GitHub 可以找到其開源代碼。
IronPython 最新的穩定版本是 2.7.5,與 Python 2.7 兼容。與 Jython 類似,Python 3.x 的實現也在開發中,但還沒有可用的穩定版本。
雖然 .NET 主要在微軟 Windows 系統上運行,但是 IronPython 也可以在 Mac OS X 和 Linux 系統上運行,這一點要感謝 Mono,一個跨平臺的開源 .NET 實現。
與 CPython 相比,IronPython 的主要區別或優點如下:
- 與 Jython 類似,沒有全局解釋器鎖(Global Interpreter Lock,GIL),在多線程應用中可以充分利用多個內核。
- 用 C# 和其他 .NET 語言編寫的代碼可以輕松集成到 IronPython 中,反之亦然。
- 通過 Silverlight,在所有主流 Web 瀏覽器中都可以運行。
說到弱點,IronPython 也與 Jython 非常類似,因為它也不支持 C/Python 擴展 API。對于想要使用主要基于 C 擴展的 Python 包(例如 NumPy)的開發人員來說,這一點很重要。
有一個叫作 ironclad 的項目,其目的是在 IronPython 中無縫使用這些擴展,其最新支持的版本是2.6,開發已經停止。
PyPy
PyPy 可能是最令人興奮的 Python 實現,因為其目標就是將 Python 重寫為 Python。在 PyPy 中,Python 解釋器本身是用 Python 編寫的。
在 Python 的 CPython 實現中,有一個 C 代碼層來實現具體細節。但在 PyPy 實現中,這個 C 代碼層用 Python 完全重寫。這樣,你可以在代碼運行期間改變解釋器的行為,并實現 CPython 難以實現的代碼模式。
目前 PyPy 的目的是與 Python 2.7 完全兼容,而 PyPy3 則與 Python 3.2.5 版兼容。
以前對 PyPy 感興趣主要是理論上的原因,只有喜歡深入鉆研語言細節的人才會對它感興趣。PyPy 通常不用于生產環境,但這些年來這種狀況己經發生改變,PyPy 通常比 CPython 實現要快得多。基于這一特性,使得越來越多的開發人員決定在生產環境中切換到 PyPy。
PyPy 與 CPython 實現的主要區別在于以下幾個方面:
- 使用垃圾回收,而不是引用計數。
- 集成跟蹤 JIT 編譯器,可以顯著提高性能。
- 借鑒 Stackless Python 在應用層的無棧特性。
與幾乎所有其他的 Python 實現類似,PyPy 也缺乏對 C/Python 擴展 API 的完全官方支持。但它至少通過 CPyExt 子系統為 C 擴展提供了某種程度的支持,雖然文檔不完整,功能也尚未完善。此外,社區正在努力將 NumPy 遷移到 PyPy 中,因為這是最需要的功能。
了解Jupyter Notebook,你已然超越了90%的Python程序員
在 2019年 8 月份 TOIBE 編程語言社區公布的編程語言排行榜中,Python 已經超過了 C++,穩居排行榜第 3 名(如圖 1 所示)。
圖 1 TOIBE 編程社區排行榜
我們應該知道,Python 之所有在 14 年后“崛起”,得益于機器學習和數學統計應用的興起。至于 Python 適合數學統計和機器學習的原因,很多讀者可能并不會想到,Jupyter Notebook 功不可沒。可以好不夸張地說,作為一名 Python 工程師,如果不會使用 Jupyter Notebook,可能會真的太落伍了。
本節,就帶領大家學習一下 Jupyter Notebook。
什么是Jupyter Notebook
說了這么多,到底什么是 Jupyter Notebook 呢?按照 Jupyter 創始人的說法,起初他是想做一個綜合 Ju(Julia)、Py(Python)和 R 三種科學運行語言的計算工具平臺,所以將其命名為 Jupyter。
Jupyter 發展到現在,已經成為了一個幾乎支持所有語言,能夠把軟件代碼、計算輸出、解釋文檔、多媒體資源整合在一起的多功能科學運行平臺。Jupyter Notebook 的工作界面如圖 2 所示。
圖 2 Jupyter Notebook界面(點此查看高清大圖)
如圖 2 所示,只要直接輸入代碼并運行,它就會直接在代碼下面顯示輸出結果。那么,Jupyter Notebook 對 Python 的影響真的有那么大嗎?
Jupyter Notebook的影響力
衡量一個技術的影響力,或者說想利用自己的技術影響世界時,必定繞不開技術對教育界的影響力。
以微軟的 Word 文本處理系統為例,從純技術角度來講,它的單機設計理念早已過時,但以 Google Doc 為代表的在線文檔系統,并沒有想象中實現對 Word 的降維打擊。最直接的原因歸咎于用戶習慣,多數用戶已經習慣使用 Word 來編輯、修改文檔啦,之所以會這樣,是因為我們從小學、中學,一直到大學期間,都在學習使用 Word。而且到了工作中,老員工還會帶著新員工繼續使用 Word。
從 2017 年開始,已經有大量的北美頂尖計算機課程開始使用 Jupyter Notebook 作為教學工具,而在這之前,一直使用的都是 Python 命令行的形式。不僅如此,Jupyter Notebook 在工業界的影響力更大。
例如,在 Facebook 中,幾乎所有的中小型程序(比如內部的線下分析軟件,機器學習模塊的訓練等)都是借助與Jupyter Notebook完成。同時,在硅谷其他的一線大廠中,也全部使用 Jupyter Notebook(他們用的是改進定制型的Jupyter Notebook,名稱 Google Colab)。
了解了以上這些,相信你已經認可了 Jupyter Notebook 的江湖地位。
但需要注意的是,不是說那個技術流行,就盲目跟從。對于技術的選擇,要學習獨立的思考,切勿人云亦云。以 Facebook 為例,之所以它選擇 Jupyter Notebook 等技術,很大程序上因為它有幾百個產品線,幾萬個工程師,而如果是幾個人的團隊,使用同樣的技術反倒成了拖累。
Jupyter Notebook的優勢
這里給大家總結了幾點 Jupyter Notebook 的優勢:
1) 整合了所有資源
在軟件開發過程中,頻繁地進行上下文切換,會影響生產效率。舉個例子,假設你需要切換窗口去看一些文檔,再切換窗口去用另一個工具畫圖,不斷地切換窗口就會成為影響效率的因素。
而 Jupyter Notebook 則不同,它會將所有和軟件編寫的資源全部放在一個地方,無需切換窗口就可以輕松找到。
2) 交互性編程體驗
在機器學習和數據統計領域,Python 編程的實驗性特別強,比如為了測試 100 種不同的方法,有時就需要將一小塊代碼重寫 100 遍,在這種情況下,如果使用傳統的 Python 開發流程,每一次測試都要將所有代碼重新跑一遍,會花費開發者很多時間。
Jupyter Notebook 引進了 Cell 的概念。每次測試可以只跑一小塊的代碼,并且在代碼下方立刻就能看到運行結果。
如此強的交互性,滿足了 Python 程序員可以專注于問題本身,不會被頻繁的工具鏈拖累,也不用在命令行之間來回切換,所有工作都能在 Jupyter Notebook 上完成。
3) 輕松運行他人編寫的代碼
同樣是在機器學習和數學統計領域,我們可能會借鑒他人分享的代碼,但當我們拷貝過來想要運行時,卻需要使用 pip 安裝一大堆依賴的庫,足以讓人抓狂。而 Jupyter Notebook 就可以解決這個問題。
例如,Jupyter 官方的 Binder 平臺以及 Google 提供的 Google Colab 環境,它們可以讓 Jupyter Notebook 變得和 Google Doc 在線文檔一樣。比如用 Binder 打開一份 GitHub 上的 Jupyter Notebook 時,就不需要安裝任何 Python 庫,直接在打開代碼就能運行。
本節,僅是為了讓初學者對 Jupyter Notebook 有一個初步的了解,具體 Jupyter Notebook 的安裝和使用,網絡上有很多詳細的教程,這里不再做過多描述。
注意,本教程仍舊使用 Python 內置的 IDLE 作為教學工具。
總結
以上是生活随笔為你收集整理的【Python学习教程】Python编程基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ckfinder php,php,ckf
- 下一篇: android dropbox切换账户,