標籤:

如何學習 Python,面對那麼多的標準庫,應該如何?


Python標準庫雖多,但不是個個用起來都很爽。

只給一條建議的話就是:如果Python標準庫中明明已經提供一類操作集合的模塊了,而網路上還有一些人推薦第三方庫,別想了,用後者吧。比如(Requests: HTTP for Humans)之於urllib,比如(Arrow: better dates and times for Python)之於datetime。這兩個庫的好用之處就不作介紹了,想藉此機會對Python標準庫吐槽幾句:

在Python2下,最初有個urllib標準庫用來處理從網路上抓取一些數據的工作,但是這個庫太不好用了,例如一次HTTP協議的請求中想自定義請求頭,還得引入另一個模塊httplib,太不人性化。於是有人對它做了些擴展,打包後叫urllib2,還給加到標準庫里去了,但這個urllib2還是有很多地方不是很好用,比如沒有連接池這種東西,做爬蟲那幫人還得自己鼓搗,於是又有人對它做了擴展,打包後叫urllib3,謝天謝地,這次沒加入到標準庫,不過要是Python社區對於這種新納入標準庫的模塊命名不是這麼蛋疼的話,我倒認為urllib3現有的功能需要加入到標準庫中,只有一個urllib多好。幸好,雖然前面說得那個好用的(Requests: HTTP for Humans)也是基於urllib3所做的擴展,但終結了數字尾巴的命名噩夢,要是想想urllib4,就覺得一陣反胃。

還是命名上的吐糟,這次舉個Python3的例子,在Python3里,urllib和urllib2都被合併到了一起,就叫urllib,根據原先兩個模塊所提供的方法工作場景分類,被放入urllib.request、urllib.parse、urllib.error這三個子模塊中,不過之前提到的urllib3中像是連接池這類有用的,還是沒被支持。看上去比Python2中要美好,讓我們看看urllib.request模塊的名字空間吧:

urllib.request.AbstractBasicAuthHandler
urllib.request.AbstractDigestAuthHandler
urllib.request.AbstractHTTPHandler
urllib.request.BaseHandler
urllib.request.addclosehook
urllib.request.addinfourl
urllib.request.build_opener
urllib.request.getproxies
urllib.request.getproxies_environment
urllib.request.getproxies_macosx_sysconf
urllib.request.parse_http_list
urllib.request.parse_keqv_list
urllib.request.pathname2url
urllib.request.posixpath
urllib.request.to_bytes
urllib.request.unquote
urllib.request.unquote_to_bytes
urllib.request.unwrap
urllib.request.url2pathname
urllib.request.urlcleanup
urllib.request.urljoin
urllib.request.urlopen

篇幅原因,我只截取其中一部分,上面那些類名還挺正常,是複合詞就每個單詞首字母大寫,中規中矩。好,那些模塊方法們就開始「各顯神通」了,「addclosehook」明顯是組合到一起的,按照Python命名聖經PEP8的指導,應該是「add_close_hook」,就像下面的「build_opener」那樣,同樣的問題上面列出的還有「getproxies」、「urlcleanup」等等,慢著,「getproxies_enviroment」是怎麼回事?大哥你前面已然黏在一起了,何不來個「getproxiesenviroment」?看來不是一個媽生的。

繼續往下看,「pathname2url」、「url2pathname」、「unquote_to_bytes」,這2還是to,也是醉了。

Python2更惡劣,Python2的urllib模塊有一個toBytes方法,看來是Java開發者貢獻的。此外,你還能在urllib模塊的名字空間中找到c、i這兩個孤零零的模塊常量,值分別是"xff"和255,不清楚什麼用,這種模塊頂級常量好歹取個響噹噹的名字啊!最最惡劣的是,還有一個urllib.test1(),沒錯,也沒提供函數文檔字元串,調用後的返回值我也看不懂,urllib就是這麼稀里糊塗地變成「標準庫」的嗎?

