近年來拜大數據、人工智慧所賜,Python 這門程式語言的能見度得到了驚人的提升。甚至,說誇張一點,光是「寫程式」這件事,其火熱程度就遠遠不是十年前可以比擬,好像不學點程式,在不久的將來就要跟不上時代了?

未來如何發展,我們尚且無法預料。不過,跟風也好,興趣使然也罷,當你起心動念想要開始學程式並主動 Google 搜尋相關資訊後,可能會發現:似乎很多人都推薦初學者從 Python 這門語言開始上手與入門。

所以,Python 真的是程式入門的最佳選擇嗎?

系列:Python 入門三部曲

  1. Python 入門三部曲:系列簡介與導讀(最後發表)
  2. 《精通 Python 第二版》心得:給入門者的 Python 學習藍圖(本文)
  3. 《Python 技術者們 - 練功!》我心中最佳的 Python 入門書(待發表)
  4. 《Python 功力提升的樂趣》Python 專屬的 Clean Code 入門(待發表)

前言:教練,我想學 Python!

對於「Python 適合新手入門」這個論述,我基本表示認同,尤其是對於只想要先一窺程式迷人之處的輕度玩家,確實再適合不過。

理由很簡單,因為學程式畢竟不像打電動,不全然是為了「爽」,辛苦的成份總是少不了,對於不是以寫程式為生的人,很容易放棄。從「有效嘗試」的角度來看,降低阻力、容易上手就變成了不容忽視的考量點。

所以,我認為:如果想要試著接觸程式,感受一下其中的魅力,就先學 Python 吧!學了之後發現興趣有限,投入的成本也通常比其它程式語言更低,堪稱進可攻退可守。

不過,如果是為了轉職而學程式,那要考慮的事情可就太多了——選擇前端、後端、資料科學?後端要選擇哪一門語言?就業市場夠大嗎、工作好找嗎?就很難用一句「你學 Python 就好啦!」輕鬆帶過。 (老實說我不建議學 Python 轉職)

不敗的長青之作

Python 教材百百款,免費的、付費的,應有盡有,這也帶來了一定的選擇困難

在眾多學習材料中,「」原則上還是主流,除了花費的金錢不多,時間成本也相對可控,最重要的是,你可以在書店先翻個夠,再決定要不要買。

而今天要講的《精通 Python:運用簡單的套件進行現代運算》,則無疑是眾多 Python 類書籍中,最最知名的一本。長年穩居 Python 主題中文書銷售排名前五(呃,其實就是第一名啦!),即使在所有電腦、程式類書籍中,也稱得上名列前茅。

2019 年 12 月,原文出了第二版,並在 2020 年有了中譯本,即本文的主角。

如何閱讀這本書?

4 年前的這個時候,我剛接觸程式不久,並開始學習 Python,除了在轉職補習班上課之外,自己也買了《精通 Python》的第一版,在課餘時間閱讀及練習。

然而書翻了又翻,練習也跟著照做了,就是沒有太大的頭緒,總覺得 Python 這東西,好像對我一直都是「身外之物」——沒有太多內化的感覺。

而且現在我知道,那並非是錯覺。

這篇文章就以此為切入點——寫給 4 年前的自己,與剛要起步的你。

如果重新來過,我會怎麼讀?

如果可以和 4 年前的自己交流,從「後見之明」的角度,重新介紹本書的重點與適合的閱讀方式,那麼我會怎麼描述?

換句話說,對於初識 Python、對程式還一知半解的我而言,究竟如何閱讀與「料理」這本書,才能少走一點冤枉路、降低不必要的時間浪費?

本文會給出我的想法與心得。

小結

考慮到可能有不少人正是以本書為學習 Python——甚至是學習程式——的起點,所以本文的前言花了較多時間鋪陳,現在就讓我們進入正題。

本書的輪廓與定位

從原文書名《Introducing Python》可知,這是一本 Python 的入門之作(顯然譯名重新定義了「精通」二字 😆)。但為什麼還是有人——比如 4 年前的我——在看完本書之後,依舊覺得自己「不得其門而入」呢?

我覺得這和翻譯品質、書的內容結構與偏重,以及敘事風格都有一定關係。當然,還有最重要的:學習需要時間沉澱

我們先從本書的內容結構看起,僅僅了解書的內容結構,知曉其中輕重,就能省下不少閱讀心力。

輪廓:目錄與內容結構

打開書的目錄,可以清楚看到書的內容總共分為兩大部分(不包括前言與附錄):

  1. 第一部分:Python 基礎。
  2. 第二部分:Python 應用。

