最近,有人在推特上釋出了一份 Python 學習線路圖,其中包含三個部分。
雖然不確定這份列表是否完整,分組是否合理,但覺得其中列舉的主題很全面。
1、基礎知識
首先是變數,不多說了。
其次,我認為運算子、表示式和內建的不可變型別都是基礎知識。int、float、str 和 tuple 與 Python 程式設計的核心概念同等重要。
此外,我認為“迴圈”是一個過於粗獷的叫法,我希望我們不要將 for 和 while 語句統稱為“迴圈”。我認為我們應該稱它們為迭代。二者實現了兩種邏輯量詞“for all”(針對所有的……)和“there exists”(到這裡退出)。我想我們應該談談 for 語句的最終結果:所有該範圍內的值都需要處理。類似地,for-if-break 結構建立了一個”for exists”(遇到……時退出),它定義了滿足條件範圍的第一個值。沒錯,這裡的核心是 range 物件。
我認為這些主題中有太多可以討論的程式設計知識,這些都是基礎知識。
使用變數來管理狀態也是其中的一部分。但是,變數、賦值與狀態的變化是高階話題,可能不屬於基礎知識。
另外,我認為函式定義也是基礎。許多數學知識都是在其他函式的基礎之上定義的函式。這是一種快速掌握複雜概念的方法。即便不知道如何計算平方根的所有細節,也可以使用平方根。
本文開頭的推文中沒有提到各種各樣的賦值語句,包括透過賦值進行集合解構。這個遺漏的內容非常重要。
我同意檔案與 File IO 是基礎知識的一部分。如果僅限於讀寫檔案,那麼檔案本質上就成了不可變的結構。我認為我們可以安全地忽略就地更新檔案的話題,因為這是一個應用方面的話題,而不是有關語言的話題。Python 的檔案操作支援最基本的 seek 和 tell 操作,但僅此而已。大多數現代應用程式都依賴於資料庫來支援可更新檔案。
2、數據結構
資料結構是基礎到中級的知識。我更喜歡建立在語言基礎上的術語“資料結構”。我認為可變的內建資料結構是路線圖中的下一個知識點。我希望略過面向物件或函式式之類的術語,將學習重點放在列表、字典和集合,以及迭代上。這意味著列表解析式和生成器是資料結構這個重要組成的一部分。
列表解析式不是也不應該被當成高階概念。這是一個非常核心的概念。想一想,實現集合的對映/過濾/歸約是大量程式設計的重點。雖然我們不必完全遵循這種方式,但即使是面向初學者的框架也應該呈現這一點。每個程式設計師在學習更簡單的列表解析式時,都要從一大堆 for 和 if 語句和一堆變數入手。無論是哪種方式,本質上都是對映,可以描述為從一個集合到另一個集合的對映。
這就是標準庫 collections 的由來。它是標準庫的一部分。我認為它非常重要,不容忽視。我認為 dataclasses 也很重要。
說起可變資料結構,我們需要回顧 for 語句並在各種可迭代物件上使用它。Python 將概念應用於各種資料型別的方式是該語言的一個重要特徵。
3、函數語言程式設計
在我看來,接下來可以討論一下函數語言程式設計。透過高階函式和裝飾器的函式組合的想法建立在現有的基礎上。此處我們不得不提及 map() 和 filter() 。由於 sorted()、max() 和 min() 等函式都提供了 key= 引數用於處理集合,因此它們都是函數語言程式設計路線圖的一部分。此外,需要注意 map() 和 max() 等函式之間的不一致。
我認為這裡還應該提一下 itertools。它就像 io 一樣也是標準庫的一部分。我認為 itertools 和 functools 與數學模組和集合一樣,是Python 的核心。
我認為 Typing.NamedTuple 和 dataclasses 也屬於函數語言程式設計的話題。不可變的資料類是無狀態的,在建立列表解析式實現從一個集合到另一個集合的對映時會很有幫助。
4、面向物件程式設計
我認為面向物件程式設計及其相關概念建立在上述知識之上。類的定義和狀態管理並不簡單,儘管它們是 Python 的重要組成部分。
從某種程度上說,面向物件程式設計可以分解為兩層:
﹣面向物件基礎:繼承、組合和不同型別的委託。這往往會暴露一些常見的設計模式,例如 Strategy、Decorator 和 Facade。
﹣面向物件特性:超程式設計、裝飾器、ABC、mixin 等。這些話題的設計意圖都是避免跨越類邊界的複雜邊緣情況下的複製和貼上。
5、併發
我不確定為什麼併發和並行線上路圖中是分開的主題。我曾讓人們嘗試以多種方式區分二者,即找到某個“使用非同步實現輕量級併發”的應用場景。
這裡的概念比較模糊,因為執行緒和程序是作業系統特性,而不是語言特性。然而,async/await 語言特性則屬於 Python。當 asyncio 不提供你所需要的實際功能時就會很麻煩。具體來說,阻塞檔案系統 I/O 不是 asyncio 的一部分,需要顯式呼叫底層執行緒池以進行阻塞操作。
從某種程度上說,線路圖應該包含 async/await。然而,如果不解釋執行緒的本質是解決阻塞操作的方法,就很難講清楚這個話題。
6、測試、整合和部署
這些工作需要用到很多工具,比如 pip、unittest、pytest、tox/nox、coverage 等。這些工具屬於語言的一部分?還是更廣泛的生態系統的一部分?
我認為它們並不屬於語言的一部分,線路圖到這裡就結束了。
下面列舉這 100 個小專案,大家可以先收藏,後面按需去查詢原始碼即可。專案連結GitHub:https://github.com/Python-World/python-mini-projects
※※※※※※※※※※※※※※※※※※※※※※※※※※※※
我是「數據分析那些事」。常年分享數據分析乾貨,不定期分享好用的職場技能工具。各位也可以關注我的Facebook,按讚我的臉書並私訊「10」,送你十週入門數據分析電子書唷!期待你與我互動起來~