Python 簡潔編碼之道

2022-01-23 Python中文社區

隨著網際網路技術的發展, 現如今信息爆炸越來越明顯, 大家在工作中需要接觸及學習的技術點也是越來越多. 在這種大背景的情況下, 以號稱「簡潔」著稱的 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 開發者都應該反覆閱讀、理解、記憶、運用的信條.

2. PEP8 和 Google Python Style Guild

PEP8 一定要讀幾次, 有些規範記不住沒關係, 可以多使用 pylint 檢查工具來給檢查代碼,  Google Python Style Guild 也是非常值得大家熟讀的

寫在最後

讀過這些信條和資料, 最重要還是自己要能保持不斷優化自己代碼的念頭, 才能在一次次的編碼過程中, 不斷打磨自己的編碼能力, 最終做到把「簡潔」的理念深入自己的編碼能力中.

多看多練多思考, 共勉~

▼ 點擊成為社區註冊會員          「在看」一下,一起PY

相關焦點

  • python入門教程06-01(python語法入門之字符編碼)
    解釋器執行文件的流程以python test.py為例,執行流程如下#階段1、啟動python解釋器,此時就相當於啟動了一個文本編輯器#階段2、python解釋器相當於文本編輯器,從硬碟上將test.py的內容讀入到內存中#階段3、python解釋器解釋執行剛剛讀入的內存的內容,開始識別python語法2.4 總結python解釋器與文件本編輯的異同如下
  • python編碼總結(編碼類型、格式、轉碼)
    【python命令行編碼(系統編碼)】用python自帶的locale模塊來檢測命令行的默認編碼(也就是系統的編碼)和設置命令行編碼:123456import localeprint locale.getdefaultlocale
  • python基礎學習—04字符串與編碼
    字符串與編碼一、了解計算機編碼1.1  編碼
  • 我的 Python 編碼規範
    /usr/bin/env python# -*- coding: utf-8 -*-"""通常這裡是關於本文檔的說明(docstring),須以半角的句號、 問號或驚嘆號結尾!解釋器聲明編碼格式聲明模塊注釋或文檔字符串模塊導入常量和全局變量聲明頂級定義(函數或類定義)執行代碼編碼格式聲明通常,編碼格式聲明是必需的。
  • 深入淺出 + 徹底理解 Python 編碼
    本文的目的是簡明扼要地說明python的編碼機制,並給出一些建議。問題1:問題在哪裡?問題是我們的靶子,心中沒有問題去學習就會抓不住重點。本文使用的編程環境是centos6.7,python2.7。此時,python程序就會用它自己默認的編碼當作s的編碼,進而來識別s中的內容。這個默認的編碼是ASCII,所以,它會用ASCII來解釋這個01串,識別出字符串的內容,再將這個字符串轉為utf-8編碼。好了,程序碰到的第一個字節就是E4(11100101 ),傻眼! ASCII編碼中沒有這玩意兒,因為ASCII編碼中字節第一位都是0。怎麼辦?
  • python字符的編碼與解碼
    下面就來通過python中自帶的函數一起來驗證一下。理解:ord() 函數:以一個字符串作為參數,返回對應的 ASCII 數值。chr()函數:用一個整數作參數,返回一個對應的字符。可以二進位,十進位,十六進位。
  • Python編碼規範匯總
    文章目錄編碼格式聲明縮進引號空行導入模塊命名規範編碼格式聲明通常,編碼格式聲明是必需的。如果 python 源碼文件沒有聲明編碼格式,python 解釋器會默認使用 ASCII 編碼,一旦源碼文件包含非ASCII編碼的字符,python 解釋器就會報錯。以 UTF-8 為例,以下兩種編碼格式聲明都是合乎規則的縮進統一使用 4 個空格進行縮進。絕對不要用tab, 也不要tab和空格混用。對於行連接的情況,我一般使用4空格的懸掛式縮進。
  • python自學 第二章 python語言基礎之語法特點(注釋、代碼縮進、編碼規範)
    python帶給我們的簡單、快樂!今天我們主要學習python基礎的語法特點。在python中,通常包含3種類型的注釋,分別為單行注釋、多行注釋和中文編碼聲明注釋。例如:''' @功能:XXXX項目 @author:WEB前端修行日誌 @創建時間:2021-01-10'''print('''人生苦短,我用python''')3、中文編碼聲明注釋在Python中提供一種特殊的中文編碼聲明注釋
  • 【Python基礎】(6.1)字符編碼
    #階段3、python解釋器解釋執行剛剛讀入的內存的內容,開始識別python語法##2.4 總結python解釋器與文件本編輯的異同如下#1、相同點:前兩個階段二者完全一致,都是將硬碟中文件的內容讀入內存,詳解如下python解釋器是解釋執行文件內容的,因而python解釋器具備讀py文件的功能,這一點與文本編輯器一樣#2、不同點:在階段3時,針對內存中讀入的內容處理方式不同,詳解如下文本編輯器將文件內容讀入內存後,是為了顯示或者編輯,根本不去理會python的語法,而python解釋器將文件內容讀入內存後
  • Python 編碼為什麼那麼蛋疼?
    作者:劉志軍,6年+Python使用經驗, 高級開發工程師,目前在網際網路醫療行業從事Web系統構架工作個人公眾號:Python
  • Python 2.x 字符編碼終極指南
    (點擊上方公眾號,可快速關注)來源:伯樂在線專欄作者 - selfboot 如有好文章投稿,請點擊 → 這裡了解詳情如需轉載,發送「轉載」二字查看說明在人機互動之字符編碼至於什麼是 ASCII,UTF-8等,在人機互動之字符編碼 中有詳細的說明,這裡不再贅述。下面結合具體的例子,來看看編碼、解碼的細節問題。python2.x 中的字符串在程序設計中,字符串一般是指一連串的字符,比如hello world!、你好或者もしもし(日語)等等。
  • Pythonic——Python修煉之道
    一份充滿了C++味道的Python代碼應運而生。正當小碼正沉浸於磚搬完後的歡喜之時,Code Review被打回了,原因為代碼非常不Pythonic。小碼趕緊詢問大佬,什麼是Pythonic,大佬給了一本秘籍《Pythonic——Python修煉之道》。
  • 給妹子講python-S01E08理清python中的字符編碼方法
    作者:醬油哥/ 清華程序猿       微信公眾號: python數據科學家 知乎專欄: 《給妹子講python》
  • python如何編碼解碼解析json對象
    前言json是一種以鍵值對形式存在的輕量級的數據結構,和python中的字典類型具有相同的表現結構。使用 JSON 函數需要導入 json 庫:import json。在Java中我們知道json有jsonObject和jsonArray,且可以通過String、map等相互轉換,那麼在python中,json對象是如何來讀取解析的呢?python解析json對象1.json.dumpsjson.dumps用於將 Python 對象編碼成 JSON 字符串。
  • python 輸出編碼錯誤問題
    /usr/bin/python#-*-coding:utf-8 -*-a={'name': 'fengshou'}b={'name': '豐收'}原因:這是因為win的,命令行用的是cp936編碼,而上面腳本用的是utf-8編碼,因此導致亂碼。解決方法是,使用decode和encode函數對字符重新解碼和編碼。
  • Python 編碼錯誤的本質原因
    字符集字符集(Character Set)就是某個範圍內字符的集合,不同的字符集規定了字符的個數,比如 ASCII 字符集總共有128個字符,包含了英文字母、阿拉伯數字、標點符號和控制符。而 GB2312 字符集定義了7445個字符,包含了絕大部分漢字字符。
  • Python3 是如何解決棘手的字符編碼問題的?
    已經介紹過 Python2 字符串設計上的一些缺陷:當然這並不算 Bug,只要處理的時候多留心也可以避免這些坑。但在 Python3 兩個問題都很好的解決了。>>> b"a"+b"c"b'ac'>>> b"a"*2b'aa'>>> b"abcdef\xd6"[1:]b'bcdef\xd6'>>> b"abcdef\xd6"[-1]214>>> b"a" + "b"Traceback (most recent call last):  File "<
  • Python高效編程之88條軍規(1):編碼規範、字節序列與字符串
    在微信公眾號「極客起源」中輸入595586,可學習全部的《Python高效編程之88條軍規》系列文章。
  • 10個簡潔的Python編碼技巧
    使用zip迭代多個列表 不推薦: 推薦: 這就是一些使用python的小技巧。遵循良好的編程風格,做一個優秀的程式設計師!
  • 給妹子講python-S01E07字符編碼歷史觀:從ASCII到Unicode
    作者:醬油哥/ 清華程序猿       微信公眾號: python數據科學家 知乎專欄: 《給妹子講python》