標籤:

有一定的基礎,如何學python?

各位好,我有一些python基礎了。而且一直在做ruby on rails。但是我不喜歡ruby 因為它太靈活了,還是蠻喜歡python的,只少感覺他比較嚴禁。現在我是html css js都會,用django寫了一個小blog,但是我覺得自己基礎不好,想問下各位的意見,後面我該怎麼學python?


以下內容基於我將近一年的Python學習經驗,如果不足,歡迎給予扶正:

pre入門

Python作為一門「好上手」的編程語言,實在太好入門了,如果有C/C++/Java的經驗,入門那是分分鐘的事情。關於怎麼入門的問題,知乎上已經有太多類似的問題了,而且,Python的wiki上還維護了一個BeginnersGuide頁面,在此不作詳細敘述。

需要達到的目標:

  1. 代碼量5k以上。
  2. 熟悉常用coding convention,實踐過PEP8。
  3. 熟悉Standrad Library(要求不高,會查文檔就行)。

  4. 保持學習熱情。

入門與深入

到這一步,讀者應該對Python有一定程度的了解,至少已經把教材刷過一遍,可以寫一點簡單的代碼,例如在Django框架下寫個小博客什麼的(題主的提問reuse,get!)。在這個時候就應該對官方的document進行一次深入的學習,查缺補漏,追根溯源。以下是我採用的策略:

  1. 快速掃一遍tutorial。如基礎紮實可跳過這一步驟。
  2. 閱讀Language Reference中的Data model。注意了,需要同時閱讀Python 2與3的Data model,以了解2與3的區別。在這一步中需要搞清楚Python Data Model中的細節,如attribute accessing的機制,special method的含義,descriptor的細節,method creating的場景與過程等。需要注意的是,官方文檔中對new-style class的講解可能有點晦澀,如果出現閱讀障礙,可以嘗試閱讀New-style Classes列表中的資料。
  3. 相信有了第2步積累,你對Python中的Object已經有了較為深入的了解。這時候你需要繼續閱讀Language Reference的其餘部分,以對Python的語言的細節進行更加深入的學習。
  4. 回顧Language Reference,把其中出現的PEP documents掃一遍。

完成上面的步驟,基本上就算是入門Python了,在Python的語法層面上應該不會遇到大的問題了,而且遇到問題也至少知道怎麼解決問題了。下面就是大量閱讀Python的相關資源了,以下是我的建議:

  • Python Documentation Index中的Additional documentation小節。
  • Python Cookbook(2rd for Py2 and 3rd for Py3)。

於此同時,代碼量要提上去。給https://pypi.python.org/pypi提交你的Package吧!

研究

  • 研究Python大型開源項目源代碼。
  • 研究CPython的編碼實現,可從Python C API開始。
  • Coding! Coding!

  • ...(不行我已經編不下去了,現在我還處在刷reference/pep doc的階段)

感謝你的閱讀,如有用,請點贊;如無用,請噴之!


《簡明 Python 教程》:簡明 Python 教程

