[深度書評] 洪維恩:「Python 教學手冊」(旗標科技,2022)

評分:4.5 分,滿分為 5。
  • 作者:洪維恩
  • 出版社:旗標科技
  • 出版日期:2022-05-04
  • ISBN:9789863126881
  • 售價:NT$650
  • 書籍連結旗標科技博客來
  • 書籍種類:自修用書籍
  • 適合讀者:沒有程式經驗,想自學 Python 的人

這應該是最近我能找到、最適合自修 Python 的參考書籍了!

紀俊男老師 ★ 4.5 顆星評價

Python 已經成了近年來,開發「人工智慧」與「資料科學」相關程式的最佳語言。也因此,不少朋友詢問:「可不可以推薦一本 Python 自學的書籍?」

這個問題,若早個一兩個月問我,我勉強可以從口袋書單中,挑個一兩本推薦。說「勉強」的原因,是因為在洪維恩老師這本「Python 教學手冊」推出之前,我找不太到給初學者「剛好夠用」的自學書籍。不是內容太強調「初學」,砍掉一些進階主題(如:物件導向),營造 Python 好簡單的印象後,再讓你於實作時遭遇那些應學未學的技巧,進而心灰意冷,發誓不再碰程式設計。要不然就是「包山包海」,內容厚到可以用來應付闖空門的小偷,或是擋住點 33 口徑的子彈(最後一句是開玩笑的)。

但這本「Python 教學手冊」,是我到目前為止認為同時擁有「涵蓋主題剛好」、「章節排列順序恰當」、「範例與配圖份量適當」等特色於一身的書籍。於是就興起幫這本書寫評論的想法,也藉機推薦這本書給同學們。

第一印象:該買回家嗎?

我決定要不要買下一本書,有個人的一套準則。我會透過翻閱封面、封底、序言、目錄,先想像這本書「應該講什麼」,然後隨便挑個幾章內容,快速翻閱,以驗證這本書是否「真的講了什麼」。如果兩者吻合,十之八九我就會把這本書買回家。

看完封面、封底、序言、目錄後,我整理出這本書的意圖、並與目錄對照的結果如下:

  • 免安裝環境,打開瀏覽器就能寫:看來會介紹一款雲端開發環境,可讓同學免除安裝與設定之苦。看完目錄後,發現講師好像要用 Google Colab,做為主要開發環境。這一套不錯!真的是瀏覽器打開,什麼東西都不用裝就可以寫程式。若全書都以 Colab 為開發環境,的確可以免除初學者在軟體安裝與設定上可能遇到的困難。此外,看目錄還發現作者介紹了 Jupyter Lab 這套外觀與 Google Colab 相仿、但卻可以跑在本地端的開發環境。滿足了一些想獲得 Colab 好處、但不想在雲端執行軟體的工程師。
  • 大量簡明範例、大量習題驗證:身為講師,我蠻歡迎這種有大量範例與習題的書的。範例、習題多,也的確可以幫助初學者增加程式寫作的熟練度。
  • 資料科學、影像處理,奠定 AI 基礎:看起來會介紹 AI 所需的一些相關套件。翻看目錄,發現作者指的應該是 NumPy(矩陣運算)、Matplotlib(統計圖繪製)、Pandas(外部資料抓取)、SKImage(影像處理)這幾個套件。NumPy、Matplotlib、Pandas 的確是我在教機器學習課程時,必備的三大套件。這本書有提到,那真的是太好了。
  • 數學符號運算,無縫接軌理工數學課程:剛看封面這幾個字,不太了解作者指什麼。所以我翻到目錄,發現他指的是會介紹 SymPy 這個套件。這個套件很讚!用它來解方程式或做微積分簡直是神兵利器。很少看到有入門書介紹這個套件,我蠻興奮的!

經過這一輪對照,發現作者在封面、封底對這本書的承諾,在目錄都有相對應的章節實現。所以「封面與內容不符」這個我從國高中時代以來、最痛恨的疑慮(男性紳士們應該都懂得…開個玩笑),是不會發生的。此時我對這本書的好感,頓時上升了不少。

