TOP
0
0
【簡體曬書節】 單本79折,5本7折,優惠只到5/31,點擊此處看更多!
編寫高質量代碼:改善Python程序的91個建議(簡體書)
滿額折

編寫高質量代碼:改善Python程序的91個建議(簡體書)

商品資訊

人民幣定價:59 元
定價
:NT$ 354 元
優惠價
87308
絕版無法訂購
相關商品
商品簡介
作者簡介
名人/編輯推薦
目次
書摘/試閱

商品簡介

在通往“Python技術殿堂”的路上,本書將為你編寫健壯、優雅、高質量的Python代碼提供切實幫助!內容全部由Python編碼的最佳實踐組成,從基本原則、慣用法、語法、庫、設計模式、內部機制、開發工具和性能優化8個方面深入探討了編寫高質量Python代碼的技巧與禁忌,一共總結出91條寶貴的建議。每條建議對應Python程序員可能會遇到的一個問題。本書不僅以建議的方式從正反兩方面給出了被實踐證明為十分優秀的解決方案或非常糟糕的解決方案,而且分析了問題產生的根源,會使人有一種醍醐灌頂的感覺,豁然開朗。
《編寫高質量代碼:改善Python程序的91個建議》針對每個問題所選擇的應用場景都非常典型,給出的建議也都與實踐緊密結合。書中的每一條建議都可能在你的下一行代碼、下一個應用或下一個項目中顯露鋒芒。建議你將本書擱置在手邊,隨時查閱,相信這么做一定能使你的學習和開發工作事半功倍。

作者簡介

張穎,資深軟件開發工程師,精通Java、Python、Perl等技術,以及多種腳本語言,有多年開發經驗。曾就職于阿爾卡特朗訊上海公司的LTE無線事業部,現就職于IBM CSTL,工作期間獲得過多種獎勵,并于2012年獲得一項云計算相關的專利。



賴勇浩,資深軟件開發工程師,自2006年起以編寫Python代碼為生,現已創業。在Python領域有深厚的積累,CSDN博客專家,博客瀏覽量超過200萬。也是珠三角技術沙龍創始人之一,從2009年起擔任沙龍組委,長年活躍在社區第一線,在國內Python圈子里有較高的知名度和影響力。有超過7年的游戲開發經驗,擅長Python、C++等網游相關的技術,曾就職于網易等網游研發廠商;現專注于中國彩票事業,開發互聯網、電話和自助終端彩票銷售平臺,以促進行業信息化為己任。

名人/編輯推薦

從基本原則、慣用法、語法、庫、設計模式、內部機制、開發工具和性能優化8方面深入探討編寫高質量Python代碼的技巧、禁忌和最佳實踐。

目次