(英文原名為A Byte of Python: https://swaroopch.com/notes/python/)

我實在很難想像有比這本書更合適的入門教程。100頁左右,覆蓋了Python最重要的主線知識點,幾乎沒有一句廢話。

代碼熟練工大約3、4個小時就可以收工,成就感斐然!

(書中末尾給出了深入學習Python的方案,歡迎繼續升級!)

---------------------------------------------------------------------------------------------------------------------------

我自己自學Python的時候走了兩次彎路。

1. Learn Python the Hard Way

2. Dive into Python

第一種方法花費的時間長,成效慢,而且沒有實效性的學習(你只是學了來用啊,不是為了學而學啊)讓人難以堅持。給人的感覺就像是中國農民幾千年的生活和耕作總結出了的經驗,最後發現外國研究者幾個月或幾年的抽象歸納得出了同樣的結論。

第二種方法,Dive into Python是一本好書無須置疑,十分仔細和明了,但壞就壞在太多細節。對於入門者最重要的是一整個框架的知識,然後在不斷實踐中補充細節。就像拿著一本C++ Primer來入門C++我不知道你會有什麼感覺(當然這本書遠沒Primer這麼變態)。

---------------------------------------------------------------------------------------------------------------------------

這是中文翻譯譯者 沈潔元 先生的原話:

Swaroop C. H.的這本書是我學習Python時的第一本教材。

它簡單明晰,可以在最短的時間內把你領進Python的世界。

它不是很長,但是覆蓋了幾乎所有重要的Python知識。在第一次讀本書的時候,我就深切的感到這是給Python初學者的一本極佳教材,應該是每一位Python初學者的第一本教材。

歡迎你加入Python的世界!


本人才疏學淺,學識大多淺嘗輒止,故文章若有錯誤,不論是文字筆誤還是理解有錯,煩請您留言以告知,本人必定感激不盡!

**Python分類下的系列文章,不斷更新中,如果你迫不及待地想要看看寫得如何可以先試試這篇[Python Algorithms - C4 Induction and Recursion and Reduction](http://hujiaweibujidao.github.io/blog/2014/07/01/python-algorithms-induction/),如果覺得好久留言點個讚唄,如果覺得不好那就直接關掉這個博客網站吧,嘿嘿**

**[感謝@Google愛好者給該系列的命名,我很喜歡,叫做「碼農與蛇的故事」]**

1.Python基礎知識篇

[Python Basics](http://hujiaweibujidao.github.io/blog/2014/05/10/python-tips1/) 和 [Python Advances](http://hujiaweibujidao.github.io/blog/2014/05/16/python-tips2/)

前者是Python基礎的簡單總結(大部分摘自[網上恩師@廖雪峰老師的Python教程](http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000)),後者推薦了些關於Python高級特性的好文章(大部分摘自[伯樂在線Python分類的文章](http://blog.jobbole.com/category/python/))

2.Python數據結構篇

數據結構篇主要是閱讀[Problem Solving with Python](http://interactivepython.org/courselib/static/pythonds/index.html) [該網址鏈接可能會比較慢]時寫下的閱讀記錄,當然,也結合了部分[演算法導論](http://en.wikipedia.org/wiki/Introduction_to_Algorithms)中的內容,此外還有不少wikipedia上的內容,所以內容比較多,可能有點雜亂。這部分主要是介紹了如何使用Python實現常用的一些數據結構,例如堆棧、隊列、二叉樹等等,也有Python內置的數據結構性能的分析,同時還包括了搜索和排序(在演算法設計篇中會有更加詳細的介紹)的簡單總結。每篇文章都有實現代碼,內容比較多,簡單演算法一般是大致介紹下思想及演算法流程,複雜的演算法會給出各種圖示和代碼實現詳細介紹。

**這一部分是下面演算法設計篇的前篇,如果數據結構還不錯的可以直接看演算法設計篇,遇到問題可以回來看數據結構篇中的某個具體內容充電一下,我個人認為直接讀演算法設計篇比較好,因為大家時間也都比較寶貴,如果你會來讀這些文章說明你肯定有一定基礎了,後面的演算法設計篇中更多的是思想,這裡更多的是代碼而已,嘿嘿。**

(1)[搜索](http://hujiaweibujidao.github.io/blog/2014/05/07/python-algorithms-search/)

簡述順序查找和二分查找,詳述Hash查找(hash函數的設計以及如何避免衝突)

(2)[排序](http://hujiaweibujidao.github.io/blog/2014/05/07/python-algorithms-sort/)

簡述各種排序演算法的思想以及它的圖示和實現

(3)[數據結構](http://hujiaweibujidao.github.io/blog/2014/05/08/python-algorithms-datastructures/)

簡述Python內置數據結構的性能分析和實現常用的數據結構:棧、隊列和二叉堆

(4)[樹總結](http://hujiaweibujidao.github.io/blog/2014/05/08/python-algorithms-Trees/)

簡述二叉樹,詳述二叉搜索樹和AVL樹的思想和實現

3.Python演算法設計篇

&**近期將會有重要變化,可以暫時不閱讀該系列文章,待更新完畢再讀應該會好些。**

--&>

演算法設計篇主要是閱讀[Python Algorithms: Mastering Basic Algorithms in the Python Language](http://link.springer.com/book/10.1007%2F978-1-4302-3238-4)[**點擊鏈接可進入Springer免費下載原書電子版**]之後寫下的讀書總結,原書大部分內容結合了經典書籍[演算法導論](http://en.wikipedia.org/wiki/Introduction_to_Algorithms),內容更加細緻深入,主要是介紹了各種常用的演算法設計思想,以及如何使用Python高效巧妙地實現這些演算法,這裡有別於前面的數據結構篇,部分演算法例如排序就不會詳細介紹它的實現細節,而是側重於它內在的演算法思想。這部分使用了一些與數據結構有關的第三方模塊,因為這篇的重點是演算法的思想以及實現,所以並沒有去重新實現每個數據結構,但是在介紹演算法的同時會分析Python內置數據結構以及第三方數據結構模塊的優缺點,也就意味著該篇比前面都要難不少,但是我想我的介紹應該還算簡單明了,因為我用的都是比較樸實的語言,並沒有像演算法導論一樣列出一堆性質和定理,主要是對著某個問題一步步思考然後演算法就出來了,嘿嘿,除此之外,裡面還有很多關於python開發的內容,精彩真的不容錯過!

這裡每篇文章都有實現代碼,但是代碼我一般都不會分析,更多地是分析演算法思想,所以內容都比較多,即便如此也沒有包括原書對應章節的所有內容,因為內容實在太豐富了,所以我只是選擇經典的演算法實例來介紹演算法核心思想,除此之外,還有不少內容是原書沒有的,部分是來自演算法導論,部分是來自我自己的感悟,嘻嘻。該篇對於大神們來說是小菜,請一笑而過,對於菜鳥們來說可能有點難啃,所以最適合的是和我水平差不多的,對各個演算法都有所了解但是理解還不算深刻的半桶水的程序猿,嘿嘿。

本篇的順序按照原書[Python Algorithms: Mastering Basic Algorithms in the Python Language](http://link.springer.com/book/10.1007%2F978-1-4302-3238-4)的章節來安排的(章節標題部分相同部分不同喲),為了節省時間以及保持原著的原滋原味,部分內容(一般是比較難以翻譯和理解的內容)直接摘自原著英文內容。

**1.你也許覺得很多內容你都知道嘛,沒有看的必要,其實如果是我的話我也會這麼想,但是如果只是歸納一個演算法有哪些步驟,那這個總結也就沒有意義了,我覺得這個總結的亮點在於想辦法說清楚一個演算法是怎麼想出來的,有哪些需要注意的,如何進行優化的等等,採用問答式的方式讓讀者和我一起來想出某個問題的解,每篇文章之後都還有一兩道小題練手喲**

**2.你也許還會說演算法導論不是既權威又全面么,基本上每個演算法都還有詳細的證明呢,讀演算法導論豈不更好些,當然,你如果想讀演算法導論的話我不攔著你,讀完了感覺自己整個人都不好了別怪小弟沒有提醒你喲,嘻嘻嘻,左一個性質右一個定理實在不適合演算法科普的啦,沒有多少人能夠堅持讀完的。但是碼農與蛇的故事內容不多喲,呵呵呵**

**3.如果你細讀本系列的話我保證你會有不少收穫的,需要看演算法導論哪個部分的地方我會給出提示的,嘿嘿。溫馨提示,前面三節內容都是介紹基礎知識,所以精彩內容從第4節開始喲,么么噠 O(∩_∩)O~**

(1)[Python Algorithms - C1 Introduction](http://hujiaweibujidao.github.io/blog/2014/07/01/python-algorithms-introduction/)

本節主要是對原書中的內容做些簡單介紹,說明演算法的重要性以及各章節的內容概要。

(2)[Python Algorithms - C2 The basics](http://hujiaweibujidao.github.io/blog/2014/07/01/python-algorithms-the-basics/)

**本節主要介紹了三個內容:演算法漸近運行時間的表示方法、六條演算法性能評估的經驗以及Python中樹和圖的實現方式。**

(3)[Python Algorithms - C3 Counting 101](http://hujiaweibujidao.github.io//blog/2014/07/01/python-algorithms-counting-101/)

原書主要介紹了一些基礎數學,例如排列組合以及遞歸循環等,但是本節只重點介紹計算演算法的運行時間的三種方法

(4)[Python Algorithms - C4 Induction and Recursion and Reduction](http://hujiaweibujidao.github.io/blog/2014/07/01/python-algorithms-induction/)

**本節主要介紹演算法設計的三個核心知識:Induction(推導)、Recursion(遞歸)和Reduction(規約),這是原書的重點和難點部分**

(5)[Python Algorithms - C5 Traversal](http://hujiaweibujidao.github.io/blog/2014/07/01/python-algorithms-traversal/)

**本節主要介紹圖的遍歷演算法BFS和DFS,以及對拓撲排序的另一種解法和尋找圖的(強)連通分量的演算法**

(6)[Python Algorithms - C6 Divide and Combine and Conquer](http://hujiaweibujidao.github.io/blog/2014/07/01/python-algorithms-divide-and-combine-and-conquer/)

**本節主要介紹分治法策略,提到了樹形問題的平衡性以及基於分治策略的排序演算法**

(7)[Python Algorithms - C7 Greedy](http://hujiaweibujidao.github.io/blog/2014/07/01/python-algorithms-greedy/)

**本節主要通過幾個例子來介紹貪心策略,主要包括背包問題、哈夫曼編碼和最小生成樹等等**

(8)[Python Algorithms - C8 Dynamic Programming](http://hujiaweibujidao.github.io/blog/2014/07/01/python-algorithms-dynamic-programming/)

**本節主要結合一些經典的動規問題介紹動態規劃的備忘錄法和迭代法這兩種實現方式,並對這兩種方式進行對比**

(9)[Python Algorithms - C9 Graphs](http://hujiaweibujidao.github.io/blog/2014/07/01/python-algorithms-graphs/)

**本節主要介紹圖演算法中的各種最短路徑演算法,從不同的角度揭示它們的內核以及它們的異同**


不得不承認Python還是個小眾的語言,雖然國外應用廣泛,但是國內資料還是比較少,樓主說用Django寫的小Blog是Django by Example里的例子吧!不過一般做完這一個就再也不想看這個教程了,因為這個教程他自己封裝了很多通用視圖,讓本來就很難懂的基於類的視圖更加的抽象了。我覺得官方文檔的例子做完了之後(1.5的中文版是5節,1.6的英文版現在是6節),可以去學習:How to Tango with Django: A Python Django Tutorial這本書。

這本書有3個好處,第一它用一個大的項目實例,使用10個章節講解各個部分,可以充分的讓學習者了解Django開發的每個環節。並且對於官方文檔有大量的引用,可以幫助讀者熟悉官方文檔的結構(我不會說Django官方文檔列印成PDF有1300多頁,而那個官方例子只佔很小的部分~熟悉這些文檔是一個很耗時的工作)。

第二個好處是,這本書視圖部分只適用了基於函數的視圖,以及一些快捷方式(這種項目構建方法也是官方文檔前3節所做的,之後在第四節對項目重構時才使用的通用視圖,從這一點來說,基於類的視圖確實不容易理解。),這種方式對於Django來說更加的底層,可以從代碼上直觀的體現出,視圖部分對於模型數據的處理,以及如何渲染模板,有助於加深理解Django的MTV模式。我在初學時做了兩遍官方範例,看了好些通用視圖模塊才搞清楚通用視圖到底做了什麼。雖然模型也封裝了ORM(對象關係映射),但畢竟我們可以手動查詢資料庫的內容,而且Django還提供QuerySet用來查詢資料庫,相比來說模型的部分不算難理解。通用視圖真是不看源碼還真不好弄懂,所以在初學時先擱置通用視圖,而至使用基於函數的視圖是一種這種的好辦法,等熟悉了視圖的工作原理在重構也不難。

第三個好處是這本書拓展了,Django的功能,比如增加搜索引擎支持,引入bootstrap前端框架,講解jQuery和JAJX,講解South(資料庫遷移),這些東西都是web開發中會遇到的事情,最後書還預告了下一版會增加測試驅動的開發,並且提前給出了主要參考文獻,也指引了讀者繼續學習的方向。

我強烈推薦學習本書,我學過之後受益匪淺,如果對於官方文檔的範例已經很熟悉了,可以跳過前3章,從第四章,甚至第五章開始,會節約一些閱讀時間,雖然數是英文的,但並不算長,我只花了2-3天就讀完了~還做完了裡面的示常式序~


語言只是工具,不是很難的。孰能生巧,建議平時多加練習,重要的是實際項目,在實際項目中鍛煉,這個成長是最快的。

推薦python學習網站:http://www.pythontab.com

python社區: http://bbs.pythontab.com


Python的官方文檔質量非常好。篇幅適中,示例清晰,我覺得Python能被廣泛運用有這一份功勞。所以說想學就看官方文檔好了,看完之後你自己就知道往後怎麼辦了。


多看

看文檔,看源碼

多寫

不斷給你那個小blog加功能,嘗試加各種模塊、插件、工具,不是為了這個blog,而是為了練習


Python的官方文檔質量非常好。篇幅適中,示例清晰,看完之後你自己就知道往後怎麼辦了。Python培訓這裡有教學視頻,推薦一下。


動不動就端上標準庫的源代碼,大家簡直太牛了。我反正是做不到。

支持@張廣怡 提到的《簡明 Python 教程》

此外隆重推薦一個歷史悠遠的python闖關遊戲,the python challenge

The Python Challenge

這是我能說我掌握並且喜歡上了Python的理由。


編程語言或者應用程序都是先全而精,比如 web 程序,全需要你知道前端 html css頁面布局,js交互,後端需要 python(或其他語言) 處理業務邏輯,web通訊處理需要懂得 web伺服器(nigix之類),持久化需要知道 資料庫,會話需要知道http協議等等。然後知道一個應用的全體骨架,再專門去精通某一領域。全的好處在於你未必需要直接用到,但是可以在發生問題的時候利於你定位問題出現的層次。

編程語言也一樣,python可以做很多,web,桌面,數據分析,遊戲等等。學習django的時候,大概是往全的方面,知道了python的用處,下面可以學習如何用好。LZ說的基礎不夠,就那些看官方文檔,熟悉python的基礎數據結構,然後熟悉python的標準模塊。熟悉pythonic的一些用法,列表解析,迭代器,生成器,裝飾器等。

還想深入,就分析 django的源碼,看看大神是如何用python做設計模式,設計一個web框架。還可以看python源碼。

上述所說,未必就能在實踐中完全用到,可是肯定有利於對編程的理解。


邊看書邊練習,應該學得快,推薦一本好書:

Programming Python, 4th Edition Free Download


coding!


既然lz已經有一定使用經驗了,推薦去讀一些標準庫,或者經典的第三方庫的代碼。不過太老的標準庫不建議讀,由於由於開發時語言的一些特性還沒添加,你會發現許多現在看來挺hack的代碼


推薦閱讀:

在 Python 中,為什麼 pow 這樣的函數可以直接調用,而 floor 這樣的函數得先導入模塊?
通俗 Python 設計模式——享元模式
python 用list of lists表示矩陣的問題?
Python進階課程筆記(五)
如何調取或下載數據文件?

TAG:Python |