代碼這樣寫更優(yōu)雅python

引用
一個程序員的微站

一,概述

Programs must be written for people to read , and only incidentally for machines to execute.
Harold Abelson, Structure and Interpretation of Computer Programs(計算機程序的構造和解釋)

要寫出Pythonic 優(yōu)雅的,道地的,整潔的代碼,需要平時多觀察大牛代碼,

Github上的requests, flask , tornado 等優(yōu)秀源代碼是學習對象,下面是一些總結的常見的pythonic寫法
一份優(yōu)雅簡潔的代碼通常自帶文檔和注釋屬性,讀代碼就是讀作者的思路
python 開發(fā)中很少像Java一樣遵循某種設計模式作為開發(fā)原則中應用于系統(tǒng)中
代碼清晰是最終目的

二,Pythonic集錦

1 變量交換

大部分編程語言交換兩個變量的值,不得不引入一個臨時變量


2 循環(huán)遍歷區(qū)間元素


xrange 返回的是生成器對象,生成器比列表更加節(jié)省內存,
需要注意xrange是python 2的寫法, python3中只有range 方法,特點和xrange一樣


3 帶有索引位置的集合遍歷

遍歷集合時候需要使用到集合的索引位置,直接對集合迭代沒有索引信息,


4 字符串連接

字符串連接時候,普通的方式可以用 + 操作
join 是一種更加高效的字符串連接方式,使用+操作時候,
每執(zhí)行一次+操作在內存中生成一個新的字符串對象,
遍歷8次有8個字符串生成,造成無謂的內存浪費
用join 方法整個過程中只會生成一個字符串對象


5 打開/關閉 文件

執(zhí)行文件操作時候,最后一定不能忘記關閉文件,即使報錯了也要close,
普通的方法是在finnally 塊中顯示的調用close()方法
使用with 語句,系統(tǒng)會在執(zhí)行玩文件操作后,自動關閉文件對象


6 列表推導式

能夠使用一行代碼簡明扼要的解決問題時候,不要使用兩行
與之類似的還有生成器表達式,字典推導式


7 善用裝飾器

裝飾器可以把與業(yè)務邏輯無關的代碼抽離出來,讓代碼保持干凈清爽,
而且裝飾器還能被多個地方重復使用, 比如一個爬蟲網頁的函數(shù)
如果該URL曾經被爬過就直接從緩存中獲取,否則爬下來之后加入到緩存,
防止后續(xù)重復爬取

使用裝飾器寫代碼表面上感覺代碼量更多,但是它把緩存相關的邏輯抽離出來了
可以給更多的函數(shù)調用,這樣總的代碼量減少,而且業(yè)務看起來簡潔


8 合理使用列表

列表對象list 是一個查詢效率高于更新操作的數(shù)據結構,
例如刪除一個元素和插入一個元素的執(zhí)行效率非常低,因為要對剩下的元素進行移動

deque 是一個雙向隊列的數(shù)據結構,刪除元素和插入元素會很快


9 序列解包


10 遍歷字典的key 和 value

方法一速度沒有那么快,因為每一次迭代時候還要重新進行hash查找key 對應的value
方法二遇到字典非常大的時候,會導致內存的消耗增加一倍以上

iteritems 返回迭代器對象,可以節(jié)省更多的內存,
不過在python3中沒有該方法了,只有items方法,作用等價于iteritems


11, 鏈式比較操作

鏈式比較操作 False == False == True 等價于 False == False and False == True
所以輸出結果是False


12, if/else 三目運算

在類C的語言中都支持三目運算b ? x: y , Python 之禪

There should be one -- and preferably only one --obvious way to do it.

能夠使用if/else 清晰表達邏輯時候,就沒有必要在額外新增一種方式來實現(xiàn)



13,真值判斷

檢查某個對象是否是真值, 顯示地使用True 和 False 作比較多此一舉,不專業(yè)


14,for/else 語句

for else 是Python 特有的語法格式,else 中的代碼在for 循環(huán)遍歷完所有元素之后執(zhí)行


15,字符串格式化

很難說用format 比用%s 的代碼少,但是format 更加易于理解


16,列表切片

獲取列表中的部分元素最先想到的是用for 循環(huán)根據條件提取元素,這也是其他語言中
管用的手段,但是python中有強大的切片功能
列表元素的下標不僅可以用正數(shù)表示,還可以用負數(shù)表示,最后一個元素的位置是-1,
從右到左,依次遞減


17,善用生成器

上面是用生成器生成斐波那契數(shù)列,生成器的好處是無需一次性將所有的元素
加載到內存,只有迭代獲取元素的時候才返回元素,
而列表預先一次性把全部的元素加載到內存,
此外使用yield,代碼看起來更加簡潔


18,獲取字典元素


19,預設字典默認值

通過key 分組時候,不得不每次都檢查key 是否已經存在于字典中


20,字典推導式

在python2.7之前,構建字典對象一般使用下面這種方式,可讀性非常差

字典推導式是python2.7新增的特性, 可讀性增強了很多,類似的還有列表推導式和集合推導式

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容