所謂的「Python 基礎」,是指介紹 Python 背景(比如 Python 2 vs 3、歷史發展、安裝環境等)、基本觀念、常用語法,包括內建的資料格式。這些是所有程式語言書籍的標配。

而「Python 應用」的涵蓋範圍則廣得多,包括標準庫的使用、檔案讀取,以及 Python 主要應用領域、工具與相關知識,比如網頁後端、資料科學等,內容可謂包山包海。

兩大部分的篇幅相當,各約佔 300 頁,全書總計超過 600 頁。依 80/20 法則,一本書真正需要細讀的部分,通常只有不到三分之一。

前面提到「了解內容結構就能省下不少閱讀心力」,如果你想在「有限的時間內」獲取本書的最大效益,那我建議只需先熟讀第一部分即可。

定位:一紙 Python 學習藍圖

一樣是入門書,大部分程式類書籍其實主要還是以讓你熟悉語法以及具體實作一些功能為主,這是入門書的基本角色與職責。

但本書的野心不止於此,如前所述,「第二部分」討論了幾乎是 Python 所有常見應用場景及工具,這顯然不是一本書,甚至也不是幾本書可以講得完的,以致於每一個細項都只能淺嘗即止,同時也耗用了大量的幅篇。

換言之,第一部分深一點,第二部分廣一點,就是這本書的寫作方針,在定位上力求深度與廣度兩者兼顧,堪稱一紙 Python 學習藍圖

藍圖的不足

如此規劃是否合適,端視讀者的學習目標與偏好為何,我個人就不太喜歡這樣的做法。我的看法是:對初學者而言,「廣」並不是必要,甚至可能有害

簡單來說,我認為第二部分的篇幅有點太多了,減半可能會更理想。因為每一項都只能蜻蜓點水般介紹,容易讓人感覺零碎與不連貫,同時分散了學習的注意力。

綜上所述,所謂的「藍圖」,受限於頁數與全書定位,就真的只能是粗略的介紹,讓你知道 Python 目前擅長的領域,其中包括但不限於:

  • Web 後端
  • 資料分析、資料工程
  • 爬蟲
  • DevOps

如果看了覺得有趣,那很好,但也不會在本書中得到進一步的答案,就僅止於知道而已——藍圖只能幫你到此。

這本書適合誰?怎麼讀?

前面的描述聽起來褒貶不一,確實如此,但我仍然給予本書高度的評價,理由容後述。

總的來說,我覺得本書適合想要認真入門 Python 的每一個人,只不過在閱讀時需要一些小心思。最簡單暴力的模式就是把 70-80% 精力集中在全書第一部分,學習上會比較聚焦、不易迷失,行有餘力再看第二部分的內容。

上述「簡單暴力」的方式基本夠用,至於要怎麼樣能讀得更好、更深入、更「smart」一點,則須立足於對本書有更多的了解才行。


接下來,我們要對本書內容進行不同維度的剖析與評價,帶你了解書中的特色、有何亮點與缺點,讓你更能知曉力氣要用在哪些地方。

拆解《精通 Python》

在動筆寫這篇書評前,我心中最大的疑問就是:「這本書的經典之處究竟為何?為什麼它可以如此暢銷,地位屹立不搖?它的內容含金量真的配得起它的銷量嗎?」

而我在寫作上的最大挑戰就是:「我能回答上述的問題嗎?」

老實說,我沒有很明確的答案,但已努力接近「真相」,以下就是我探索的成果。

三週目感受

為了寫這篇書評,把本書再看一遍是不可少的,這次應該是第三次(不包括第一版)。複習時間總共花費約 7 小時,其中第一部分就佔了近 5 小時,所以我才如此篤定大部分閱讀精力應該要放在全書第一部分。

一邊看一邊尋找與記錄書中的亮點與特色,順便複習 Python,畢竟我們知道,一門語言的細節實在太多了,很容易忘記。

整體而言,確實有讓我感受到新的啟發,也就是在你提升的同時,書帶給你的收獲也隨之增加——這正是一本好書所必備的特質。書能跟著你一起成長,持續提供養分,直到它的極限。

換句話說,這是一本值得你一看再看的好書,哪怕它只是本入門書。

每一次閱讀可以間隔一些時間,隨著你實力的提升,能夠獲得的啟發也會有所不同,我想這是它作為入門書的經典之處。

敘事風格:對話 vs 演講

再說說敘事風格,這裡我主要指的是「作者的表達口吻」。

為什麼要在一本工具書裡強調敘事風格呢?因為這確實是我買書、挑選書的一大考量點,尤其是工具書!

