如何系統化學Python?

如何學Python?

很多人問過我“怎麼開始學Python?”,“Python是什麼”,“Python已經學了基礎,如果進階”。所以我打算整理一下我認爲不錯的學習資料,以後如果有人問我這些問題,就可以直接給他們推薦這個頁面了。

本文檔不定期更新。我碰到比較好的資源就會加進來。如果你是一個Python老手,知道一些這個文檔沒有列出的內容,歡迎在下面留言!

0.Python2 還是Python3
Python 3。

Python3版本(例如Python 3.6.4)是不兼容Python2的(最常見的Python2是Pyhton2.7,這是一個“長期支持版本”)這很不常見,因爲一般的軟件都是兼容老版本的。Python之所以兼容舊版本是因爲Python舊版本有很多設計不好的地方,Python社區勇敢地重新設計了這些地方,使Python使用起來更好。但是爲之付出的代價就是Python3代碼無法兼容Pyhton2.但是近幾年很多公司都在積極的向Python3遷移,比如Quora,Instagram。

使用新版本的Python可以體驗Python很多不錯的特性。大多數Python庫都是支持Python3的。

Github上有一份不錯Python3特性教程:arogozhnikov/python3_with_pleasure

1.零基礎
我從來沒有學過編程,該從哪裏開始?

learnxinyminutes.com 是一個快速入門的網站,從域名就可以看出來,在Y分鐘內學會X。其中Python的部分也不錯,可以讓你在5分鐘之內體驗一下Python的語法。
《learn-python3》Jupyter notebook 是一個基於 web 界面的交互解釋器,這個倉庫是一些代碼片段,演示和學習 Python3.通過代碼來學習可能成本更低一些。
《A byte of Python》是一個免費的在線書,可以下載PDF。適合零基礎的人,從教你安裝Python開始。給你介紹幾本的一些概念,通過代碼學習。
《廖雪峯的Python教程》同樣面向零基礎的讀者。這種教程屏蔽了一些你初學的時候不需要了解的複雜細節,方便入門。但是最好儘早習慣查閱Python的官方文檔。這是解決問題最有效的方法。
學習的時候可以結合 python tutor 這個在線工具,可以將數據結構可視化,容易理解。
字符串格式化是非常常用的操作,這個網站可以讓你在5分鐘內瞭解Python是如何格式化字符串的:https://pyformat.info 。
Python Web 開發指南 可以看下,有一些有價值的筆記和注意事項。
learn-python 用 Python 的 assert 的方式教你學 Python,類似一個 playground,不過需要懂 Python 的assert 和運行測試,也不算 0 基礎吧,不過挺全面的。
2.進階
我已經看完一些基本的入門教程,但是要自己寫程序的時候要是一片空白,接下來該怎麼做?

入門項目
不必擔心,這幾乎是每個人都會經歷的。接下來可以去找一些簡單的編程任務來做,例如在線題目(leetcode支持Python),或者嘗試看一看一些簡單的項目,例如:

howdoi 這是一個簡單的命令行工具,只有一個文件,需要簡單的一點入門知識就可以讀懂。
requests 這是一個 HTTP 請求倉庫,如果要寫爬蟲,幾乎每天都要用它。可以用它來寫一個簡單的爬蟲試試。這個項目的代碼比起第一個稍稍複雜,但是花點時間也能看懂。
pylons 有很多與 web 相關的項目,都比較小巧,適合學習源代碼。
agithub 是一個很簡潔的 REST API 客戶端,之前的版本只有 300 行代碼,大量使用了 getattr 的特性,這個庫的源代碼值得一讀,你會體會到 Python “動態” 的特性。
tinydb 這是用 Python 實現的一個小型的文檔型(NoSQL)數據庫,目前有 2000 行左右的代碼,註釋和文檔也很豐富。核心思想就是用一個 Json 文件來保存數據,類似 SQLite。建議閱讀一下源代碼。
書籍資料
一些讀物,最好對Python稍微瞭解之後再去讀,但是並不要求很高深的知識:

《Python3 cookbook》這本書(其實所有叫 Cookbook 的書都是如此)的形式是:提出一個問題,提出一些問題的解決方案,討論這些方案並延伸。所以對深入 Python 細節來說是不錯的。
《Python的常見陷阱》 中文 En
《Python Guide》主要是介紹 Python 生態,比如說如何組織你的項目,如何使用 logging,如何編寫測試,如何配置 CI/CD,用 Python 寫 GUI 程序有哪些庫可以使用等等,幾乎是必讀的資料。建議新手老手都看一遍,會有很大收穫。
《Learning Python》這本書一直在更新,都已經有第五版了,推薦英文好的同學去讀一讀。此書涉及了很多Python的細節,非常囉嗦。也可以不讀,直接去翻閱文檔。
Python 3 Module of the Week 這個列表介紹了標準庫以及簡單用法,概括。適合快速閱讀,熟悉標準庫。
推薦讀一下 Stack Overflow 關於 Python 問題。打開Python標籤,按照Vote排序,會發現很多不錯的回答。(這個寶貴資源是Risent告訴我的。)
這裏有一份更詳細的 FAQ,值得一讀 http://effbot.org/pyfaq/ 。
啄木鳥社區有很多豐富的資源,上網衝浪!
Python 的官方 itertools 文檔好好看一下,裏面有很多線程的函數,如果有興趣也可以去看一下源代碼。如果你平時不怎麼用這個庫,那麼寫代碼的時候就會多造很多輪子,而且往往有缺陷。
去 Follow 一些不錯的資源,比如:
本博客右側推薦的其他 Python 程序員的博客
Python weekly 每週週報
加入和你相關的郵件列表,看看大家都在討論什麼,推薦加入 python-dev 關注下 Python 語言的發展動態
Python 雙下劃線開頭和結束的方法叫做 “dunder method”,這是 Python 鴨子類型的基礎。仔細讀一下這篇 A Guide to Python’s Magic Methods,遇到了更復雜的問題再去仔細讀文檔。
這裏有一篇 Transforming Code into Beautiful, Idiomatic Python 看一下漂亮、Pythonic 的代碼是怎麼寫的吧。
工具
我已經用Python在寫一個項目了,有什麼建議嗎?