Python2還提供了一個popen2模塊,用來處理子進程,它有popen2.popen2、popen2.popen3、popen2.popen4這麼幾個方法,分別有不同的方法簽名和返回類型,繼續醉,這數字還不跟哪怕它接收的參數個數或者返回元組元素個數聯繫在一起。幸好在Python2下面也有個subprocess模塊可用,而且popen2在Python3中已被刪除。

再說說日期時間模塊,每次敲datetime.datetime.now()麻木習慣後已然不覺傻逼,但是把一個datetime實例轉換成Unix時間戳這麼高頻率的任務還得:

In [17]: from datetime import datetime

In [18]: from time import mktime

In [19]: now = datetime.now()

In [20]: mktime(now.timetuple())
Out[20]: 1421761371.0

有些網上的例子還會使用calendar模塊:

In [23]: import calendar

In [24]: calendar.timegm(now.timetuple())
Out[24]: 1421790171

這裡的返回值是個整數,說好的只用一種方法來完成一件事呢?

吐槽這麼多,再給條建議吧:別把Python標準庫當做聖杯,雖然它是Python獲得Battery-Included稱號的原因,但真用起來,卻是另一番滋味了。用時查閱下手冊,把功能實現,就夠了。


用以致學。


=====2015-1-21更新=======

換了電腦來好好回答一下。剛剛開始學完Python的基礎語法之後也有一些迷茫,不知道該繼續學些什麼,於是在網上看到了Python Challenge這個闖關遊戲,據說是2007年為了推廣Python弄的這樣一個東西。

當時第一次接觸玩了兩關就玩不下去了(那時候編碼能力和學習能力真的是弱的可以)

這段時間又重新找出來做做,發現真的感覺完全不一樣了,它每一關都會用到一兩個甚至更多個Python的標準庫,他會給你一些提示,然後你可以根據提示去Python的官網看看具體庫的用法,然後再開始做。這樣的話就可以達到一個了解和學習Python標準庫的目的。至少下次遇到問題時可以知道用Python的什麼庫來解決。

在我的博客聽雨軒 | You are my convition, but there must be something wrong in my life 里我寫了前19關的解題報告,大家可以參考一下。

在這裡簡單羅列一下每一關用到的庫和Python的知識:

第00關:數字計算。

第01關:string

第02關:re 或者用filter函數也可以

第03關:re

第04關:urllib

第05關:pickle

第06關:zipfile

第07關:PIL

第08關:bz2

第09關:turtle 或PIL

第10關:找規律

第11關:PIL

第12關:文件處理

第13關:xmlrpclib

第14關:PIL

第15關:datetime

第16關:PIL

第17關:urllib urllib2 cookielib xmlrpclib

第18關:difflib binascii

第19關:wave

暫時只做到這裡。。。後面的有機會繼續更新~

=====原答案=====

在網上有一個python challenge的闖關遊戲,一關基本就需要用一到兩個標準庫,然後你可以在實踐中知道這些庫的用法。我最近在做這個。。安利一下我的博客,裡面有自己寫的題解。

聽雨軒 | You are my convition, but there must be something wrong in my life


這時候祭出我的小項目: https://pypi.python.org/pypi/rdir ,合作者 @賴淵

可通過 樹形結構的html、命令行、文件形式來查看python module或 module內object的遞歸結構和文檔(pydoc)。目前僅支持 *nix的python 2.x,windows未測試,若有Windows用戶用過可以反映一下情況,抱歉不會windows。

目前進一步在規劃迭代中,歡迎試用拍磚以及提功能建議。report issues: Issues · Lhfcws/rdir · GitHub

Example: rdir/test.py at master · Lhfcws/rdir · GitHub

下載方式: sudo pip install rdir

================ 廣告時間結束,開始答題。 =======

1. 如何學習python?

我假設你有其他相關語言基礎。找一本如《python基礎教程》這樣的入門書看一遍,下載個ipython(windows實在不行那個IDLE勉強也可以吧)解釋器上跟著教程操作熟悉一下,然後寫個小項目比如多人聊天室。你要能把chatroom努力熬出來了,你已經會用python做簡單的並行、網路通信和各種基本操作了。建議使用linux / MacOSX系統,因為命令行下你可以寫一點小工具進一步去熟悉,其中需要什麼庫你就去搜索看看有沒有。

