有用的 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

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

科技分類資訊推薦

硬核出擊!Jeep與《侏羅紀世界》聯名款新車正式上市 - 天天要聞

硬核出擊!Jeep與《侏羅紀世界》聯名款新車正式上市

當硬核越野精神邂逅全球頂級IP,沉睡6500萬年的野性基因再度覺醒。2025年7月2日,Jeep圍繞電影《侏羅紀世界:重生》開啟跨界聯名合作,並發布兩款終極探索座駕——Jeep牧馬人侏羅紀世界探索版與Jeep角鬥士侏羅紀世界探索版。
十多年未解謎症,ChatGPT一語道破病因?微軟:「醫療超級智能」漸近 - 天天要聞

十多年未解謎症,ChatGPT一語道破病因?微軟:「醫療超級智能」漸近

《科創板日報》7月6日訊 十多年未解的疑難雜症,竟被AI一語道破病因?這個看似有些科幻的故事,來自一位網友在Reddit上分享的經歷,OpenAI總裁兼聯合創始人Greg Brockman也在今日轉發了這一事件。在這則Reddit帖子中,這位網友表示,十多年來自己一直被多種不明癥狀困擾。為此他做過脊椎核磁共振、CT 掃描、全套血液檢查(...
坐標北京,如何在體感40℃+的「桑拿天」保持優雅? - 天天要聞

坐標北京,如何在體感40℃+的「桑拿天」保持優雅?

最近咱們北京的天氣,可以說是「水深火熱」——早上出門像蒸桑拿,下午陣雨說來就來,晚上悶得睡不著覺。很多網友在後台留言「這天氣也太難熬了!」。高濕天氣連續多日達到90%以上的濕度,讓很多市民朋友高呼「難道回南天來了嗎?」今天,我們特意針對這個熱門話題,為大家詳細普及「回南天」和「桑拿天」的區別,還會教您...
徹底火了,庫存告急!訂單已排到半月後 - 天天要聞

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

近期,「充電寶召回」 事件引發廣泛關注,3C認證已成為消費者衡量充電寶品質的關鍵指標,國內部分機場也加強了對充電寶3C標識的查驗力度。央視財經記者探訪發現,線下市場和電商平台帶有3C標識的充電寶產品銷量都出現增長。