工欲善其事,必先利其器!推薦一下工具:

virtualenv 永遠工作在虛擬環境中!在系統的Python環境中安裝依賴可能會影響系統的穩定性。所以爲每一個項目創建一個虛擬的Python環境是一個最佳實踐!BTW, 依賴管理其實是每一個編程語言要解決的問題,Python 爲什麼有 virtualenv 呢?看一下這篇 How virtual environment libraries work in Python 你就明白啦。
virtualenvwrapper 一個上面工具的封裝,可以讓創建、激活、刪除虛擬環境更加方便。
pipsi 安裝命令行工具的時候,使用pipsi install 而不是 pip install 可以自動爲你要安裝的工具創建一個虛擬環境。這樣你安裝的工具不會產生“依賴黑洞”,並且保持系統Python的清潔。(現在這個項目已經不維護了,推薦使用 pipx )
學會打包Python package併發布到pypi,這裏有一個例子可以參考:setup.py 。現在推薦使用 poetry 來打包了,更簡單易用。
學會使用jupyter和ipython,這兩個工具簡直是神器!
讀一下PEP 8,在自己的編輯器中加入lint檢查,使自己寫出的代碼習慣PEP8.
Python的一個很大的優點就是生態系統非常好,你想要的東西可能早有包來實現了。所以動手之前務必先Google一下有沒有現成的東西。以及,解決問題最好的地方是Python官方文檔,其次是Google、github和stackoverflow,最後是郵件列表和論壇。在網上向別人提問注意禮貌。
3.深入理解
我的主要工作是Python,像深入理解一下Python,尤其是工作中不常用到的東西,例如asyncio,多線程等。

我推薦一些閱讀資料:

《Fluent Python》,中文版《流暢的Python》也不錯。這是我最喜歡的一本Python書!此書基本上是以討論爲主,深入了Python的方方面面。很多地方,比如協程,我看了很多資料都雲裏霧裏,但是這本書一段話讓我大徹大悟!而且此書經常介紹問題的淵源和典故,能瞭解到不少有趣的知識。還提供了很多鏈接,根據此書的指引,還能發現不少好資料。缺點就是在紙質書上印這麼多鏈接有點反人類。
《Python並行編程》這是我正在翻譯的一本書,還沒有完成。這本書介紹了多線程、多進程、異步編程等話題,內容不深,而且都有示例代碼。不過我的翻譯水平有限,如果看到錯誤或者錯字,麻煩告訴我一下。希望能在大年之前完成此書。
《Effective Python》介紹了高質量編寫Python代碼的技巧,值得一讀。
看一看PEP的更新和Python社區的郵件列表,關注Python的發展動向
本博客的側邊欄有一些有關Python的鏈接,例如PyCoders weekly。還有一些Python工程師的博客,值得關注。
當然,我也寫很多Python有關的內容。點擊Python分類。
4.面試的準備
如果你正在找工作,可以看一下這些鏈接,如果這些問題你都理解並知道原理,找個好工作應該不難。

https://github.com/taizilongxu/interview_python
https://mp.weixin.qq.com/s/O47Oa8bAu9kJxYzXJcHuWw
http://www.wklken.me/posts/2015/08/26/python-some-test-questions.html
https://github.com/kenwoodjw/python_interview_question
5.FAQ
1.我在學習機器學習,有必要學習Python嗎?

如果沒有興趣,可以不學。如果要用到numpy和scipy,可以通過它們的文檔來學習。像numpy、scipy、flask、django這些框架,是有自己的一套設計的。你甚至可以理解爲:這些Python是不同的東西。學習numpy(web框架也是)而不學習Python,我認爲是可以的,遇到需要了解的Python有關的問題可以再去學習也不遲。

2.有必要使用Linux嗎?

沒有必要但是推薦使用Linux的命令行。我所有的工作內容都是在終端下完成的,終端相比於IDE更加高效,而且有很多awesome的工具。如果學會使用終端編輯器,你就不必爲每種編程語言找到對應的 IDE 才能寫的順手,你可以用一把錘子敲遍世界上所有的釘子,並且並不是所有的文件編輯都有很好的 IDE 的,比如 Vagrantfile, Dockerfile, nginx.conf, yml, csv 等等,使用終端編輯器的話編輯什麼都不會成爲問題。還有,如果你想使用虛擬機或 VPS 來學習 Nginx 之類的東西,那麼這是沒有 GUI 的,終端編輯器可能是你唯一的選擇。但是你也可以用windows或IDE,這些都不是強制的。但是一定要學會高效的解決自己遇到的問題,以及:瞭解你自己用的工具。比如PyCharm的調試技巧等。

3.爲什麼Python的for循環退出之後還能使用for循環定義的變量?

和其他語言不同,Python的代碼塊是沒有作用域的,try-except代碼塊也沒有。詳見:《談談Python for循環的作用域》

4.爲什麼Python的字符串沒有.length之類的屬性或方法來獲取長度而使用len()函數?

Python很多功能都是通過協議實現的。使用len(str)其實是調用了str.__len__方法。這樣可以在中間做一些其他的處理。例如__getitem__就支持了描述器等特性。詳見:http://lucumr.pocoo.org/2011/7/9/python-and-pola/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章