前 言
第1章 引論 1
建議1:理解Pythonic概念 1
建議2:編寫Pythonic代碼 5
建議3:理解Python與C語言的不同之處 8
建議4:在代碼中適當添加注釋 10
建議5:通過適當添加空行使代碼布局更為優雅、合理 12
建議6:編寫函數的4個原則 15
建議7:將常量集中到一個文件 18
第2章 編程慣用法 20
建議8:利用assert語句來發現問題 20
建議9:數據交換值的時候不推薦使用中間變量 22
建議10:充分利用Lazy evaluation的特性 24
建議11:理解枚舉替代實現的缺陷 25
建議12:不推薦使用type來進行類型檢查 27
建議13:盡量轉換為浮點類型后再做除法 29
建議14:警惕eval()的安全漏洞 31
建議15:使用enumerate()獲取序列迭代的索引和值 33
建議16:分清==與is的適用場景 35
建議17:考慮兼容性,盡可能使用Unicode 37
建議18:構建合理的包層次來管理module 42
第3章 基礎語法 45
建議19:有節制地使用from...import語句 45
建議20:優先使用absolute import來導入模塊 48
建議21:i+=1不等于++i 50
建議22:使用with自動關閉資源 50
建議23:使用else子句簡化循環(異常處理) 53
建議24:遵循異常處理的幾點基本原則 55
建議25:避免finally中可能發生的陷阱 59
建議26:深入理解None,正確判斷對象是否為空 60
建議27:連接字符串應優先使用join而不是+ 62
建議28:格式化字符串時盡量使用.format方式而不是% 64
建議29:區別對待可變對象和不可變對象 68
建議30:[]、()和{}:一致的容器初始化形式 71
建議31:記住函數傳參既不是傳值也不是傳引用 73
建議32:警惕默認參數潛在的問題 77
建議33:慎用變長參數 78
建議34:深入理解str()和repr()的區別 80
建議35:分清staticmethod和classmethod的適用場景 82
第4章 庫 86
建議36:掌握字符串的基本用法 86
建議37:按需選擇sort()或者sorted() 89
建議38:使用copy模塊深拷貝對象 92
建議39:使用Counter進行計數統計 95
建議40:深入掌握ConfigParser 97
建議41:使用argparse處理命令行參數 99
建議42:使用pandas處理大型CSV文件 103
建議43:一般情況使用ElementTree解析XML 107
建議44:理解模塊pickle優劣 111
建議45:序列化的另一個不錯的選擇——JSON 113
建議46:使用traceback獲取棧信息 116
建議47:使用logging記錄日志信息 119
建議48:使用threading模塊編寫多線程程序 122
建議49:使用Queue使多線程編程更安全 125
第5章 設計模式 129
建議50:利用模塊實現單例模式 129
建議51:用mixin模式讓程序更加靈活 132
建議52:用發布訂閱模式實現松耦合 134
建議53:用狀態模式美化代碼 137
第6章 內部機制 141
建議54:理解built-in objects 141
建議55:__init__()不是構造方法 143
建議56:理解名字查找機制 147
建議57:為什么需要self參數 151
建議58:理解MRO與多繼承 154
建議59:理解描述符機制 157
建議60:區別__getattr__()和__getattribute__()方法 160
建議61:使用更為安全的property 164
建議62:掌握metaclass 169
建議63:熟悉Python對象協議 176
建議64:利用操作符重載實現中綴語法 179
建議65:熟悉 Python 的迭代器協議 181
建議66:熟悉 Python 的生成器 185
建議67:基于生成器的協程及greenlet 188
建議68:理解GIL的局限性 192
建議69:對象的管理與垃圾回收 194
第7章 使用工具輔助項目開發 197
建議70:從PyPI安裝包 197
建議71:使用pip和yolk安裝、管理包 199
建議72:做paster創建包 202
建議73:理解單元測試概念 209
建議74:為包編寫單元測試 212
建議75:利用測試驅動開發提高代碼的可測性 216
建議76:使用Pylint檢查代碼風格 218
建議77:進行高效的代碼審查 221
建議78:將包發布到PyPI 224
第8章 性能剖析與優化 227
建議79:了解代碼優化的基本原則 227
建議80:借助性能優化工具 228
建議81:利用cProfile定位性能瓶頸 229
建議82:使用memory_profiler 和 objgraph 剖析內存使用 235
建議83:努力降低算法復雜度 237
建議84:掌握循環優化的基本技巧 238
建議85:使用生成器提高效率 240
建議86:使用不同的數據結構優化性能 243
建議87:充分利用set的優勢 245
建議88:使用multiprocessing克服GIL的缺陷 248
建議89:使用線程池提高效率 254
建議90:使用C/C++模塊擴展提高性能 257
建議91:使用 Cython 編寫擴展模塊 259

書摘/試閱

