零基礎入門Python的路徑
總結一下自學Python的路徑。
零基礎入門Python。
下面列出的所有資料中,有一部分是從頭到尾全部讀完的,也有一部分是他人推薦結果學了一部分就學不下去的,但所有的評價全是個人的親身體會,希望能夠給準備入門Python的朋友們一些參考。
推薦下我自己建立的Python學習交流群627044331,這是Python學習交流的地方,不管你是小白還是大牛,小編都歡迎,不定期分享乾貨,包括我整理的一份適合零基礎學習Python的資料和入門教程。
剛開始學習Python的時候,並沒有直接開始找書籍找公開課,而是花了很多時間糾結一個問題,到底該學Python 2還是Python 3?當時糾結的原因無非是Python 2將在2020年就不會被維護了很明顯Python 3才是未來主流,然而市面上大部分關於Python的資料都是基於Python 2的。
但說實話,雖然距現在只過了半年,我認為現在入門的朋友已經完全不需要糾結這個問題了,直接開始Python 3吧,Python 3已經獲得了絕大部分庫的支援,很多原版Python教程也早就已經過渡到Python 3了,只是中文版本的翻譯還會滯後一段時間。
而且Python 2和Python 3在入門級別的區別極其小,如果想兩個版本都瞭解也用不著花很多時間,無非也就是什麼python 3的print不再是語句(statement)而是函式(function)所以要加括號,python 2的兩個整數用除法符號/相除時返回整數除法的結果而python 3返回小數形式的結果等等,
我思來想去還是決定從Python 2開始,選擇的第一個Python學習資料是《Learn Python the Hard Way》(中文譯名:《笨方法學Python》),結果學到第三十章左右的時候看到一篇報道說Instagram已經完成了對Python 3的全部遷移,於是又轉到了Python 3版本的《Learn Python the Hard Way》重新開始學。雖然又一次從頭開始學浪費了一些時間,但這也不算踩過的坑,因為如上所說Python 2和Python 3在入門級別的區別其實只在一些比較小的地方,所以第二次重新入門Python所花的時間比起第一次少了很多。
而《笨方法學Python》這本書非常的神奇,對它的評價很多都是兩極化,喜歡的誇上天,討厭的貶下地,因為它的風格確實和其它程式設計書籍大相徑庭。正常的程式設計書更加註重語法,每一頁的字裡行間都是知識點,而《笨方法學Python》更注重操作,要求讀者照著每一頁的程式碼完整打一遍,然後根據輸出頁面的結果學習語法,可能每一章只能學到四五個新的知識點。
對於完全沒有程式設計經驗的人來說,這本書在第40章之前還是很友好的,因為沒有密密麻麻的知識點看得腦袋疼,減少了很多挫敗感,自己打程式碼然後看著螢幕上的打印出的結果所獲得的成就感也更強。在為零基礎的人建立對程式設計的興趣方面來看,這本書也許比其它程式設計書要好得多。
但是這本書缺點也很明顯,
第一,按照作者的指示用終端得到的打印出的結果來學習的話,學到的部分可能大多都偏向於print相關的知識點,然而對IPython這種互動式的命令系統輸出的結果少了很多瞭解。
第二,每一章涉及的知識點太少,不少初學者應該瞭解的關鍵功能或語法都被一帶而過,結果是這本書我已經讀了一半了,但是對Python語法的瞭解還是非常表面。基礎薄弱和理解不深這個問題在第41章開始OOP的時候終於全面爆發,哼著小曲抖著腿輕輕鬆鬆十分鐘理解整章知識點的日子一去不復返,跟Class抗爭兩天後我在前四十章建立的所有自信都被擊碎。
後來我沒有選擇接著跟這本書死磕下去,於是進度永遠地停在了第41章。現在想來這也算是一個正確的決定,零基礎入門的朋友可以通過這本書的前四十章開啟Python入門之路,雖然能學到的東西比起其它程式設計書來看要少很多,但是對於新手來說,在早期自信心和興趣的建立要重要得多。而且由於作者通篇的講解不多,讀者就被逼著要去做各種搜尋,以真正理解文中提到的語法概念,而搜尋技能的培養,也是對新手來說非常必要的一件事。
官方出版的中文版只更新到了2014年的第三版,語言是Python 2,所以只推薦想學Python 2的朋友去買實體書,
中斷了《笨方法學Python》的學習後,我意識到自己對Python的語法概念還需要加強理解,於是又開始找網上的公開課資源。當時找到了很多人推薦的兩門公開課,edX平臺上MIT的Python基礎課程《MITx: 6.00.1x Introduction to Computer Science and Programming Using Python》,和Harvard的計算機入門課程《CS50: Introduction to Computer Science》,兩門課都針對電腦科學的初學者。我看了一下兩門課的教學大綱後,果斷選擇了MIT的6.00.1x,因為首先CS50用C語言,而且涉及的廣度非常大,還會介紹和了解Python,SQL,JavaScript,CSS和HTML,然而我擔心幾門語言一下子會衝亂我對Python語法的記憶,於是放棄了CS50,導致現在都不瞭解這門課的質量到底如何。不過它在網上的評價非常高,對於想從更廣更遠的角度瞭解電腦科學的朋友,也許這門課可以去試一試
找到MIT的6.00.1x時正好是這門課剛開課的時候,講解語言是Python 3,每週都有很多個5到10分鐘的視訊講解,講解者是MIT的執行校長和電氣工程與計算機科學系主任Eric Grimson,每週視訊的總時長加起來大概兩個小時左右,有中文字幕可以選擇,每個視訊講解後面都會跟一到兩個練習頁面,然後每週都有一個Problem Set要做。
這門課的確是我迄今為止發現的最好的Python入門課程,因為Professor Grimson講解清晰,隨堂PPT列出的知識點也很直觀。即使有些知識點沒有在視訊裡全部帶到,在視訊結束後也會以練習的形式呈現,且練習附上了標準答案。這種通過視訊學習然後立刻用finger exercise進行演練的方式既把概念和語法學的全面,又能立刻讓學這門課的人明白剛剛學到的知識是如何運用的。
而且這門課的進度比起《笨方法學Python》要快得多,具體有多快呢,我在《笨方法學Python》前四十章學到的東西,6.00.1x第一週的視訊裡就全部覆蓋了。再具體一些來說,這門課第一週學迴圈,第二週學遞迴,而多倫多大學的Python入門課程CSC108一個月以後才開始學迴圈,結果還沒有MIT在第一週裡面講解的內容清晰(暗搓搓地黑一波自個兒學校)。
這種進度在一開始可能會讓新手有些不知所措,第一週會比較難熬。但也因為這樣,我才會推薦零基礎的朋友先去把《笨方法學Python》的前40章先看完,這樣至少第一週的皮毛你已經知道了,剩下的時間只用去深入理解教授的講解。而且剛開課的不久就要完成的第一個Problem Set的難度看起來也是有些嚇人,我第一週的時候把那幾道題目盯了兩三個小時,但是依舊一點思路都沒有。因為Problem Set和視訊後面練習的模式不一樣,在截止日期之前是不給標準答案的,於是我迫不得已去搜索答案,在別人的GitHub頁面找到了答案貼上了上去後,又把那幾行程式碼反反覆覆看了十幾遍。茅塞頓開的那一剎那心裡的想法是,原來程式設計不是像《笨方法學Python》那樣一味的print東西,而是像一道數學題一樣解決問題啊。後來第二個Problem Set就能摸出點門道來,把第一個Problem Set收集到的經驗和技巧都用上了,比如可以設立boolean flag,break和continue在什麼時候可以用上之類的,然後後面的Problem Set對我來說也就越來越容易了。
所以給希望修這門課的零基礎的朋友的建議是,先熬過前兩週,後面就會變得容易起來,這真的是一門非常非常值得學習的課程。
寫這個答案的時候這門課已經結課歸檔了,但是仍然可以檢視所有視訊,課後練習也可以提交,系統會自動改分。但是相比起開課的時期,首先歸檔期沒有助教,你可以在每個頁面下面的論壇上檢視先前的學生提出的問題,但是在結課後提出問題的不會有助教來回答。第二個是Problem Set在正式提交區不會被系統批改(因為截止日期已經過了),如果想知道完成的Problem Set是否正確的話可以去課程頁面拉到最下面的Sandbox區,那裡提供過期提交作業的系統批改。第三個是拿不到認證證書,這門課程是免費的,但是如果想拿到認證證書需要在結課前的幾個星期以前交50刀,但歸檔期完成課程也不提供認證證書。想拿證書的朋友可能還是得等待正式開課,可以先放在收藏夾裡時不時點開檢查一下有沒有更新的開課時間。正式開課的話,課程跨度在兩個月左右。
不介意證書的朋友就不需要等正式開課,在歸檔期也可以開始學習。歸檔期的課程材料不會按周進度鎖定,因此不需要按照課程規定的進度,也沒有Problem Set的截止日期。
我在完成6.00.1x後,還想再鞏固一下Python基礎,於是又開始陷入了後續該讀哪本書學哪門課的糾結。想到以前學HTML和CSS的互動式教學網站Codecademy,但是Codecademy的Python沒有更新到Python 3版本(截止至18年1月依舊沒有),而且學完6.00.1x後Codecademy的內容已經過於簡單了。
然後又開始讀不少人推薦的《Python基礎教程》(英文書名:Beginning Python From Novice to Professional)。這本書的中文版只翻譯到了第二版,語言是Python 2,於是去找了英文版的第三版,語言已經更新到了Python 3。
這本書如果不算後面的專案,一共只有三百多頁,但是覆蓋了很多的高階內容,包括了GUI,資料庫,網路程式設計等等。然而我並不想那麼快擴充套件到Python的高階內容,這本書的基礎內容又不夠詳盡,於是又開始找其他資料。
後面又找到了《Python核心程式設計》和《Python Cookbook》。當時在知乎上看到很多人推薦新手讀《Python核心程式設計》,沒怎麼細翻就去書店買了一本回來。買回來後仔細一看目錄傻了,裡面全是Python高階內容,第一章就是正則表示式,第二章是網路程式設計。又回到知乎一查,原來推薦給新手的是第二版,第三版雖然更新到了Python 3,但也移除了所有Python基礎內容。
不過也沒有後悔買這本書,因為日後進階到Python高階內容想學Web開發的時候這本書也許是一個可以選擇的參考資料。
《Python核心程式設計》中文版第三版 Python 3
《Python Cookbook》不是一本針對於Python新手的教程書,但是是一本非常非常好的參考書。擷取一部分目錄如下,可以看到這本書旨在幫助Python程式設計師解決問題,涉及到一些演算法和程式設計技巧,也包含了一些Python高階內容,比如第二章出現的正則表示式。新手可能不太適合通過這本書入門或是鞏固基礎,但是對於有經驗的程式設計師,這本書可以當做問題解決手冊來查閱。
前面一段提到的所有書籍都是自己並沒有從頭到尾讀完的,之所有列出來是希望給那些聽說過這幾本書又不知道該不該購買和學習的朋友提供一些參考。後面自己真正從頭到尾學完(除附錄的高階部分)的一本書是《Python學習手冊》,也就是程式設計師口中的老鼠書(因為封面圖案是隻大老鼠)。
這本書可能是市面上對Python基礎語法講解的最詳盡的一本書,光是使用入門就在第一部分用了八十幾頁來介紹(我讀了十頁後忍無可忍跳過了第一部分)。第二部分的第一章開始粗略介紹Python的物件型別,然後在接下來的幾章中,又各用了完完整整的一個章節去介紹某一物件型別,比如數字,字串,列表和字典,等等。第三部分介紹語法,第四部分函式,第五部分模組,第六部分類和OOP,第七部分異常和工具。這些都是Python的基礎內容,但是作者對於每一個概念都恨不得把官方文件的所有點全部挑出來一個一個講,比如最基礎的列印操作print,作者把print函式所有的可選引數和其預設值全部列了出來,比如可以選擇sep = ...,end = ...,以及如何通過修改file引數的預設值sys.stdout來重新定向輸出流。
而且這本書還相容了Python 2版本和Python 3版本,也就是說作者把Python 2和Python 3在某些部分的差異清楚地列了出來,特別是迭代器在不同版本之間差異。
但是詳盡也意味著:1. 作者有些時候非常囉嗦; 2. 這本書相當相當厚。不包括高階內容的中文版第四版有889頁,不包括高階內容的英文版第五版有1162頁。我當時每天五個小時左右來讀這本書,花了也大概有三個多星期才讀完,而且有些內容在平時程式設計並不常用,讀完就忘了,比如字串格式化的鍵、屬性和偏移量在新增時的具體格式。
但是把這本書完整讀下來的好處也有很多,比如Python有些內建函式所帶引數的預設值雖然在平常一般不會去修改,但至少自己會知道這個引數是存在且可以修改預設值的,在日後程式設計過程中為有些功能的實施帶來了可供選擇的便利方法。而且前一陣在網上看到了一篇Python面試問題總彙,裡面的概念性問題在老鼠書裡基本都有提到,所以如果不是急著進階高階內容且有足夠的時間去慢慢啃基礎的話,這本書依舊值得推薦。
除了上面列出的Python基礎參考資料以外,還建議預備役程式們把英語學好。不用花太多時間去看美劇練口語,只要能把計算機相關的英語詞彙全部熟記且達成無障礙閱讀英文文件的水平就可以。
因為如果英語水平過關的話,首先能讀懂官方文件,其次可以無障礙去stack Overflow搜尋問題,而且可以讀到很多國外計算機大牛的技術部落格。希望英語不會成為大家未來的學習道路中阻礙。
最後總結一下我推薦的零基礎入門Python的路徑:
初探門路- 讀完《笨方法學Python》的前四十章
系統入門 - 完成edX公開課平臺上的6.00.1x Introduction to Computer Science and Programming Using Python
查漏補缺 - 讀完《Learning Python》