學會使用 pip 做第三方模塊下載管理。

2. 學習標準庫

不用專門學習,你需要什麼功能就去搜搜人家怎麼用,python很多庫的文檔都不怎麼friendly。也許可能有些實現你不知道有庫,自己寫的很麻煩,但其實無所謂。你能搞出來沒問題那就先用著,等到你知道有更好的實現或者發現問題解決很麻煩感覺要造輪子的時候,請搜索。

* 以上回答不適合較有經驗的程序員。


一個零基礎新手應該如何學習Python

Python 編程語言咋入門,我總是遇見很多人問這個問題,聽很多人說在網上買了一本書,看了一些視頻,但是感覺學的不好,而且進度慢,走了很多彎路。有句話說是方法不對,怎麼努力都白費,今天我就說說自己對python 入門學習方法。

學Python一點都不難,因為Java的難度比他高出很多,我給很多人說過,這個Python的學習步驟,入門大致這樣幾步:

·

· 找一個你覺得適合自己的新手書籍,因為書都是很難看懂的,但是適合自己是可以的。

·

· 找一個有經驗的人帶你學習,如果想自學一門編程語言,可能性很小,而且這種事情盡量不要去做,幾率很小的事情,盡量不要浪費時間。

·

· 一定要有一套系統化的學習規劃,這個狠重要,要知道每天學習什麼,做什麼作業。

下面我具體來講講:

1.找一本適合自己的書,是新手級別的書籍,不能太難,每天學習的東西不要太多,會打亂節奏,學Python要循序漸進,不可以貪多,一上來就學,一定會吃力,時間久了就會沒有興趣,對初學者來說,興趣很重要,有一本適合自己的書很重要。我推薦"A Byte of Python",這本書。

2.有一條系統化的學習課程,如果你身邊有一個Python技術非常好的人就好了,很多小問題都可以解決。因為很多彎路我們是不用走的,別人一句點醒,可能我們自己需要半天的時間,但是這個時間我們不用花。

3.有時間就去都敲代碼,很多人都說這句話,但是這就是學編程的實話。很多會看不會寫,這都是親身經歷的,沒有捷徑,很多人只要看,卻很少去寫,這跟沒學是一樣的,有的有毅力把書的案例都敲了一遍,這是笨的學習方法,但是總比只看不寫強。

學習Python之後可以做什麼工作:

第一:Python web開發

學完Python可以做web開發,因為現在中國學習Python的比較少,而招聘Python的卻非常的多。所以Python web是一個非常的選擇方向。

第二:運維

我現在是知道很多人運維還沒有學習Python,但是Python給運維帶來的價值非常的大,很多時候我都覺得這些還沒有學習Python的人早晚都要被淘汰。

第三:數據分析

現在無論是哪個行業的,做數據分析的人似乎都離不開Python,因為Python給他們帶來的工作效率是非常的大。

第四:自動化測試

一切關於自動化的東西,似乎Python都可以滿足,Python可以滿足大多數自動化工作,提升工作效率。

第五:人工智慧

下個時代就是人工智慧時代,很多人都在關注,而我們的Python同樣可以做人工智慧,這是一個潛力最大的選擇方向,所以學習Python不會錯。

我覺得自己本來就是做Java的,學起來Python是非常的簡單,而且我覺得以後Python會成為排名第一的中國地域語言,無論是哪個方向,Python的潛力都是非常的大。這是我的Python學習裙 2057804860 ,學習Python的可以加群學習,有問題問我,群里也有學習資料分享。


用到哪個學哪個,多翻官方文檔。


推薦閱讀:

Python 在改代碼時怎麼處理縮進問題?
簡歷中如何證明自己的編程能力?
怎樣才能寫出 Pythonic 的代碼?
優化 Python 性能:PyPy、Numba 與 Cython,誰才是目前最優秀的 Python 運算解決方案?
Python 所謂的「閉包」是不是本著故意把人搞暈的態度發明出來的?

TAG:Python |