第1章
引 論
“羅馬不是一天建成的”,編寫代碼水平的提升也不可能一蹴而就,通過一點一滴的積累,才能達成從量變到質變的飛躍。這種積累可以從很多方面取得,如一些語言層面的使用技巧、常見的注意事項、編程風格等。本章主要探討Python中常見的編程準則,從而幫助讀者進一步理解Pythonic的本質。本章內容包括如何編寫Pythonic代碼、在實際應用中需要注意的一些事項和值得提倡的一些做法。希望讀者通過對本章的學習,可以在實際應用Pythonic的過程中得到啟發和幫助。
建議1:理解Pythonic概念
什么是Pythonic?這是很難定義的,這就是為什么大家無法通過搜索引擎找到準確答案的原因。但很難定義的概念絕非意味著其定義沒有價值,尤其不能否定它對編寫優美的Python代碼的指導作用。
對于Pythonic的概念,眾人各有自己的看法,但大家心目之中都認同一個更具體的指南,那就是Tim Peters的《The Zen of Python》(Python之禪)。在這一充滿著禪意的詩篇中,有幾點非常深入人心:
美勝丑,顯勝隱,簡勝雜,雜勝亂,平勝陡,疏勝密。
找到簡單問題的一個方法,最好是唯一的方法(正確的解決之道)。
難以解釋的實現,源自不好的主意;如有非常棒的主意,它的實現肯定易于解釋。
不僅這幾點,其實《Python之禪》中的每一句都可作為編程的信條。是的,不僅是作為編寫Python代碼的信條,以它為信條編寫出的其他語言的代碼也會非常漂亮。
(1)Pythonic的定義
遵循Pythonic的代碼,看起來就像是偽代碼。其實,所有的偽代碼都可以輕易地轉換為可執行的Python代碼。比如在Wikipedia的快速排序條目中有如下偽代碼:
function quicksort("array")
if length("array") ? 1
return "array" // an array of zero or one elements is already sorted
select and remove a pivot element "pivot" from "array" // see "Choice of pivot" below
create empty lists "less" and "greater"
for each "x" in "array"
if "x" ? "pivot" then append "x" to "less"
else append "x" to "greater"
return concatenate(quicksort("less"), list("pivot"), quicksort("greater"))
// two recursive calls
實際上,它可以轉化為以下同等行數的可以執行的Python代碼:
def quicksort(array):
less = []; greater = []
if len(array) <= 1:
return array
pivot = array.pop()
for x in array:
if x <= pivot: less.append(x)
else: greater.append(x)
return quicksort(less)+[pivot]+quicksort(greater)
看,行數一樣的Python代碼甚至可讀性比偽代碼還要好吧?但它真的可以運行,結果如下:
>>>quicksort([9,8,4,5,32,64,2,1,0,10,19,27])
[0,1,2,4,5,8,9,10,19,27,32,64]
所以,綜合這個例子來說,Pythonic也許可以定義為:充分體現Python自身特色的代碼風格。接下來就看看這樣的代碼風格在實際中是如何體現的。
(2)代碼風格
對于風格,光說是沒有用的,最好是通過例子來看看,因為例子看得見,會顯得更真實。下面以語法、庫和應用程序為例給大家介紹。
在語法上,代碼風格要充分表現Python自身特色。舉個最常見的例子,在其他的語言(如C語言)中,兩個變量交換需要如下的代碼:
int a = 1, b = 2;
int tmp = a;
a = b;
b = tmp;
利用Python的packaging/unpackaging機制,Pythonic的代碼只需要以下一行:
a, b = b, a
還有,在遍歷一個容器的時候,類似其他編程語言的代碼如下:
length = len(alist)
i = 0
while i < length:
do_sth_with(alist[i])
i += 1
而 Pythonic的代碼如下:
for i in alist:
do_sth_with(i)
靈活地使用迭代器是一種Python風格。又比如,需要安全地關閉文件描述符,可以使用以下with語句:
with open(path, "r") as f:
do_sth_with(f)
通過上述代碼的對比,能讓大家清晰地認識到Pythonic的一個要求,就是對Python語法本身的充分發揮,寫出來的代碼帶著Python味兒,而不是看著像C語言代碼,或者Java代碼。
應當追求的是充分利用Python語法,但不應當過分地使用奇技淫巧,比如利用Python的Slice語法,可以寫出如下代碼:
a = [1,2,3,4]
c = "abcdef"
print a[::-1]
print c[::-1]
如果不是同樣追求每一個語法細節的“老鳥”,這段代碼的作用恐怕不能一眼就看出來。實際上,這個時候更好地體現Pythonic的代碼是充分利用Python庫里reversed()函數的代碼。
print list(reversed(a))
print list(reversed(c))
(3)標準庫
寫Pythonic程序需要對標準庫有充分的理解,特別是內置函數和內置數據類型。比如,對于字符串格式化,一般這樣寫:
print "Hello %s!" % ("Tom",)
其實%s是非常影響可讀性的,因為數量多了以后,很難清楚哪一個占位符對應哪一個實參。所以相對應的Pythonic代碼是這樣的:
print "Hello %(name)s!" % {"name": "Tom"}
這樣在參數比較多的情況下尤其有用。
#字符串
value = {"greet": "Hello world", "language": "Python"}
print "%(greet)s from %(language)s." % value
%占位符來自于大家的先驗知識,其實對于新手而言,有點“莫名其妙”,所以更具有Pythonic風格的代碼如下:
print "{greet} from {language}.".format(greet = "Hello world", language = "Python")
str.format()方法非常清晰地表明了這條語句的意圖,而且模板的使用也減少了許多不必要的字符,使可讀性得到了很大的提升。事實上,str.format()也成了Python最為推薦的字符串格式化方法,當然也是最Pythonic的。
(4)Pythonic的庫或框架
編寫應用程序的時候的要求會更高一些。因為編寫應用程序一般需要團隊合作,那么可能你編寫的那一部分正好是團隊的另一成員需要調用的接口,換言之,你可能正在編寫庫或框架。
程序員利用Pythonic的庫或框架能更加容易、更加自然地完成任務。如果用Python編寫的庫或框架迫使程序員編寫累贅的或不推薦的代碼,那么可以說它并不Pythonic。現在業內通常認為Flask這個框架是比較Pythonic的,它的一個Hello world級別的用例如下:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello world!"
if __name__ == "__main__":
app.run()
稍有編程經驗的人都可以通過上例認識到利用Python編程極為容易這一事實。一個Pythonic的框架不會對已經通過慣用法完成的東西重復發明“輪子”,而且它也遵循常用的Python慣例。創建Pythonic的框架極其困難,什么理念更酷、更符合語言習慣對此毫無幫助,事實上這些年來優秀的Python代碼的特性也在不斷演化。比如現在認為像generators之類的特性尤為Pythonic。
另一個有關新趨勢的例子是:Python的包和模塊結構日益規范化。現在的庫或框架跟隨了以下潮流:
包和模塊的命名采用小寫、單數形式,而且短小。
包通常僅作為命名空間,如只包含空的__init__.py文件。
建議2:編寫Pythonic代碼
如何編寫更加Pythonic的代碼,與定義什么是Pythonic一樣困難。在這里,只能給出一些經驗之談,希望對大家有所幫助。
……

您曾經瀏覽過的商品

購物須知

大陸出版品因裝訂品質及貨運條件與台灣出版品落差甚大,除封面破損、內頁脫落等較嚴重的狀態,其餘商品將正常出貨。

特別提醒:部分書籍附贈之內容(如音頻mp3或影片dvd等)已無實體光碟提供,需以QR CODE 連結至當地網站註冊“並通過驗證程序”,方可下載使用。

無現貨庫存之簡體書,將向海外調貨:
海外有庫存之書籍,等候約45個工作天;
海外無庫存之書籍,平均作業時間約60個工作天,然不保證確定可調到貨,尚請見諒。

為了保護您的權益,「三民網路書店」提供會員七日商品鑑賞期(收到商品為起始日)。

若要辦理退貨,請在商品鑑賞期內寄回,且商品必須是全新狀態與完整包裝(商品、附件、發票、隨貨贈品等)否則恕不接受退貨。

優惠價:87 308
絕版無法訂購

暢銷榜

客服中心

收藏

會員專區