對話」風格指的是作者在表達時,明顯可以看出是在對著你——也就是讀者——說。作者會推知你可能疑惑之處,並適時提出建設性的自問自答,以增進你的理解。讀這樣的書你會覺得,作為一個讀者,作者在乎你是否真的懂了,而並非只是單方面地把知識全都丟給你。

而「演講」則是作者以自己為主、以傳遞知識或概念為主。讀者是否理解,雖然不能說不重要,但確實不是表述上的重點。

打從以前準備法律類國家考試,必須閱讀大量參考書開始,我能明顯感受到,作為一個以看書為主要學習手段的「自學者」,作者在敘事上是否照顧讀者,會相當程度影響學習的效果,所以我更加偏好「對話」式的敘事口吻

而這本書算是把「對話」做得很到位,這是它第二個經典之處——作者與讀者的對話感極為鮮明

本書亮點

接下來講講我認為本書具體的亮點,或說看點、關注點,建議閱讀的時候可以留意。

為新手連結現實與程式世界

一般程式語言參考書,通常第一章就是講講該語言的歷史發展,接著便開始介紹語法。對於有一點程式底子的人而言,已經足夠,但對於完全的新手,這節奏就有點太快了,思考模式可能還無法順利切換

本書的第一章以「看食譜做料理」來比喻程式執行的步驟,並舉一個 Python 程式為例子,一步一步地拆解程式的行為內容(這時候還不需要真的懂程式碼),讓你可以藉由已經熟悉的事物(食譜),試著去理解、感受還不熟悉的事物(程式),頗為用心。

可以說,作者在第一章就展現了「認真和讀者對話」的誠意。

恰如其分的基本功介紹

內建資料型別與常用方法是每一本語言入門書不可或缺的部分,但呈現上如何拿捏粒度卻不容易——太粗不像入門書,太細則容易失焦。

本書第 2 到 8 章講述 Python 常見的語法、資料類型、流程控制。這些內容網路上搜尋就有,要納入書中,自然需要經過一番取捨,去蕪存菁。

我認為本書確實做到了「詳細但不瑣碎」地介紹 Python 基礎,常用的應該要多介紹,哪怕網路上都有,比如字串與串列的很多方法(method),值得不厭其煩地細講。

儘管 Python 官方文件有著非常完整的資訊,正因為太多太完整,就像字典一樣,所以我們依舊需要作者來幫忙過濾重點,與使用上的注意事項,這不就是買書的作用?

附帶一提,Python 內建資料型別的所有方法,書中當然不可能全部收錄(但也包括大部分了),我自己習慣需要的時候再查就好,最常用的是 W3Schools

最推薦章節:第 9 章〈函式〉、第 10 章〈類別與物件〉

本書的第 9、10 章分別介紹函式物件導向Object-oriented programming),我認為是全書的精華所在,值得一看再看。

函式部分我覺得最精彩的是講 closure(閉包)的小節,儘管閉包在 Python 中的重要性並不如 JavaScript,但能用短短不到 2 頁的幅篇,言簡意賅地介紹這個略為複雜的概念,實在值得喝彩。

物件導向不用說,是學習的一大重心,雖然可能不會立即用上,但對於這個主流語言幾乎都支援的特性,Python 的 OOP 強調易用,卻也未必簡單。本章一貫維持了深度與廣度的良好平衡,廣度上也包括了聚合、組合、Mixin 等等介紹。

有效表達抽象結構與思維

物件導向等抽象概念,對於第一次接觸 Python 的人可能不是非常迫切需要理解的部分,但能用簡單的文字一定程度講清楚這些知識,是賣點所在。

比如提到類別中的靜態方法(static method)時,說道「它只是為了不四處漂流而待在那裡(類別裡)」,我覺得非常一語中的!

會推薦這兩個章節,除了寫得不錯以外,更因為函式與物件導向往往就是一本語法書的決勝所在

畢竟基礎的內建型別與方法,講得好不好,其實差異不大。而抽象概念與抽象思維,往往更加考驗作者的論述功力與表達方式!

一些值得知曉的用法

這部分比較偏細節,可以稍為知道一下,有個印象,往往哪天就用得上:

  • {**a, **b}來結合字典。
  • **給入關鍵字引數,這很常用。
  • 使用*定義純關鍵字引數
  • 使用 tuple 或 list 等序列(sequence)資料作為sort、sorted方法的排序依據,Python 直譯器會先比較第一個元素、第二個元素……以此類推。
  • 以 namedtuple 取代比較輕量的類別使用。

Python 3.7、3.8 限定

同上節,但需要較新版本的 Python 才支援。

