第一次見這樣的語法
本人之前一直是Java工程師,最近接觸了一個Python項目,第一次看到如下的代碼:
i = sum(letter in target_arr for letter in source_arr)
這條語句是計算source 與 target 數組中有幾個單詞是相同的。
當我第一眼看到這樣的寫法的時候,我的第一感覺是這樣的。
我讀書少,見識少,那是真不懂,于是趕緊孤狗一下,想要一探究竟。
原來這叫:生成器表達式
生成器表達式語法
生成器表達式(Generator Expression)是一種簡潔高效地創建迭代器(Iterator)的方式。它類似于列表推導式(List Comprehension),但生成器表達式使用圓括號 () 而不是方括號 []。
生成器表達式的語法
(expression for item in iterable if condition)
-
expression:對每個元素進行的操作,生成迭代器中的值。
-
item:迭代變量,表示可迭代對象 iterable 中的每個元素。
-
iterable:可迭代對象,例如列表、元組、字符串等。
-
condition:可選的過濾條件,只有滿足條件的元素才會被處理。
生成器表達式的特點 -
惰性求值: 生成器表達式不會一次性計算所有元素,而是按需生成。這樣可以節省內存,特別是在處理大量數據時。
-
返回迭代器: 生成器表達式返回一個迭代器對象,可以通過 for 循環或 next() 函數來遍歷其中的元素。
-
不可索引: 迭代器不支持索引操作,不能像列表那樣通過下標訪問元素。
生成器表達式的應用 -
過濾數據:
even_numbers = (x for x in range(10) if x % 2 == 0) # 偶數 -
映射數據:
squares = (x**2 for x in range(5)) # 平方數 -
組合數據:
pairs = ((x, y) for x in [1, 2] for y in [3, 4]) # [(1, 3), (1, 4), (2, 3), (2, 4)] -
傳遞給函數:
sum(x for x in range(100) if x % 3 == 0) # 3 的倍數之和
生成器表達式 vs. 列表推導式
特點 | 生成器表達式 | 列表推導式 |
---|---|---|
返回值 | 迭代器對象 | 列表 |
惰性求值 | 是 | 否 |
內存占用 | 低 | 高 |
適用場景 | 處理大量數據、只需遍歷一次的數據 | 需要多次訪問數據、需要索引操作的數據 |
案例分析
回到我們的案例中來,我們根據語法解釋對我們文章開始的案例進行拆解。
i = sum(letter in target_arr for letter in source_arr)
(expression for item in iterable if condition)對應關系
語法元素 | 生成器表達式中的元素 | 解釋 |
---|---|---|
expression | letter in target_arr | 對于每個 letter,判斷它是否存在于target_arr 中,返回布爾值 |
item | letter | 迭代變量,表示 source_arr 中的每個元素 |
iterable | source_arr | 可迭代對象,源字符串數組 |
condition | (無) | 此處沒有過濾條件,所有 letter 都會被處理 |
總結
- 生成器表達式會遍歷 source_arr 中的每個 letter。
- 對于每個 letter,計算 letter in target_arr,得到一個布爾值(True 或 False)。
- sum 函數將這些布爾值相加,得到匹配的總次數,即 match_score。
注意事項
- 這里沒有使用 if condition 部分,表示不對元素進行過濾,所有元素都會參與計算。
- 由于 Python 中 True 被視為 1,False 被視為 0,所以 sum 函數可以直接對布爾值求和。
希望這個詳細的語法講解能幫助您更好地理解生成器表達式的語法和用法!
關注我的公眾號
歡迎大家關注、點贊、轉發,一起交流軟件開發、架構設計、云原生技術。