·
推導式和利用文檔字元串
文檔字元串是 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 很方便,但它並不能完全替代更廣泛的測試框架,例如 unittest 或 pytest 。它最適合沒有複雜設置、拆解或高級斷言的簡單情況。它還可能難以處理略有不同的輸出(如浮點結果或非確定性輸出)。
請參閱 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
但是,請記住,生成器推導式只能迭代一次。如果需要多次訪問元素,則列表推導式可能更合適。