3.7 以上:

  • 使用dataclass來簡化定義類別流程,用過的都表示:真香!

3.8 以上:

  • 鼎鼎大名的海象運算符,以語法符號:=型似海象的長牙而聞名,正式名稱為 Assignment Expressions。源自 PEP 572,爭議不小,反正我是用定了!
  • 在 f-string 的{}中使用=可以印出變數值,方便除錯。

本書缺點

說完優點,當然就要來講缺點,或許批評才是我的專長 😎。本書的缺點也不少,尤其有些缺點和前述亮點根本是一體兩面的存在。

翻譯不流暢

第一個問題,就是翻譯品質,只能給個 60 分,剛好及格,遠遠稱不上「流暢」,差不多就是剛好可以看懂的程度。

有些句子讀起來不太通順,明顯可以再優化與調整,雖然可以大概猜到其中的意思,但會一定程度影響閱讀體驗,甚至妨礙理解。

這是電腦、程式類翻譯書普遍有的問題,因為多是業餘翻譯者的作品,所以幾乎不會有「譯者簡介」這種東西,這部分就不過度苛求了。

第二部分造成全書篇幅過於分散

雖然沒有任何一本 Python 入門書會「真的」只講 Python 本身,但本書所涉獵的範圍依舊是所有 Python 入門書中最廣的,包含了許多和 Python 並不直接相關的內容——也就是第二部分中的一些篇章。

好處是讓初學者對於「Python 究竟能做什麼」這個大主題,在心裡有個底,但最終會被我歸類在「缺點」,無疑是我認為這樣的做法基本上是弊大於利

以 Web 後端為例,光 Django 或 Flask 都可以各自寫一本書了。而本書仍耗費數頁的篇幅來介紹如何使用 Flask 建立一個 demo 首頁,在我看來這是標準的「杯水車薪」——立意良善但效果有限。

畢竟「會使用 Flask 建立 demo 首頁」與「能靈活使用 Flask」完全是兩回事,如果只提個大概,或許還不如不提。而以本書的定位註定最多只能提個大概。

第二部分每個章節都不多,但累積起來竟也和第一部分相當,且章節間彼此關係不大,略顯零碎,對新手的學習理解會產生一定壓力,誤以為第一、第二部分是同等重要

總的來說,如前所述,我認為第二部分的幅篇如果減半會更加合宜,全書的內容佔比會更為均衡。在我看來,這不是一本書,而是「1.5」本書。

成也敘事風格,不足之處也是

前面提到,作者的「對話風格」是本書的一大特色,但有些抽象概念的表述未免太過於繞圈子,猶如舞台劇演出,算是這種風格的雙面刃——畫虎不成反類犬。

講故事、打比方,而非平鋪直述,很多時候能帶給讀者「情境先行」的熟悉與代入感。做得好,可以增進理解,收畫龍點睛之效。例如前面說的,以食譜來比喻程式。

但也可能因為翻譯不到位或讀者對書中的比喻、舉的例子、表達的方式缺乏共鳴,反而讓人不知所謂,還不如開門見山,直接給出一個定義來得簡單有力。

所以當你看到某處,發現作者講了半天而你還是不太明白他究竟在說什麼的時候,相信自己,未必是你的問題。

閱讀本書的「推薦姿勢」整理

看完上述優、缺點分析後,我個人推薦本書的閱讀模式如下:

  • 第一次讀,把 8 成的時間、精力集中在第一部分,較符合 80/20 法則。
  • 第一次讀,第 2-8 章最重要,因為首要的任務是熟悉語法,第一部分其餘章節盡可能理解,但不用勉強,讀第二次就會有感了。
  • 第二次讀,熟悉了基礎語法,再集中火力到全書最精華的第 9-10 章,了解函式與類別、物件等抽象思維,體會程式的結構之美。不用說,第 9-10 章值得一看再看。
  • 第二部分與 Python 較直接相關的章節為第 12-15、19 章,建議優先閱讀。
  • 第二部分的其餘章節,即有關 Python 應用領域的章節,只挑自己有興趣的部分細讀即可,沒興趣的部分可以直接略過。

結語:一個好的開始

《精通 Python》可能不是我心中最好的 Python 入門書,但仍不失為一本經典之作。在我看來,它完全對得起這長青的銷量與地位。

只不過,初學者如果要使用它作為入門 Python 的學習材料,就不得不對這份材料有一定的理解,否則可能容易迷失,從而感受不到它的魅力所在。

最後想說,縱使本書寫得再好,它也只是一個開端,最多能助你順利起航。而技藝的精進,還需要不斷地反省與自我要求,但願有一天我們都能真的——精通 Python。