接著我簡單翻閱一下,主要觀察下面幾點:

  • 排版、配圖適當否:還不錯!沒有很擠,也沒故意留空增加頁數。圖片也很好地輔助了文字說明的部分。
  • 大量範例與習題是真的嗎:快速翻動書籍內容,的確有一大堆程式碼映入眼簾。每章結尾,也有十幾題依照小節排列的「習題」。看來所言非虛。
  • 行文流暢否:我很怕那種寫一堆專有名詞卻忘記解釋,或者講一個主題語焉不詳的書。我會故意翻目錄,看看有沒有我不懂的專有名詞。若有,翻到該章節,作者能當場讓我在書局看懂一個名詞是什麼意思,那這點就合格了。這本書很顯然做得不錯!我對 SKImage 這個套件沒有經驗,所以我就翻到第十四章「使用 SKImage 進行圖像處理」。看完,的確讓我當場了解 SKImage 可以做什麼。

看到這裡,我已經二話不說、把信用卡掏出來到櫃臺結帳了。

回家細讀:優點與缺點

優點:文圖夾雜,說明用心

請大家先看下面這張截圖。這是從書中 P. 1-7 截出來的一小段文字:

文中開頭那一句「按下功能表下方的『+ 程式碼』按鈕」,以及最後一句「按下該儲存格右上方的垃圾桶按鈕『🗑 』即可」,這種「文圖夾雜」的寫作風格,是我覺得作者很用心的地方。

讀資訊類文章,尤其是解釋「使用者介面」的操作時,最怕作者描述一大堆文字,但讀者卻得花費大量功夫,猜測文中指稱的「按鈕」或者是「視覺元件」,到底是哪一個。但作者很用心地將圖片夾雜在文字之間,讓一般人閱讀起來,可以不花吹灰之力,就知道作者指的是哪個視覺元件。

寫過一點文章的朋友就知道,這種「文圖夾雜」的寫法,是很花精神的。尤其截下來的圖,要非常注意高度,免得破壞原來的行距,讓有圖片的那一行與其它行距離突然變寬。要長時間維持「文圖夾雜」,且「行距不變」,這是一份需要耐心的工作。作者能全書五百餘頁做到這點,真的不得不為他的細心,豎起大拇指。

優點:程式碼與說明文字編排即時、清楚

一樣請先看我從書中 P. 2-14 節錄下來的圖片:

有些人可能覺得這沒什麼了不起。但若跟其它程式書籍的排版方式對比,這種把說明即時放在右邊,讓讀者升起任何對程式碼的「疑惑」時,馬上用清楚的解說予以「消滅」,是少見而值得鼓勵的做法。

一般作者對這種大量程式碼的說明,大部分是先把程式碼一口氣列出五六十行,然後統一在程式碼下方用文字解釋。好一點的作者,會替程式碼附上「行號」,說明時會用「第 XX 行的程式碼」。糟糕一點的,會連行號都沒附,就自顧自嗨地解釋一大堆。不論哪一種,我都得來回翻動「程式碼」與「解說文字」兩部分。讓我讀了很想摔書。

此外,這種「程式碼」與「解說文字」一左一右的排版難度,其實不低,不信大家可以排看看,然後像作者那樣排個五百頁,看你會不會厭煩。很多作者其實會「偷懶」,用「程式碼註解」的方式,將解說文字一上一下地夾雜在程式碼中間。

