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

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

科技分類資訊推薦

尊界S800全球首發融合感知充電機器人,引領充電技術革新 - 天天要聞

尊界S800全球首發融合感知充電機器人,引領充電技術革新

尊界S800全球首發融合感知充電機器人,引領充電技術革新。尊界S800作為華為與江淮合作的首款車型,其無人超快充功能備受矚目。該車型搭載的華為融合感知充電機器人,實現了全程無人自動化的充電體驗。用戶只需遠程操作,一鍵開啟充電模式,車輛便會自
都市解壓神車?領克Z20讓年輕消費者直呼過癮 - 天天要聞

都市解壓神車?領克Z20讓年輕消費者直呼過癮

當前時代背景下,年輕人正承受著多方面的重壓,內卷現象如同無形的枷鎖,緊緊環繞著他們。長時段的996工作模式,使得他們的生活幾乎完全被工作所佔據,個人閑暇時間寥寥無幾。同時,催婚也像影子一樣緊跟著他們,持續帶來煩惱。在此情境之下,年輕人亟需探尋出行之有效的方式來
不愧是史上最強暢享,華為暢享 70X開售:衛星通信+超長續航 - 天天要聞

不愧是史上最強暢享,華為暢享 70X開售:衛星通信+超長續航

在很多人的印象中,千元機在外觀設計、硬體配置等方面都不會有太多的驚喜,基本能夠滿足日常使用就已經相當不錯了。但伴隨著今日華為暢享 70X的開售,大眾消費者可能要重新審視千元機市場了。因為,華為暢享 70X不僅全系標配了雙向北斗衛星消息,而且還實現了外觀、影像、通信、續航等多方面的升級,並且售價僅為1799元起,...
特斯拉Model Y上新喊話「儘管對比」,雷軍:好的 - 天天要聞

特斯拉Model Y上新喊話「儘管對比」,雷軍:好的

1月10日,煥新Model Y正式登陸特斯拉中國官網,同時上線首發版車型,預售價26.35萬元起。特斯拉官方霸氣喊話「儘管對比」,稱能夠超越Model Y的,只有煥新Model Y。對於特斯拉Model Y的上線,雷軍帶「小米YU7」話題轉發特斯拉推文《煥新Model Y,儘管對比》並評論:「好的。」網友們紛紛回復:「好有底氣的倆字」「好調皮一...
三星 One UI 8 初露端倪:基於安卓 16,引入支持貼花著色器 - 天天要聞

三星 One UI 8 初露端倪:基於安卓 16,引入支持貼花著色器

IT之家 1 月 10 日消息,科技媒體 smartprix 昨日(1 月 9 日)發布博文,報道稱三星雖未正式發布 One UI 7.0,但已有早期線索表明三星內部正在開發 One UI 8.0。三星 One UI 8.0 更新預計將基於安卓 16,本次曝光的代碼並未透露太多內容,主要引入支持貼花著色器(Decal Shader)。IT之家註:在安卓平台上
國內首個自主升降海洋牧場平台「湛農 1 號」建成 - 天天要聞

國內首個自主升降海洋牧場平台「湛農 1 號」建成

IT之家 1 月 10 日消息,中國交建宣布,近日廣航局承建的國內首個自主升降海洋牧場平台、廣東省規模最大的座底式桁架智能養殖平台 ——「湛農 1 號」最後一組網箱成功安裝就位,標誌著該平台整體建設完成,具備投入使用條件。IT之家查詢獲悉,該項目位於廣東省湛江市雷州市,養殖平台由 3 組矩形模塊共 6 個網箱組合而成,...
AI大模型的秘密:它是如何學習並改變世界的? - 天天要聞

AI大模型的秘密:它是如何學習並改變世界的?

在過去幾年中,「大模型」一詞頻繁出現在科技領域的頭條中,從系列模型到MidJourney、Stable Diffusion,這些AI技術不再僅僅是技術人員的研究對象,而是逐漸融入我們的日常生活。那麼,大模型的核心秘密是什麼?它如何學習並改變