Python 開發中有哪些進階技巧?

來源:互聯網
上載者:User

回複內容:

謝謝老原 @原博文 邀請 : )

我列出來幾個,不知道算不算進階技巧,但是我個人覺得非常有用。

1. 善用迭代器

迭代器在很多語言裡面都有,而在 Python 裡適當的情境用迭代器會非常的“爽”。一來因為迭代器每次產生一個對象,適當使用能有效節省記憶體;二來它能達到部分“延遲計算”的效果。除此以外,因為 Generator (yield 關鍵字)和 Generator Expression 的存在,有時候使用迭代器能提升代碼可讀性。

舉例,itertools.islice((calculate_for_value(v) for v in values), 0, 12) 能夠只在 [0, 12) 範圍內計算,而且是延遲計算的,即迭代到了那個對象才去計算。又如 any(i % 3 == 0 for i in numbers) 能夠找出 numbers 裡第一個能被 3 整除的值,因為裡面是個 Generator Expression(迭代器的一種),所以找出以後 any 函數就會立即返回,並不需要對整個 numbers 列表計算 i % 3。

順帶推薦下這個庫 erikrose/more-itertools ,裡麵包含了很多實用的迭代器函數,是對標準庫 itertools 的一個很不錯的補充。

2. 善用描述符(Descriptor)

Python 的描述符是對“屬性”的抽象,一個描述符定義成類屬性以後,能夠控制這個類的執行個體上同名執行個體屬性的 get、set、delete 行為,比 __getattr__ 這樣的執行個體級 magic method 有更細的粒度,並且更容易複用。這個文檔有簡單的描述 Descriptor HowTo Guide ,可見 Python 的“執行個體方法”、@property 全由它實現,一些第三方庫也有用到(例如 SQLAlchemy 的 Column、WTForms 的 Field 乃至 Python 3.4 新增的 enum.Enum 類型)。

利用描述符特性,可以在業務代碼中實現一些非常方便的定製,例如可以自己實現一個能緩衝傳回值的 cached_property(也可以不用自己實現,直接用 Werkzeug 的)。

3. 盡量不要用反射技巧去 fight with language

我個人的一個觀點:用一門程式設計語言就應該入鄉隨俗,fight with language 的事情不要做太多為好。因為閉門造的輪子很難造圓,更何況站在語言使用者的層面去和語言的設計搏擊實在很不自量力。

問題問的是“進階技巧”,那麼對於一個動態語言,反射當然算進階技巧的。可是我見過一些利用 Python 的反射來掃描出一些包中所有 .py 檔案然後自動 import 包下的所有模組的。且不說這個做法破壞了 Python “模組即是命名空間” 和 lazy import 的設定,光是從“正確性”來說就有一堆問題。這個做法僅僅考慮到了模組檔案系統中的情境,沒考慮到可能模組在一個 zip 中的情況。就算再增強一下實現,考慮上 zip 的 import,那 Python 還有 PEP 302 定義的 Import Hook 用法呢,被這樣一 hack 就完全沒法用了。這種 fight with language 的做法很難去做到真正的“正確”。

所以我覺得還有一個 Python 的技巧就是想使用“進階技巧”的時候謹慎地考慮使用。靜下來想想自己是不是在 fight with language 了,如果是的話,建議停手。要不就入鄉隨俗,要不就認真考慮一下 Python 是不是真的有值得去改進的地方。後者是需要經過很多深思熟慮的,不是 10 分鐘的想法就夠。如果後者的回答真的是“是”,我想可能正確的做法是寫一個 PEP 然後和社區討論,看能否將改進直接施於 Python 未來的版本之上,而不是在自己的代碼裡用一個看似進階技巧實是醜陋的 hack 的實現來對抗語言本身。

-------------------------------------------------------------------------------

其他的一些 Python 特色的技巧,例如 decorator、contextmanager 等,因為各路 Python 開發人員基本都很熟悉,我就沒列出來了。

-------------------------------------------------------------------------------

補充下:其實這裡有個超長列表 Hidden features of Python …… 不過裡面的很多特性現在都是日常了推薦一下 Stack Overflow 上這個文章:
Hidden features of Python 可以看看我的部落格,這是我邊看邊思考的記錄,目前還沒寫完,基本上一天一到兩篇的節奏。

Python的進階特性1:容易忽略的不可變類型
Python的進階特性2:列表推導式,產生器與迭代器
python的進階特性3:神奇的__call__與返回函數
Python的進階特性4:函數式編程
Python的進階特性5:談談python的動態屬性
Python的進階特性6:使用__slots__真的能省很多記憶體
Python的進階特性7:閉包和裝飾器
Python的進階特性8:你真的瞭解類,對象,執行個體,方法嗎
Python的進階特性9:蹩腳的多態
Python的進階特性10:無聊的@property
Python的進階特性11:拓展基礎資料型別 (Elementary Data Type)(dict) 推薦看一下《Python進階編程》。
裡面比如yield、property等用法就算是比較進階的技巧了。
細說有很多,一一列舉出來也太費勁。
至於列表解析什麼的算是挺基礎的東西了。個人覺得 python語言最為重要的哲學是可讀性,所以提高代碼的可讀性是最為重要的,也是區分於初級技巧的進階技巧。


往往完成一件事是容易的,所不同的是其中的成本,是優雅程度。寫python肯定用協程了沒用過什麼進階技巧,只說一些團隊協作中的小技巧吧:
1. docstring
給模組或類、函數寫docstring是個好習慣,看看官方樣本:
>>> def my_function():...     """Do nothing, but document it.......     No, really, it doesn't do anything....     """...     pass...>>> print my_function.__doc__Do nothing, but document it.    No, really, it doesn't do anything.
Lambda
比如
calculator{    'plus' : lambda x,y : x + y,    'minus' : lambda x,y : x - y}res = calculator['plus'](2, 3) # res = 5
可以看看Python進階編程
還有 http://www.kokojia.com/course-526.html 這個連結裡的東東挺不錯的,有興趣的看看,希望可以幫到你
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.