Python入門指引
前言
其實我也不知道python怎么入門,由我來寫這個真的不是很合適。我學python是直接找了dive into python來看。然后照著寫了幾個例子。大概兩天后,就能磕磕絆絆的上路了。就好像拿筷子,都不記得怎么學會的拿筷子,怎么來教人呢?
不過最近在python-cn的列表里面,我大概連續數周都持續看到“python入門看哪本教程比較好”,實在是不堪其擾。干脆就寫個簡單的guide,有心的人自己看。沒心的——那我也沒辦法了。
基本知識
首先,你要了解一個事情。很多你不會的東西并不屬于python。例如你不知道網絡通訊的流程,你不知道文件的權限和打開標志用法,你不知道fork和 stdin/stdout的關系。這些python教不會你。如果你缺乏這些和語言/庫無關的相關知識,請自行補課。如果你缺乏計算機基礎理論,請自行補課。
因此不要隨便給我發郵件/留言/咨詢,為什么這個問題在python里無法解決。為什么python無法所見即所得,為什么python無法熱部署,為什么python無法用于嵌入式開發。在問這個問題之前,請先確認“這是一個python的問題”。例如GIL,或者腦殘lambda。如果你不確定,請自己搜索一下相關的文章,確認一下。在提問前,看看“提問的智慧”。如果你確實搜過了,找不到,那就問吧,沒辦法。
入門
在網絡上,python入門的兩大基礎書籍分別是(后面有朋友補充了一本,我也加上):
后面基本就是看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。