當前位置:
首頁 > 最新 > 每天讀一本:Python高手之路

每天讀一本:Python高手之路

類的命名採用駱駝命名法,如CamelCase;異常的定義使用Error前綴(如適用的話);函數的命名使用小寫字元,如separated_by_underscores;用下劃線開頭定義私有的屬性或方法,如_private

pylint(https://pypi.python.org/pypi/pylint),它支持PEP 8,默認可以執行更多檢查,並且支持插件。

靜態分析技術,也就是說,解析代碼並分析代碼而無需運行。

第 2 章 模塊和庫

下面是一些必須了解的標準庫模塊:

1、atexit允許註冊在程序退出時調用的函數。

2、argparse提供解析命令行參數的函數。

3、bisect為可排序列表提供二分查找演算法(參見10.3節)。

4、calendar提供一組與日期相關的函數。

5、codecs提供編解碼數據的函數。

6、collections提供一組有用的數據結構。

7、copy提供複製數據的函數。

8、csv提供用於讀寫CSV文件的函數。

9、datetime提供用於處理日期和時間的類。

10、fnmatch提供用於匹配Unix風格文件名模式的函數。

11、glob提供用於匹配Unix風格路徑模式的函數。

12、io提供用於處理I/O流的函數。在Python3中,它還包含StringIO(在Python 2中有同名的模塊),可以像處理文件一樣處理字元串。

13、json提供用來讀寫JSON格式數據的函數。

14、logging提供對Python內置的日誌功能的訪問。

15、multiprocessing可以在應用程序中運行多個子進程,而且提供API讓這些子進程看上去像線程一樣。

16、operator提供實現基本的Python運算符功能的函數,可以使用這些函數而不是自己寫lambda表達式(參見8.3節)。

17、os提供對基本的操作系統函數的訪問。

18、random提供生成偽隨機數的函數。

19、re提供正則表達式功能。

20、select提供對函數select()和poll()的訪問,用於創建事件循環。

21、shutil提供對高級文件處理函數的訪問。

22、signal提供用於處理POSIX信號的函數。

23、tempfile提供用於創建臨時文件和目錄的函數。

24、threading提供對處理高級線程功能的訪問。

25、urllib(以及Python 2.x中的urllib2和urlparse)提供處理和解析URL的函數。

26、uuid可以生成全局唯一標識符(Universally Unique Identifiers,UUID)。

事件驅動的框架,可以使用Twisted或者Circuits等。

將a和b容器串接在一起進行循環操作

for x in itertools.chain(a, b):

第 3 章 文檔

Python中文檔格式的事實標準是reStructuredText,或簡稱reST。它是一種輕量級的標記語言(類似流行的Markdown),在易於計算機處理的同時也便於人類讀寫。Sphinx是處理這一格式最常用的工具,它能讀取reST格式的內容並輸出其他格式的文檔。

第 4 章 分發

簡而言之,setuptools是目前分發庫的主要選擇,如今已經是Python分發工具的事實標準,但在未來要對distlib保持關注

第 5 章 虛擬環境

virtualenv會創建lib/pythonX.Y目錄並利用它自動安裝setuptools和pip

最近,PEP 405定義的虛擬環境機制已經被Python 3.3接受。也就是說,虛擬環境的使用如此流行以至於如今它已經成為Python標準庫的一部分

venv模塊是Python 3.3及以上版本的一部分,可以操作虛擬環境而無需使用virtualenv包或其他包

構建虛擬環境現在變得非常簡單:

$ python3.3 -m venv myvenv

激活虛擬環境的機制同前面描述的一樣,通過執行source命令激活腳本:

$ source myvenv/bin/activate

(myvenv) $

venv模塊的缺點就是它不會默認安裝setuptools和pip

大多數程序都要同時支持Python 2和Python 3,所以完全依賴venv不是最好的選擇。最好的選擇仍然是基於virtualenv

第 6 章 單元測試

測試覆蓋度:coverage模塊

$ nosetests --cover-package=ceilometer --with-coverage tests/test_pipeline.py

tox的目標是自動化和標準化Python中運行測試的方式。基於這一目標,它提供了在一個乾淨的虛擬環境中運行整個測試集的所有功能,並安裝被測試的應用程序以檢查其安裝是否正常

默認情況下,tox可以模擬多種環境:py24、py25、py26、py27、py30、py31、py32、py33、jython和pypy!你甚至可以加入自定義的環境。

第 7 章 方法和裝飾器

裝飾器主要的應用場景是針對多個函數提供在其之前,之後或周圍進行調用的通用代碼。裝飾器本質上就是一個函數,這個函數接收其他函數作為參數,並將其以一個新的修改後的函數進行替換。

第 8 章 函數式編程

Python標準庫中的itertools模塊也提供了一組非常有用的函數,也很有必要記住:

1、chain(*iterables)依次迭代多個iterables但並不會構造包含所有元素的中間列表。

2、combinations(iterable, r)從給定的iterable中生成所有長度為r的組合。

3、compress(data, selectors)對data應用來自selectors的布爾掩碼並從data中返回selectors中對應為真的元素。

4、count(start, step)創建一個無限的值的序列,從start開始,步長為step。

5、cycle(iterable)重複的遍歷iterable中的值。

6、dropwhile(predicate, iterable)過濾iterable中的元素,丟棄符合predicate描述的那些元素。

7、groupby(iterable, keyfunc)根據keyfunc函數返回的結果對元素進行分組並返回一個迭代器。

8、permutations(iterable[, r])返回iterable中r個元素的所有組合。

9、product(*iterables)返回iterables的笛卡兒積的可迭代對象,但不使用嵌套的for循環。

10、takewhile(predicate, iterable)返回滿足predicate條件的iterable中的元素。

這些函數在和operator模塊組合在一起時特別有用。當一起使用時,itertools和operator能夠覆蓋通常程序員依賴lambda表達式的大部分場景

第 9 章 抽象語法樹

抽象語法樹(Abstract Syntax Tree,AST)是任何語言源代碼的抽象結構的樹狀表示

了解Python抽象語法樹的最簡單的方式就是解析一段Python代碼並將其轉儲從而生成抽象語法樹。要做到這一點,Python的ast模塊就可以滿足需要。

>>> import ast

>>> ast.dump(ast.parse("x = 42"))

"Module(body=[Assign(targets=[Name(id="x", ctx=Store())], value=Num(n=42))])"

第 10 章 性能與優化

性能分析工具cProfile

$ python -m cProfile myscript.py

cProfile生成的性能分析數據很容易轉換成一個可以被KCacheGrind讀取的調用樹。cProfile模塊有一個-o選項允許保存性能分析數據,並且pyprof2calltree可以進行格式轉換

$ python -m cProfile -o myscript.cprof myscript.py

$ pyprof2calltree -k -i myscript.cprof

dis模塊是Python位元組碼的反編譯器,用起來也很簡單。dis.dis函數會反編譯作為參數傳入的函數,並列印出這個函數運行的位元組碼指令的清單

>>> import dis

>>> dis.dis(x)

Python提供了一個bisect模塊,其包含了二分查找演算法。bisect函數能夠在保證列表有序的情況下給出要插入的新元素的索引位置。

更多的數據類型,如二叉樹和紅黑樹。Python包blist和bintree就包含了用於這些目的的代碼,不要開發和調試自己的版本。

blist是Python列表的替代品,可在修改大型列表時提供更好的性能。 blist包還提供sortedlist,sortedset,weaksortedlist,weaksortedset,sorteddict和btuple類型。

memory_profiler檢測內存使用情況:

$ python -m memory_profiler object.py

CPython的一個眾所周知的性能瓶頸是全局解釋器鎖(Global Interpreter Lock,GIL)。兩個線程不能在同時執行Python位元組碼。然而,這個限制只在兩個線程執行純Python代碼時有影響。如果大多數處理時間花在函數調用上,並且這些函數釋放了GIL,那麼GIL並非性能瓶頸。例如,大多數I/O函數都會釋放GIL。

multiprocessing模塊可以很容易地用來繞過GIL。另一個稍微複雜的方式是編寫非同步代碼。Twisted、Tornado和Tulip都是利用了這一技術的面向網路的庫(java netty也是事件驅動的)

第 11 章 擴展與架構

因為GIL的問題,多線程並非好的可擴展性方案,多線程的替代品

(1)如果需要運行後台任務,最容易的方式是基於事件循環構建應用程序。許多不同的Python模塊都提供這一機制,甚至有一個標準庫中的模塊——asyncore,它是PEP 3156中標準化這一功能的成果。有些框架就是基於這一概念構建的,如Twisted。最高級的框架應該提供基於信號量、計時器和文件描述符活動來訪問事件。

在Unix中,用於構建這種事件循環的標準函數是系統調用select(2)或者poll(2)。它們會對幾個文件描述符進行監聽,並在其中之一準備好讀或寫時做出響應。

在Python中,這些系統調用通過select模塊開放了出來。

Twisted多年來在這方面已經成為了事實上的標準。也有一些提供了Python介面的C語言庫(如libevent、libev或者libuv)也提供了高效的事件循環。

(2)如果需要分散工作負載,使用多進程會更簡單有效:Python中提供的multiprocessing包(多進程方案不適用於需要頻繁創建、銷毀進程的場景中,如接收並處理網路請求)

第 13 章 Python 3支持策略

許多函數不再返回列表而是返回可迭代對象(如range)。此外,字典方法(如keys或者items)現在也返回可迭代對象,而函數iterkeys和iteritems則已經被刪除

six模塊對於維護Python 2和3的兼容性很有用,他的名字來源於2乘以3等於6


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python 的精彩文章:

世界盃:用Python分析熱門奪冠球隊
花旗銀行將Python納入分析師培訓體系

TAG:Python |