有用的 Python 提示和技巧 — #5

2024年12月05日04:43:03 科技 1221

·

有用的 Python 提示和技巧 — #5 - 天天要聞

推導式和利用文檔字符串

文檔字符串是 Python 代碼文檔的關鍵組成部分。它們提供了一種簡單且標準化的方式來記錄模塊、函數、類和方法,使開發人員能夠了解代碼組件的用途和功能。在 Python 中,文檔字符串只是用三引號(「」「''')括起來的字符串文字,直接放置在它記錄的元素下方。Python 的內置 help() 函數和文檔生成工具(如 Sphinx)利用文檔字符串,使其成為可維護和可訪問代碼的基礎。

語法和約定

文檔字符串通常遵循 Python 的 PEP 257 樣式指南推薦的特定結構:

def example(param1, param2):
    """
    Brief description of what the function does.

    More detailed explanation if needed, including any
    edge cases or considerations.
    
    Args:
        param1 (type): Explanation of param1.
        param2 (type): Explanation of param2.
    Returns:
        type: Explanation of the return value.
    Raises:
        exceptionType: Explanation of when the exception is raised.
    """
    ...

這種結構化方法增強了可讀性,並幫助工具提取有用的元數據。值得注意的是,第一行應提供函數用途的簡要概述,因為某些工具僅提取此初始行進行摘要。

單行文檔字符串非常適合簡單的函數或方法,其中一行就足以描述目的。

def add(x, y):
    """Add two numbers and return the result."""
    return x + y

可以使用其內置的 help() 函數或 __doc__ 屬性來訪問文檔。

help(add) # or example.__doc__
add.__doc__ # or example.__doc__

通過遵守這些實踐,Python 開發人員可以創建文檔齊全、可維護的代碼,從而簡化新貢獻者的開發和入門流程。

doctest:在文檔中進行測試

Python 中的 doctest 模塊允許您將代碼作為其文檔的一部分進行測試,這使其成為快速驗證示例和確保您的文檔準確的便捷而強大的工具。通過在文檔字符串中嵌入可測試的代碼示例, doctest 會運行這些示例以確認它們按描述工作。這有助於防止文檔中的代碼腐爛,因為示例與實際代碼行為不一致。

doctest的工作原理

要使用 doctest,只需在函數、方法或模塊文檔字符串中以 Python 交互式會話的形式添加示例。每個示例都以 >>>(Python REPL 提示符)開頭,預期輸出緊隨其後。當 doctest 運行時,它會將實際輸出與預期輸出進行比較,並標記任何不匹配。

def add(a: int, b: int) -> int:
    """
    Calculate the sum of two numbers.
  
    Example:
    >>> add(2, 3)
    5
    >>> add(-1, 1)
    0
    >>> add(4.5, 1.5)
    6.0
    """
    return a + b

當您運行 doctest 時,它將執行文檔字符串中的代碼並驗證結果是否匹配。您可以從命令行在此腳本上調用 doctest

python -m doctest <filename>.py

或者,您可以在腳本中添加 doctest.testmod() 以在模塊作為腳本執行時自動運行測試:

if __name__ == "__main__":
    import doctest
    doctest.testmod()

雖然 doctest 很方便,但它並不能完全替代更廣泛的測試框架,例如 unittestpytest 。它最適合沒有複雜設置、拆解或高級斷言的簡單情況。它還可能難以處理略有不同的輸出(如浮點結果或非確定性輸出)。

請參閱 add 函數的綜合文檔以了解
有關 DocString 中附加的有關其用法的更多信息。

def add(a, b):
    """
    Calculate the sum of two numbers.

    This function takes two numeric inputs, `a` and `b`, and returns their sum.
    
    It is suitable for integers and floating-point numbers.
    
    Parameters:
      a (int or float): The first number to add.
      b (int or float): The second number to add.
    
    Returns:
      int or float: The sum of `a` and `b`.
    
    Example:
    >>> add(2, 3)
    5
    >>> add(-1, 1)
    0
    >>> add(4.5, 1.5)
    6.0
    """
    return a + b

doctest 合併到您的工作流程中可以使您的代碼更可靠,文檔更值得信賴,從而使其他人能夠有效地理解和驗證代碼行為。

推導式

Python 推導式是以簡潔、可讀的方式創建和操作數據的強大工具。此技術允許您直接從其他序列構建序列(如列表、字典或集),所有這些都在一行代碼中完成。與使用 Loop 相比,這可能是一個顯著的改進。

列表推導式

列表推導式是最常見的類型,通常用於基於現有列表或範圍創建列表。

創建 0 到 9 的方格列表的示例 hwo:

# Syntax: [expression for item in iterable if condition]

squares = [x**2 for x in range(10)]
# Output: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

上面的推導式從 range(10) 中取出每個數字,將其平方,並將其添加到 squares 列表中。您還可以包含條件語句來篩選元素。

如何添加條件以僅包含偶數個方塊的示例:

even_squares = [x**2 for x in range(10) if x % 2 == 0]
# Output: [0, 4, 16, 36, 64]

這允許您以高度可讀的方式創建篩選和轉換的列表。

詞典推導

字典推導式對於從序列動態創建字典非常有用。語法類似於列表推導式,但使用鍵值結構。

創建 0 到 9 的平方字典的示例 hwo:

# Syntax: {key_expression: value_expression for item in iterable if condition}

squares_dict = {x: x**2 for x in range(10)}
# Output: {0: 0, 1: 1, 2: 4, 3: 9, ..., 9: 81}

您還可以像對待列表推導式一樣將條件應用於字典推導式。

集合推導式

集合推導式的工作方式與列表推導式類似,但生成的是集合而不是列表。集是無序的,會自動刪除重複值,因此當您需要唯一的結果時,這非常有用。

如何為數字 0 到 9 創建一組正方形的示例:

# Syntax: {expression for item in iterable if condition}

squares_set = {x**2 for x in range(10)}
# Output: {0, 1, 4, 9, 16, 25, 36, 49, 64, 81}

您還可以像對待列表推導式一樣將條件應用於字典推導式。

生成器推導式

生成器推導式類似於列表推導式,但創建的是生成器而不是列表。生成器一次生成一個項目,並且僅在需要時生成,從而使它們具有內存效率,尤其是對於大型數據集。如果您只需要迭代一次數據,或者數據集太大而無法一次全部放入內存,這將特別有用。

生成器推導式的語法使用括號 () 而不是方括號 [] 或大括號 {}

如何為數字 0 到 9 的平方創建生成器的示例:

# Syntax: (expression for item in iterable if condition)


squares_gen = (x**2 for x in range(10))

在此示例中,squares_gen 是一個生成器對象,僅當迭代每個正方形時,它才會生成每個正方形。

for square in squares_gen:
    print(square)

# Output: 0, 1, 4, 9, 16, 25, 36, 49, 64, 81

但是,請記住,生成器推導式只能迭代一次。如果需要多次訪問元素,則列表推導式可能更合適。

科技分類資訊推薦

徹底火了,庫存告急!訂單已排到半月後 - 天天要聞

徹底火了,庫存告急!訂單已排到半月後

近期,「充電寶召回」 事件引發廣泛關注,3C認證已成為消費者衡量充電寶品質的關鍵指標,國內部分機場也加強了對充電寶3C標識的查驗力度。央視財經記者探訪發現,線下市場和電商平台帶有3C標識的充電寶產品銷量都出現增長。
理髮店陷入倒閉潮?不是沒客人,也不是電商衝擊,是自己作垮了 - 天天要聞

理髮店陷入倒閉潮?不是沒客人,也不是電商衝擊,是自己作垮了

很多人抱怨行業不好,再加上電商衝擊,所以經營起來也是相當困難。可是有這麼一個行業,電商根本進駐不進來。在這個行業,大家經營全靠本事,誰有能力誰賺錢。但是即便是這樣,為了賺塊錢,行業內的人還是將這個行業給徹底做臭了。各種各樣的套路層出不窮,甚
大疆OSMO 360 完整規格 7月29日發佈 - 天天要聞

大疆OSMO 360 完整規格 7月29日發佈

對於那些一直在等待大疆 Osmo 360 的人來說,聽到在本月底7月29日開售的消息,你們一定會很高興。今天我偶然發現了這兩款產品的完整網店描述和圖片已經上線。所以,我們先來深入了解一下那款「革命性 8K」 Osmo 360 的描述。
iPhone一鍵降溫?蘋果這隱藏模式有點過分啊 - 天天要聞

iPhone一鍵降溫?蘋果這隱藏模式有點過分啊

為了解決發熱這亘古難題,手機廠商絞盡腦汁,往手機里塞散熱膜、均熱板、填充硅脂,甚至還用上了主動風扇。 但到了夏天三四十度的室外,該發熱還是發熱,該燙手還是燙手。 國產安卓如此。 ....
三星Galaxy S26Ultra不裝了,性能太炸裂了! - 天天要聞

三星Galaxy S26Ultra不裝了,性能太炸裂了!

三星Galaxy S26 Ultra即將亮相,帶來多方面升級。·該機型將採用6.9英寸QHD+LTPO AMOLED顯示屏,支持120Hz自適應刷新率和3000尼特峰值亮度,確保在各種光照條件下都能提供清晰的視覺體驗。
中集洋山集裝箱第三季度訂單飽滿 開拓氫能集成裝備求新|公司調研 - 天天要聞

中集洋山集裝箱第三季度訂單飽滿 開拓氫能集成裝備求新|公司調研

財聯社7月5日訊(記者 胡皓瓊)中美關稅緩和之下,外貿企業對美出貨恢復,帶動中集洋山集裝箱製造訂單增長。集裝箱製造廠在提升自動化水平的同時,為提高自身抗風險能力,還正布局新賽道。財聯社記者近日走訪中集集團(000039.SZ)旗下中集洋山,眼見一片片鋼板,經歷衝壓、焊接組裝、打砂等一道道工序,逐漸成形。產線上布...