Effective Python:編寫高質量Python代碼的90個有效方法(原書第2版)(簡體書)
商品資訊
商品簡介
●本書可以幫你掌握真正的Pythonic編程方式,令你能夠完全發揮出Python語言的強大功能,並寫出健壯而高效的代碼。Scott Meyers在暢銷書Effective C++中開創了一種以使用場景為主導的精練教學方式,本書作者Brett Slatkin就以這種方式匯聚了90條實踐原則、開發技巧和便捷方案,並以實用的代碼範例來解釋它們。
●Slatkin根據自己在Google公司多年開發Python基礎架構所積累的經驗,揭示Python語言中一些鮮為人知的微妙特性,並給出了能夠改善代碼功能及運行效率的習慣用法。通過本書,你能夠了解到解決關鍵編程任務所用的奇妙方式,並學會編寫易於理解、便於維護且利於改進的代碼。
本書可以幫你掌握真正的Pythonic編程方式,令你能夠完全發揮出Python語言的強大功能,並寫出健壯而高效的代碼。Scott Meyers在暢銷書《Effective C++》中開創了一種以使用場景為主導的精練教學方式,本書作者Brett Slatkin就以這種方式彙聚了90條實踐原則、開發技巧和便捷方案,並以實用的代碼範例來解釋它們。
Slatkin根據自己在Google公司多年開發Python基礎架構所積累的經驗,揭示Python語言中一些鮮為人知的微妙特性,並給出了能夠改善代碼功能及運行效率的習慣用法。通過本書,你能夠瞭解到解決關鍵編程任務所用的奇妙方式,並學會編寫易於理解、便於維護且利於改進的代碼。
【本書的關鍵內容包括】:
● 31 條新的實用建議,這些建議涵蓋Python 開發的幾個主要方面。
● 對各種語句、表達式與內置類型做了詳細講解與演示。
● 怎樣寫出意圖清晰、便於復用而且不容易出現bug 的函數。
● 怎樣更好地使用推導機制與生成器函數。
● 怎樣用類與接口準確展示相關的行為。
● 怎樣避開元類與動態屬性中的一些陷阱。
● 怎樣用更高效且更清晰的方法寫出並發與並行程序。
● 怎樣優化程序性能並提升代碼質量。
● 用於改進調試與測試工作的技術與內置模塊。
● 與協作開發有關的工具和經驗。
作者簡介
Brett Slatkin
Google首席軟件工程師,他是Google Surveys的聯合技術創始人,也是PubSubHubbub協議的共同創造者之一。此外,Slatkin還發布了Google的第一個雲計算產品——App Engine。早在15年前,Slatkin就開始在工作中使用Python管理Google大量的服務器群。他擁有紐約哥倫比亞大學計算機工程專業學士學位。
名人/編輯推薦
●“自2015年第1版出版之後,我一直在向人推薦這本書。第2版更新並補充了涉及Python 3的內容,裡面寫滿了各種實用的Python編程技巧,這些技巧對新手和老手都有幫助。”
—Wes McKinney,Python Pandas項目創始人,Ursa Labs的主管
●“如果你是從其他語言轉到Python的,那就把這本書當成權威指南來看吧!它會教你怎樣充分利用Python的各種特性。我用Python已經快20年了,但還是能夠從這本書裡發現很多有用的技巧,尤其是與Python 3的新特性有關的技巧。本書中的建議都很實用,可以幫助我們判斷什麼樣的代碼才是Python風格的代碼。”
—Simon Willison,Django聯合創始人
●“我用Python寫了很多年程序,認為自己已經很了解這門語言了,但是看過這本書中的各項技巧之後,我才發現自己寫的代碼仍然有很多地方可以改進。比如可以通過二分法在有序的列表中搜索,讓程序跑得更快;可以採用只能通過關鍵字形式來指定的參數把代碼寫得更加清晰易讀;可以通過星號表達式來拆分序列,減少出錯率;可以通過zip並行迭代多個列表,讓代碼更具Python風格。第2版還有個好處,就是它能讓我很快掌握Python 3的新特性,例如walrus操作符、f-string 、typing模塊等。”
—Pamela Fox,可汗學院編程課創始人
●“Python 3終於成了Python的標準版本,它其實已經做了8次小的修訂,其中添加了許多新特性。Brett Slatkin這次帶來的Effective Python第2版,講解了大量新的Python編程習慣,並且給出了很多條明晰的建議,這些內容考慮到了從Python 3.0到Python 3.8之間的各個版本,至於Python 2,現在可以讓它歇一歇了。本書前面幾章介紹了Python 3的許多新語法和新概念,比如string對象、byte對象、f-string、賦值表達式(assignment expression,作者會提到關於這種表達式的幾個你不一定知道的特殊叫法),以及如何把tuple中的其他元素全都捕獲下來。後面幾章談的主題比較大,其中有些內容我原來沒聽說過,還有一些我雖然聽說過,但總找不到特別好的辦法給別人講解。比如第6章,其中有一條建議很棒,那就是第51條。另外,作者還介紹了一個奇妙的方法,叫作__init_subclass__(),我原來不太熟悉。在介紹並發與並行的章節中,第53條建議講得很好,當然作者還講了asyncio(異步I/O)與coroutine(協程)的問題,而且講得很對。另外就是談穩定與性能的那一章,其中第70條建議值得注意。總之,每一部分都寫得很棒,作者把這些實踐技巧講解得相當清晰,以後我打算引用書裡的一些內容,因為這些建議實在是很有道理。如果今年只讀一本Python書的話,那肯定該選這一本。”
—Mike Bayer,SQLAlchemy創始人
●“剛學編程的人和有經驗的開發者都非常適合看這本書。書中的範例代碼寫得很周詳,作者解釋得也相當精準、透徹。第2版更新了與Python 3有關的建議,這實在是太好了。我已經用Python近20年了,但還是每看幾頁就能發現一些新的知識。書中給出的建議,我想每個人都應該聽取。”
—Titus Brown,加州大學戴維斯分校副教授
●“與上一版一樣,Brett Slatkin依然很好地將整個Python開發界的各種經驗,全都濃縮到了一本書中。他既談了元類與並發這樣的高端主題,也沒有忘記穩定性、測試與協作開發等重要基礎知識。本書新版用大家都能接受的觀點,講述了什麼叫作Python式的編程風格。”
—Brandon Rhodes,python-patterns.guide的作者
序
【前言】
Python是一門強大的編程語言,它很有魅力,同時也很獨特,所以掌握起來或許有點兒困難。許多程序員從他們熟悉的語言轉到Python之後都打不開思路,所以寫出來的代碼沒有充分發揮出Python的特性。還有一些程序員則相反,他們會濫用Python的特性,這樣寫出來的程序以後可能會出現嚴重的問題。
本書會詳細地告訴大家如何採用符合Python風格的方式(Pythonic方式)來編寫程序,這是使用Python語言的最佳方式。筆者假設你對這門語言已經有了初步了解。編程新手可以通過這本書學到各種Python功能的最佳用法,有經驗的程序員則能夠學會如何自信地運用Python中的新工具。
筆者的目標是讓大家用Python開發出優秀的軟件。
【本書涵蓋的內容】
本書每一章都包含許多相互關聯的條目。大家可以按照自己的需要隨意閱讀這些條目。每個條目都包含簡潔而明確的教程,告訴你如何才能更有效率地編寫Python程序。筆者在每個條目裡都給出了建議,告訴大家哪些應該做,哪些應該避免,以及怎樣在各種做法之間求得平衡,並且會解釋筆者所選的做法好在哪裡。筆者可能會在某個條目中提到其他一些條目,讓大家可以全面地了解這些建議所涉及的知識。
本書第2版只針對Python 3(參見第1條),這裡說的Python 3包含從3.0到3.8的各個版本。本書第1版中的許多條目仍然收錄在第2版中,並且做了修訂,其中有些條目改動比較大。隨著Python語言越來越成熟,最佳編程方法也在演變,所以筆者在第2版中對某些問題的建議,可能與第1版的完全不同。Python 2已經在2020年1月1日退場,如果你還是主要在用這個版本來編程,那麼第1版中的建議或許比第2版中的建議更加合適。
Python採用“自帶電池”(batteries included)的理念來設計標準庫,不像其他語言那樣只提供少數幾個常用的軟件包,如果需要的重要功能不在這些軟件包裡,那就要自己去尋找了。許多Python內置軟件包與Python的習慣用法有著密切的關係,所以實際上已經成了語言規範的一部分。本書篇幅有限,不可能把所有的標準模塊全都講一遍,但會涵蓋其中那些需要了解和使用且用法比較關鍵的模塊。
●第1章:培養Pythonic 思維
Python開發者社區用Pythonic這個形容詞來描述具有某種特定風格的代碼。這種風格是大家在使用Python語言編程並相互協作的過程中逐漸形成的。本章講解如何採用這樣的風格編寫常見的Python代碼。
●第2章:列表與字典
在Python語言中整理信息時,最常用的方法是把一系列數值保存到列表(list)中。既然有列表,那就有另外一種跟它互補的結構,也就是字典(dict),這種結構可以把它存儲的查找鍵映射到對應的值上。本章講解如何採用這些數據結構來編寫程序。
●第3章:函數
Python中的函數具備多種特性,這有助於簡化編程工作。Python函數的某些性質與其他編程語言中函數的類似,但也有一些是Python獨有的。本章介紹如何使用函數來表達開發者的意圖,如何讓代碼更容易復用,以及如何減少bug。
●第4章:推導與生成
Python有一種特殊的語法,可以迅速迭代列表(list)、字典(dict)與集合(set),並據此生成相應的數據結構,這讓我們能夠在函數返回的這種結構上逐個訪問根據原結構所派生出來的一系列值。本章講解怎樣利用這種機制來提升程序效率並降低內存用量,同時讓代碼變得更容易讀懂。
●第5章:類與接口
Python是面向對象的語言。用Python編程時,經常要編寫新的類,而且還要定義這些類應該如何通過其接口以及繼承體係與其他代碼相交互。本章講解怎樣使用類來表達對象所應具備的行為。
●第6 章:元類與屬性
元類(metaclass)與動態屬性(dynamic attribute)都是很強大的Python特性,但它們也有可能會讓程序出現古怪的行為與意外的效果。本章講解這些機制的習慣用法,確保讀者寫出來的代碼遵循最小驚訝原則(rule of least surprise)。
●第7章:並發與並行
用Python很容易寫並發程序,這種程序可以在同一時刻做許多件不同的事情。Python也可以通過系統調用、子進程以及C語言擴展來實現並行處理。本章介紹這些Python特性應該用在什麼情況下。
●第8章:穩定與性能
Python內置了一些功能與模塊,可以讓程序變得更加可靠。另外,Python還提供了一些工具,可以讓我們輕鬆地提升程序的性能。本章講解怎樣用Python優化程序,讓這些程序在正式的運行環境中表現得更加穩定、更加高效。
●第9 章:測試與調試
不管使用哪種語言編程,我們都應該把寫出來的代碼測試一下。但對於Python來說,還有個特殊的問題,那就是它所提供的動態機制可能會增加程序在運行時出現錯誤的風險。好在Python也讓我們可以比較容易地編寫測試代碼和故障診斷程序。本章講解怎樣用Python內置的工具來測試並調試程序。
●第10 章:協作開發
如果許多人要協作開發一個Python程序,那就得仔細商量代碼的寫法了。即便你只是一個人開發,也需要了解如何使用其他人所寫的模塊。本章介紹標準的工具以及業界總結出來的最佳方法,告訴大家怎樣協作開發Python程序。
目次
●第1章培養Pythonic思維// 1
第1條查詢自己使用的Python版本// 1
第2條遵循PEP 8風格指南// 2
第3條了解bytes與str的區別// 5
第4條用支持插值的f-string取代C風格的格式字符串與str.format方法// 9
第5條用輔助函數取代複雜的表達式// 19
第6條把數據結構直接拆分到多個變量裡,不要專門通過下標訪問// 21
第7條盡量用enumerate取代range // 25
第8條用zip函數同時遍歷兩個迭代器// 26
第9條不要在for與while循環後面寫else塊// 28
第10條用賦值表達式減少重複代碼// 31
●第2章列表與字典// 37
第11條學會對序列做切片// 37
第12條不要在切片裡同時指定起止下標與步進// 40
第13條通過帶星號的unpacking操作來捕獲多個元素,不要用切片// 42
第14條用sort方法的key參數來表示複雜的排序邏輯// 45
第15條不要過分依賴給字典添加條目時所用的順序// 51
第16條用get處理鍵不在字典中的情況,不要使用in與KeyError // 56
第17條用defaultdict處理內部狀態中缺失的元素,而不要用setdefault // 61
第18條學會利用__missing__構造依賴鍵的默認值// 63
●第3章函數// 66
第19條不要把函數返回的多個數值拆分到三個以上的變量中// 66
第20條遇到意外狀況時應該拋出異常,不要返回None // 69
第21條了解如何在閉包裡面使用外圍作用域中的變量// 71
第22條用數量可變的位置參數給函數設計清晰的參數列表// 75
第23條用關鍵字參數來表示可選的行為// 77
第24條用None和docstring來描述默認值會變的參數// 80
第25條用只能以關鍵字指定和只能按位置傳入的參數來設計清晰的參數列表// 83
第26條用functools.wraps定義函數修飾器// 88
●第4章推導與生成// 91
第27條用列表推導取代map與filter // 91
第28條控制推導邏輯的子表達式不要超過兩個// 93
第29條用賦值表達式消除推導中的重複代碼// 94
第30條不要讓函數直接返回列表,應該讓它逐個生成列表裡的值// 97
第31條謹慎地迭代函數所收到的參數// 100
第32條考慮用生成器表達式改寫數據量較大的列表推導// 104
第33條通過yield from把多個生成器連起來用// 106
第34條不要用send給生成器注入數據// 108
第35條不要通過throw變換生成器的狀態// 113
第36條考慮用itertools拼裝迭代器與生成器// 117
●第5章類與接口// 122
第37條用組合起來的類來實現多層結構,不要用嵌套的內置類型// 122
第38條讓簡單的接口接受函數,而不是類的實例// 128
第39條通過@classmethod多態來構造同一體系中的各類對象// 131
第40條通過super初始化超類// 136
第41條考慮用mix-in類來表示可組合的功能// 140
第42條優先考慮用public屬性表示應受保護的數據,不要用private屬性表示// 144
第43條自定義的容器類型應該從collections.abc繼承// 149
●第6章元類與屬性// 153
第44條用純屬性與修飾器取代舊式的setter與getter方法// 153
第45條考慮用@property實現新的屬性訪問邏輯,不要急著重構原有的代碼// 157
第46條用描述符來改寫需要復用的@property方法// 160
第47條針對惰性屬性使用__getattr__、__getattribute__及__setattr__ // 165
第48條用__init_subclass__驗證子類寫得是否正確// 170
第49條用__init_subclass__記錄現有的子類// 177
第50條用__set_name__給類屬性加註解// 181
第51條優先考慮通過類修飾器來提供可組合的擴充功能,不要使用元類// 185
●第7章並發與並行// 191
第52條用subprocess管理子進程// 192
第53條可以用線程執行阻塞式I/O,但不要用它做並行計算// 195
第54條利用Lock防止多個線程爭用同一份數據// 199
第55條用Queue來協調各線程之間的工作進度// 202
第56條學會判斷什麼場合必須做並發// 210
第57條不要在每次fan-out時都新建一批Thread實例// 214
第58條學會正確地重構代碼,以便用Queue做並發// 218
第59條如果必須用線程做並發,那就考慮通過ThreadPoolExecutor實現// 224
第60條用協程實現高並發的I/O // 226
第61條學會用asyncio改寫那些通過線程實現的I/O // 230
第62條結合線程與協程,將代碼順利遷移到asyncio // 239
第63條讓asyncio的事件循環保持暢通,以便進一步提升程序的響應能力// 245
第64條考慮用concurrent.futures實現真正的並行計算// 248
●第8章穩定與性能// 253
第65條合理利用try/except/else/finally結構中的每個代碼塊// 253
第66條考慮用contextlib和with語句來改寫可複用的try/finally代碼// 258
第67條用datetime模塊處理本地時間,不要用time模塊// 262
第68條用copyreg實現可靠的pickle操作// 265
第69條在需要準確計算的場合,用decimal表示相應的數值// 272
第70條先分析性能,然後再優化// 274
第71條優先考慮用deque實現生產者-消費者隊列// 278
第72條考慮用bisect搜索已排序的序列// 284
第73條學會使用heapq製作優先級隊列// 286
第74條考慮用memoryview與bytearray來實現無須拷貝的bytes操作// 294
●第9章測試與調試// 300
第75條通過repr字符串輸出調試信息// 301
第76條在TestCase子類裡驗證相關的行為// 304
第77條把測試前、後的準備與清理邏輯寫在setUp、tearDown、setUpModule與tearDownModule中,以防用例之間互相干擾// 309
第78條用Mock來模擬受測代碼所依賴的複雜函數// 312
第79條把受測代碼所依賴的系統封裝起來,以便於模擬和測試// 319
第80條考慮用pdb做交互調試// 322
第81條用tracemalloc來掌握內存的使用與洩漏情況// 326
●第10章協作開發// 329
第82條學會尋找由其他Python開發者所構建的模塊// 329
第83條用虛擬環境隔離項目,並重建依賴關係// 330
第84條每一個函數、類與模塊都要寫docstring // 335
第85條用包來安排模塊,以提供穩固的API // 339
第86條考慮用模塊級別的代碼配置不同的部署環境// 344
第87條為自編的模塊定義根異常,讓調用者能夠專門處理與此API有關的異常// 346
第88條用適當的方式打破循環依賴關係// 350
第89條重構時考慮通過warnings提醒開發者API已經發生變化// 355
第90條考慮通過typing做靜態分析,以消除bug // 361
書摘/試閱
譯者序
一拿到這本書的英文版,立刻覺得它比上一版厚了許多。對比副書名,發現新版多出了31條建議;翻開目錄,看到章節劃分也和原來不同。新版單獨設立了幾章來強調列表與字典、推導與生成、元類與屬性、穩定與性能,以及測試與調試等幾個重要主題,並把上一版的一些建議從原有位置移到了這些新章中。
跟其他某些修訂版本不同,本書的新版並非簡單地調整文字,而是有三個重要變化。
首先,作者這次只關注Python 3,而不再兼顧Python 2,這樣可以騰出許多篇幅,從而將相關技巧在Python 3中的原理與用法講得更加透徹。
第二個變化,是作者根據Python語言近年來引入的新特性,以及Python開發界所形成的新經驗,修訂了上一版中的某些思路與解決方案,以便更好地發揮Python的優勢。現今的Python早已從一門新興的語言變成了獲得廣泛認可的成熟語言,儘管具體的特性一直在變,但依然保持著簡潔而直觀的編程理念。
兩個版本之間的第三個區別,自然是條目上的變動。作者把已經過時或者不在本版討論範圍內的知識點從原條目裡刪去,並添加一些條目以突出Python的新特性。另外,作者還將某些比較籠統的條目拆分成幾個新條目來詳細講解。
本版在範例代碼安排上跟上一版相似,目的是讓每條建議都可以單獨拿出來學習並運用,所以不會以一兩個大例子貫穿全書,而是針對每條建議各自舉例。當然其中有些例子,比如生命遊戲、生產者-消費者隊列等,本身比較完備,可以用在許多場景中。但還有一些例子,則僅僅用來演示某種用法。大家應該結合自己的項目加以改編,並多做嘗試。
雖然這一版在寫法上延續了上一版乃至Effective系列一貫的風格,但由於內容和觀點變化比較大,因此譯者沒有套用原來的譯稿,而是重新翻譯了全書。藉著這次重譯,我把原來措辭較為生硬的地方調整得通俗一些,便於大家理解。希望這次的新譯本能夠幫助更多的人了解Python語言,以及這門語言在最近幾年中的變化,從而不斷地更新自己的技能與思路。
我在翻譯本書的過程中得到了機械工業出版社華章公司各位工作人員的幫助,在此深表感謝。特別要感謝關敏編輯再度給我機會翻譯這本好書。
愛飛翔
主題書展
更多書展本週66折
您曾經瀏覽過的商品
購物須知
大陸出版品因裝訂品質及貨運條件與台灣出版品落差甚大,除封面破損、內頁脫落等較嚴重的狀態,其餘商品將正常出貨。
特別提醒:部分書籍附贈之內容(如音頻mp3或影片dvd等)已無實體光碟提供,需以QR CODE 連結至當地網站註冊“並通過驗證程序”,方可下載使用。
無現貨庫存之簡體書,將向海外調貨:
海外有庫存之書籍,等候約45個工作天;
海外無庫存之書籍,平均作業時間約60個工作天,然不保證確定可調到貨,尚請見諒。
為了保護您的權益,「三民網路書店」提供會員七日商品鑑賞期(收到商品為起始日)。
若要辦理退貨,請在商品鑑賞期內寄回,且商品必須是全新狀態與完整包裝(商品、附件、發票、隨貨贈品等)否則恕不接受退貨。