拿 Python 來說,註解是以「井字號(#)」開頭。這種做法雖然好排版,把程式碼帶註解直接拷貝貼上就好,但「一下程式碼,一下註解說明」,實在對閱讀與理解,是一種極大的干擾。像本書這樣,程式碼在左,解說在右,又各自向左對齊。想看原始碼就專注看左邊,臨時看不懂某一個指令,就往右邊撇一眼。這種既不妨礙閱讀體驗,又能不需來回翻頁得到解說,真的是很貼心的排版。

優點:使用 Colab 做為開發工具

一般書籍,都會教初學者安裝官方的 IDLE,或者 PyCharm、Anaconda 等開發環境。這些環境雖然功能強大,但根據我的教書經驗,初學者很容易因為忽略一些小細節,導致安裝不順利。又安裝出狀況,除非整台電腦拿給有經驗的人檢查,否則很難透過文字描述,別人就能明白哪裡出問題,以及該如何解決。這會讓初學者在還沒開始寫程式時,就遭遇挫折,導致放棄。

但 Colab 是 Google 提供的雲端開發環境。基本上只要你有 GMail 帳號,打開瀏覽器,不需任何安裝與設定就能使用。用 Colab 做為一整本書的主力開發環境,對於降低初學者遭遇挫折的機率,的確是很聰明的辦法。

更讓我感動的是,作者還怕讀者看文字學 Colab 不耐煩,特別錄製了 36 分鐘的教學影片,放在 YouTube。讓習慣看影片學東西的讀者,也能順利學會 Colab。真的是非常用心:

除此之外,Colab 最令人讚賞的,就是它可以寫出外觀貌似 MS-Word 的文件,然後夾雜在文件字裡行間的程式碼,點一下居然可以執行!不過,要替 Colab 的文字做排版(如:加粗、超連結、標題一~六級…等),得學會另一種稱為 Markdown 的語法。該語法雖然不會太難,不過畢竟也算冷門。所以作者也很用心找到一個網站,可以用最短的時間,讓你學會 Markdown 語法:

Markdown 語法簡介: 使用 Markdown 線上編輯器 MdEditor 來學

這種只要提到一個概念,就負責任地把它解釋清楚。而不是「放生」,讓讀者自行 Google 或產生挫折感,是很令人讚賞的。更不用說還親自下海拍影片,解釋一套軟體該如何使用這樣貼心的舉動了。

不過身為過來人,我也得談一下 Colab 的缺點:

  • 容易養成學生把所有程式碼,通通放在一個檔案中的習慣。不易培養同學將大型程式碼,切分成數個檔案,降低個別複雜度的好習慣。
  • 除錯功能不如 PyCharm、Anaconda 的 Spyder 等本地端開發軟體功能豐富。

但做為初學者的第一個 Python 開發環境,我還是很認可 Colab 的方便性與易用性的。只要大家具備一定程度、感受到「把上千行程式碼擠在一個檔案,一直捲好煩」,或是「好難得知錯誤發生在哪一行」這些缺點時,再動念換成 PyCharm 或是 Spyder 也不會太晚。

優點:介紹實用且稀有的 Python 套件

即便 Python 熟稔如我,仍能從這本書學到新東西。而且經我評估,也很適合初學者學。這種兼顧「稀有」與「實用」的主題,著實令我佩服作者探索新事物,與合理編排到書中,讓初學者也能受益的寫作態度。那兩個讓我驚艷的 Python 套件,就是 SymPy 與 SKImage。

SymPy 是一個「Python 符號運算(Symbolic Mathematics for Python)」套件。它是一個可以讓你用數學上慣用的代數解題風格、手法,直接套用到 Python 程式碼裡的優秀函式庫。

SymPy 不僅可以把數學式表示成漂亮的格式(取自原書 P.13-8 頁):

還可以用 .doit() 函數,馬上求該方程式的解(取自原書 P.13-8 頁):

多項式展開也是小菜一碟(取自原書 P.13-13):

多項式因式分解?沒問題!一個指令幫你做到(取自原書 P.13-14):

聯立方程式求解也是輕輕鬆鬆(取自原書 P.13-18):

其它像求函數的微分、積分、泰勒級數展開、甚至於解微分方程式,都是一個指令辦到(取自原書 P.13-31):

在還沒有購入本書之前,若你想了解一下 SymPy 的威力,可以參考這篇我在網路上找到的介紹文: SymPy:使用 Python 幫你導煩人的數學公式。原文有五頁,別忘了在每一頁下方點擊「繼續閱讀」,免得漏掉精彩內容。相信您看完後,應該就對 SymPy 能做什麼,了然於胸了。

至於 SKImage,是一個能進行「圖像處理」的函式庫。它不但可以讀取/儲存常見的圖檔格式(如: .JPG、.PNG…等),還能對圖片做裁切、縮放、旋轉、銳化、去雜訊…等運作。基本上你想對圖片做的事情,該函式庫都會提供相應的指令,讓你一行就把事情處理妥當。

想快速了解 SKImage 能做哪些事,可以看我幫大家找到的這篇文章:2019 iT 邦幫忙鐵人賽:Machine Learning 學習筆記第十一天:影像處理。應該就能對 SKImage 能做什麼,有一點概念。

總之,能在一本入門書,寫出讓老鳥、菜鳥都享受的主題,我認為是很了不起的事情。

接下來我談談我認為的缺點。其實等一下要講的缺點,都已經逼近「吹毛求疵」的地步了。有些甚至於只有我會在意,一般人根本不會在意的程度。還請各位讀者自行判斷待會兒說的那幾點,對你而言是否能接受。

缺點:索引只有英文,沒有中文

其實這對蠻多人來說,根本不算缺點。事實上,身邊跟我一樣這麼倚賴一本書索引的人,一隻手也數得出來。對我這種「抱著問問題心態看書」、習慣在兩週內看完一本的「速攻型讀者」,沒有索引,等於無法讓我查到想看的關鍵字在哪一頁(參看「我是怎麼看書的,可以看那麼快」一文)。說老實話,很痛苦!

這本書的確有提供索引。但很可惜地,只有英文關鍵字索引,沒有中文關鍵字索引。我知道替一本書編纂索引,是枯燥無聊、吃力不討好的事情。但對看慣英文原文書、缺乏索引就不能用「速攻法」讀書的我,等於斷了我一臂。若我想了解某個主題,無法透過索引,找到特定關鍵字在哪幾頁。我也只好一頁一頁地翻找,喪失我「天下閱讀,唯快不破」的功力。

不過如果您的看書習慣是從第一頁看到最後一頁那種人,那麼你應該不在乎有沒有索引才對。

缺點:某些章節順序,調換一下會比較好

同理,這個缺點算是我吹毛求疵。就像花蓮到台東,我習慣走海線公路,但你走山線公路也不能算錯的那種程度。

  • 第四章「容器資料類別」,與第五章「流程控制」順序調轉一下比較好

我個人認為,「流程控制」裡面講的「分支」、「迴圈」等概念,是比「容器資料類別」講的 list、tuple、set、dict 這些資料結構更為基本。換個說法,一個 Python 課程沒教 list、tuple、set、dict 雖然很可惜,但沒教「分支」、「迴圈」絕對是殺頭大罪(笑)。我個人傾向重要的東西越早講越好,這樣才能把重要的東西,重複用於後面的章節,加深同學們的印象。

況且,list、tuple、set、dict 都有各自的「產生式(Generator)」或「生成式(Comprehension)」語法。不論是「產生式」或「生成式」,都需藉助「迴圈」的概念。理論上,應該「流程控制」先教,讓同學們有迴圈此一重要概念後,然後再講「產生式」或「生成式」,並反覆應用「迴圈」於其上,幫助同學們熟稔才對。

當然,原書那樣的安排方式,初學者也是可以看得懂。我只是站在另一種觀點,認為「容器資料類別」與「流程控制」應該前後調換一下,沒有孰優孰劣之分。

  • 第八章「異常處理」應該排在「檔案處理」前面比較好

第八章依序講了三個主題:「檔案處理」、「異常處理」、以及「模組與套件」。我個人淺見認為,「異常處理」應該排在「檔案處理」前面,可能會比較妥當。

原因是,講「異常處理」時,不需要有「檔案處理」的知識做為基礎。但做「檔案處理」時,卻需要處理大量的「異常(Exception)」。如:檔案不存在、記憶體不足載入檔案全部內容…等。若先講需要處理大量「異常」的檔案處理,之後才講「何謂異常」,感覺怪怪的。所以我才會認為,這兩個小節前後顛倒一下,應該會更好。

當然,您可以完全不同意我這樣的說法。

  • 第八章「模組與套件」建議獨立成一個章節

第八章的最後一個主題,是「模組與套件」。我認為把它獨立成一個章節,然後放在第六章「函數」與第七章「物件導向程式設計」的後面,感覺會比較好。

因為「模組與套件」,是引領初學者,試著將「程式碼通通塞在一個檔案」,往「將程式碼分門別類、切分成數個檔案」這種寫碼習慣轉變的重要里程碑。初學者很容易將程式碼通通塞在一個檔案內,最後造就「一檔數千行,上下捲動眼茫茫」的悲慘下場。最後,程式碼複雜度超過人類極限,這個同學沒習慣將大檔案切成小檔案,以降低各別複雜度。導致他永遠無法「升級」,寫出更複雜的大型程式。這是很可惜的一件事!

但若能把「模組與套件」獨立出來,接在「函數」與「物件導向」章節之後,然後告訴同學:「你看!你寫的函數還有物件,可以儲存在另外的檔案。不僅能降低單檔複雜度,還方便被另一個專案重用喔!」等同學嚐到將程式碼「分而治之」的好處、回不去後,他才能蛻變為參與外界資訊公司時,看到動輒數十萬行、上百個檔案專案,能處變不驚的箇中好手。

再說一次,這邊講的三個所謂的章節順序缺點,純粹相當於花蓮到台東走海線還是山線這般的差異而已,沒有高低優劣之分。請您要拿「缺點」二字鞭我時,鞭小力一點…(笑)。

缺點:參考資料中有失效的超連結

這只能說不是作者的錯。我也常常犯下這種提供了超連結,過一陣子就失效的錯誤。但,既然發現了,我還是提出來,給大家參考。

作者提供了一份「附錄 B 安裝與使用 Jupyter lab」的線上參考資料。其中,在 B.2 小節「建立 Python 的虛擬環境並安裝 Jupyter lab」裡,有個名為「JupyterLab Demo 版,可以在瀏覽器裡運行」的超連結已經失效。若連結還有效,我還蠻有興趣線上玩一下 Jupyter Lab 是什麼感覺的。很可惜連結失效,無法得償所望。

結論:這本書到底好不好

想知道我怎麼替一本書客觀打分數的,可以看這篇文章。我這邊就直接評分。

結構:1 星全拿

  • 標題、前言所承諾提供的知識,是否有好好地回答?→ Yes!
  • 章節安排是否由淺入深?→ Yes!
  • 有無缺少的章節?→ No!章節涵蓋主題程度完整良好!

內容:1 星全拿

  • 文筆清晰否?→ Yes!
  • 段落分明否?→ Yes!
  • 能否確切回答標題所承諾的知識?→ Yes!
  • 錯別字多否?→ No!
  • 翻譯通順否?→ Yes!
  • 對於專有名詞能否適切解釋?→ Yes!
  • 資訊量是否夠深夠豐厚?→ Yes!
  • 範例多否?→ Yes!
  • 能否適切使用「範例」、「隱喻」,讓人容易了解內容?→ Yes!

排版:1 星全拿

  • 是否舒適易讀?→ Yes!
  • 圖文之間會不會太擠?→ No!
  • 字體選用會不會太擠?→ No!
  • 程式碼排版有加行號嗎?是否輕鬆易讀?→ Yes!
  • 會大量留白,有強增頁數、提高售價之嫌嗎?→ No!
  • 會塞太多出版商廣告影響閱讀體驗嗎?→ No!

配圖:1 星全拿

  • 過多或過少?→ 剛好!
  • 能否輔助說明文字?→ Yes!

參考:0.5 顆星(部分達成)

  • 索引 → 有英文索引,但沒有中文索引。
  • 參考書目 → 可惜!沒有。
  • 進階閱讀 → 可惜!沒有。

總結:4.5 顆星好書!極力推薦!

或許您會覺得這麼好的一本書,為什麼沒有 5 顆星?做為一個四十年的書蟲,我不得不說自己對「五顆星」這個榮耀還蠻苛刻的。您也看到我把評分標準,詳細列在上面,盡量不摻雜情感方面的主觀因素來評分。能從我手上拿下 4 顆星,已經是很稀有的書籍了,況且還 4.5 顆星。所以,對於 5 顆星很執著的朋友,我只能說,放小弟一馬吧~(笑)

總之,這是一本想入門 Python 程式設計的初學者,我會極力推薦的好書!

分享與參考

如果你也喜歡像這樣的深度書評,麻煩您幫忙轉發推廣。若能藉由各位的推廣,得到廠商的青睞,將來能接點業配,賺點小錢,那我會更加無後顧之憂地撰寫更多優質內容,提供給各位的!非常感謝!

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料