隨著網際網路技術的發展, 現如今信息爆炸越來越明顯, 大家在工作中需要接觸及學習的技術點也是越來越多. 在這種大背景的情況下, 以號稱「簡潔」著稱的 Python 語言自然而然火了起來.
那是不是只要使用 Python 來寫代碼, 就算「簡潔」編碼呢? 非也, 即使用同樣的語言, 代碼的「簡潔」程度也是因人而異, 本文將結合生產環境中常見的代碼寫法進行講解, 給大家撥開迷霧見雲彩, 看透其中的奧秘.
何謂「簡潔」編碼?在開始前, 先問大家一個問題, 什麼樣的代碼算得上「簡潔」?
這類問題, 其實也隱藏在我們的日常生活中, 這裡我直接舉個例子, 大家請看下面三句話
1. 家有千金, 行止由心.
2. 形若槁骸, 心如死灰.
3. 君莫欺我不識字,人間安得有此事.
大家看了上面三句話的第一眼是什麼感覺? 用了古文的寫法, 表達也非常到位, 可是大家細想, 在理解這三句話真正含義的時候, 是不是腦海裡面有過短暫的消化和轉化的時間? 大家再看以下三句話, 與上面三句話表達出同樣的意思.
1. 有錢, 任性
2. 心好累
3. 我讀書少,你不要騙我
是不是一眼就能抓住這幾句話的含義?
簡短, 直觀, 易於理解, 這就是「簡潔」, 而符合這種特性的代碼, 則為「簡潔」的編碼
簡潔代碼的思路講解接下來, 我將以下工作中常見的代碼寫法來講解, 如何簡潔化我們的 python 代碼
注: 以下代碼樣例僅針對最常用的 python2 版本
1. 使用 dict 的默認操作符可以方便的獲取到 key, 減少不必要的 dict.keys() 和 dict.has_key() 操作2. 當需要同時獲取字典的 key和 value 時, 可以使用 iteritems 迭代器3. 文件的默認操作符也是類似的, 在循環時可以直接使用小貼士1:如果類型支持, 就直接使用默認迭代器和操作符, 例如列表, 字典和文件. 默認操作符和迭代器簡單高效, 沒有額外的方法調用.
小貼士 2:
Python 會在條件語句上下文中求布爾值. 按簡單的直覺來講, 就是所有的「空」值都被認為是 false. 因此 0,None, [], {}, 「」 都被認為是 false. 使用 Python 布爾值的條件語句更易讀也更不易犯錯. 大部分情況下, 也更快.
永遠不要用 == 或者 != 來比較 None 和布爾值, 直接使用 if x: 代替, 如果需要區分 False 和 None, 可以使用 if x is None: 這樣的語句.
5. 利用 set 和 list 簡化多個條件語句的值判斷6. 利用 locals 函數或是 globals 函數可以更方便的完成多個變量的檢查7. 利用條件語句的取反(if not), 可以儘可能的減少複雜邏輯中的代碼嵌套層級寫出「簡潔」 Python 代碼的學習資料上面舉了 11 個例子, 讓大家有了真實的「簡潔」思路, 那這些思路從何而來, 以下是我認為需要反覆閱讀並理解吸收的知識
1. 《Python之禪》相信很多同學在學習 Python 的時候, 也看過箸名的 Python 之禪 , 像上面的樣例 11, 改進前就是違背了扁平勝於嵌套的信條, 我們可以多在 review 自己代碼時, 思考一下代碼是不是違背了這些信條
明了勝於晦澀(優美的代碼應當是明了的,命名規範,風格相似)
簡潔勝於複雜(優美的代碼應當是簡潔的,不要有複雜的內部實現)
複雜勝於凌亂(如果複雜不可避免,那代碼間也不能有難懂的關係,要保持接口簡潔)
扁平勝於嵌套(優美的代碼應當是扁平的,不能有太多的嵌套)
間隔勝於緊湊(優美的代碼有適當的間隔,不要奢望一行代碼解決問題)
可讀性很重要(優美的代碼是可讀的)
即便假借特例的實用性之名,也不可違背這些規則(這些規則至高無上)
不要包容所有錯誤,除非你確定需要這樣做(精準地捕獲異常,不寫 except:pass 風格的代碼)
當存在多種可能,不要嘗試去猜測,而是儘量找一種,最好是唯一一種明顯的解決方案(如果不確定,就用窮舉法)
雖然這並不容易,因為你不是 Python 之父(這裡的 Dutch 是指 Guido )
做也許好過不做,但不假思索就動手還不如不做(動手之前要細思量)
如果你無法向人描述你的方案,那肯定不是一個好方案;反之亦然(方案測評標準)
命名空間是一種絕妙的理念,我們應當多加利用(倡導與號召)
注: 《Python 之禪》是 2004 年的 Python 改進提案,編號為 PEP 20。以禪詩、偈頌的形式。
這個是一位老資格的 Python 人 Tim Peters 將 Python 語言創始人 Guido van Rossum 的 Python 設計指導原則 簡明扼要地歸納而來, 是我們學好 python 並寫出高質量 python 代碼的關鍵點, 每一個 Python 開發者都應該反覆閱讀、理解、記憶、運用的信條.
PEP8 一定要讀幾次, 有些規範記不住沒關係, 可以多使用 pylint 檢查工具來給檢查代碼, Google Python Style Guild 也是非常值得大家熟讀的
寫在最後讀過這些信條和資料, 最重要還是自己要能保持不斷優化自己代碼的念頭, 才能在一次次的編碼過程中, 不斷打磨自己的編碼能力, 最終做到把「簡潔」的理念深入自己的編碼能力中.
多看多練多思考, 共勉~
▼ 點擊成為社區註冊會員 「在看」一下,一起PY