轉載自ref: http://shell909090.com/blog/2012/11/python%e5%85%a5%e9%97%a8%e6%8c%87%e5%bc%95/
python入門指引
發表於 2012
年 11 月 19 日
前言
其實我也不知道python怎麼入門,由我來寫這個真的不是很合適。我學python是直接找了dive into python來看。然後照著寫了幾個例子。大概兩天后,就能磕磕絆絆的上路了。就好像拿筷子,都不記得怎麼學會的拿筷子,怎麼來教人呢?
不過最近在python-cn的列表裡面,我大概連續數周都持續看到“python入門看哪本教程比較好”,實在是不堪其擾。乾脆就寫個簡單的guide,有心的人自己看。沒心的——那我也沒辦法了。
基本知識
首先,你要瞭解一個事情。很多你不會的東西並不屬於python。例如你不知道網路通訊的流程,你不知道檔案的許可權和開啟標誌用法,你不知道fork和stdin/stdout的關係。這些python教不會你。如果你缺乏這些和語言/庫無關的相關知識,請自行補課。如果你缺乏電腦基礎理論,請自行補課。
因此不要隨便給我發郵件/留言/諮詢,為什麼這個問題在python裡無法解決。為什麼python無法所見即所得 (WYSIWYG),為什麼python無法熱部署,為什麼python無法用於嵌入式開發。在問這個問題之前,請先確認“這是一個python的問題”。例如GIL,或者腦殘lambda。如果你不確定,請自己搜尋一下相關的文章,確認一下。在提問前,看看“提問的智慧”。如果你確實搜過了,找不到,那就問吧,沒辦法。
入門
在網路上,python入門的兩大基礎書籍分別是(後面有朋友補充了一本,我也加上):
- A Byte of Python 中文版
- Dive Into Python 中文版
- Learn Python The Hard Way, 2nd Edition 中文版
後面基本就是看python-doc,我推薦你跳過一堆有的沒的,直接看Library
Reference。python本身就是易讀性極強的代碼,文檔又相當漂亮,內建庫又全。大部分情況下,python-doc都應當能解決你的問題。
web
web是程式員的一大去向。python程式員入門必須要過的一個架構就是django。不要糾結了,django在python社區中名氣太大,用的人太多。因此入門材料是最多的,社區最大,門檻最低。如果你要入門web,必然從django開始。在不熟悉python的情況下,我不推薦你貿然從其他架構開始入門。
當然,如果你已經熟悉python了,考慮入門web架構,可以參考專精一節。
爬蟲
python下說到爬蟲開發,入門首選Scrapy。原因和上面一樣,社區最大,用的人最多。好不好用就見仁見智了。反正我的所有爬蟲架構都是用自己基於gevent寫的庫。
ui
python的ui架構也很多,很複雜。同樣,如果是入門,我建議從qt的兩個架構,pyqt和pyside開始入門。關於這兩家的恩怨我就不多廢話了。
專精
所謂專精,是指使用python在特定工作上。我們基本分為幾個領域。
系統和部署
- virtualenv:基本凡是在商用環境中部署的,建議都用這個。可以將python內建在源碼裡面,避免遷移/整合問題。
- python-daemon:寫daemon的時候比較方便。
網路
說到網路,基本就是除web外。
- twisted:非常強大的網路程式庫,各種協議支援全面,不過reactor模式真是糾結。
- gevent:非同步協程模式的網路程式庫。
- Scapy:強大的網路程式庫,基本啥都能幹。
- pyzmq:我一直不覺得zeromq是一個mq。我覺得他是一個抽象網路層。
web容器
python web架構的一大特點,是容器/架構/ORM/template可以分開自己玩。
注意,容器和架構是兩碼事情。容器是python web啟動並執行環境,架構是解析環境的玩意。兩者間一般都使用wsgi介面進行串連。這是python的標準做法,fastcgi/scgi也會被轉換為wsgi進行串連。但是也不是沒有其他選擇。一般我們有以下模式:
- cgi:python-doc中內建了cgi模組。
- mod_python:embed in apache。
下面是wsgi介面的容器。wsgi的優點在於我們可以在這些容器上運行任意一款支援wsgi的架構。
- flup:支援提供fastcgi, scgi, AJP介面,web server可以用這三種協議進行串連。
- Google App Engine:PaaS服務。
- Gunicorn:直接提供http服務。
- mod_wsgi:使用內部協議和apache整合。
- twisted:直接提供http服務。
- tornado:直接提供http服務。
- uWSGI:使用內部協議和nginx整合。
- werkzeug:直接提供http服務。
建議的部署模式是,用apache的,去mode_wsgi。用nginx的,去uwsgi。用GAE的,直接可用。其他,通通轉寄。
web
你可以參考飛龍的這篇文章,裡面介紹了數種架構。你可以通通玩一下,反正也不麻煩,然後選擇一種最適合自己的玩意。
python中有一種不得不提的玩意就是Zope。這個東西我不知道該如何評價,有興趣的自己看吧。
ORM
ORM:python的ORM系統比較單一,一般都是sqlalchemy。這個架構非常強大,但是很消耗資源。有興趣的可以去官網上自己瞭解。偶爾也見用SQLObject的,不多。
ORM的另一大選擇是ZODB,不過用的比較少。希望瞭解的自己去諮詢老潘。
template
python wiki上有篇文章提到了python template engine的分類和列表。作為專精,我建議你至少玩一下string.Template,webhelpers,mako,jinja2,Genshi這幾個玩意。
爬蟲
關於python爬蟲的進階,就比較不好說。我正在寫一篇長篇blog,介紹python爬蟲的種種。不過至少來說,你需要瞭解以下幾個東西:celery,beautifulsoap,lxml,selenium,phantomjs,pyquery。
ui
gui庫的列表可以看這裡,其中我推薦你看一下玩玩的有:PyGtk,TkInter,WxPython,Glade,pygame。
科學計算
不用廢話,你可以看這篇文檔用Python做科學計算。作者出書了,你可以支援一下。
圖形處理
那必然要提到的就是pil,python imaging library。另一樣要介紹的是pydot,pygraph或者pygraphviz。這不是圖形庫,準確的說,應當是圖論庫。他可以使用graphviz將圖論結構轉換為映像。
文檔
- pygments:格式化代碼的庫,可以將文本代碼格式化為不同格式的,帶顏色的代碼。
- markdown:格式化markdown文檔為html的庫。不過我覺得實現的和標準不一致,沒用。
- reStructured:docutils工具組,可以轉換為多種格式。
- sphinx:同樣是rst的工具,可以產生多種格式。
進階
首先,你應當去看沈遊俠在某次cpug聚會上的講話Python 編程藝術,這是python程式員進階的必讀。不過很可惜,slide是高橋流的,本身不是為了讓你看內容而出的。而當時的演講又沒有錄影(如果有的話,請給我一份拷貝,我會問沈遊俠能不能放出,找空間,搞定相關問題,感謝),因此理解上相當困難。不過這裡的每一句話都相當有道理,是數十年程式經驗的總結。
另外,作為進階,你可以適當的看python3的一些內容。Dive Into Python
3 中文版。還有pypy和cython。
作為python進階人士,你一定要在手頭備一份常用發行的源碼,不要求小版本一致,至少大版本一致(2.7.x,最後一位可以不對齊)。適當的閱讀源碼,尤其是Objects目錄。經常重新閱讀python-doc。