1. 程式人生 > >【Tips】Python 針對函數返回值實現列表推導

【Tips】Python 針對函數返回值實現列表推導

ons bsp 返回 大於 question span append 副作用 get

背景

設想這樣一個場景,我們定義函數foo來生成一個大於0的隨機code。但是函數執行可能會出現異常,對於異常情況我們指定函數返回-1。

在批量處理的情況下,我們想要得到所有成功執行的foo函數的返回值集合,而忽略返回-1的情況。基本的邏輯如下:

result = []

for item in item_lst:
    code = foo(item)
    if code != -1:
        result.append(code)

使用列表推導的解決方案

如果想用列表推導的方式實現,有下面幾種解決方案:

Solution 1:

result = [foo(item) for
item in item_lst] result = [code for code in result if code != -1]

先用列表推導獲取到了函數的返回值,然後再執行一次篩選,需要執行兩次列表推導。

Solution 2:

result = [foo(item) for item in item_lst if foo(item) != -1]

執行一次列表推導,但是很明顯,foo函數執行了兩次。如果foo函數比較耗時,或者多次執行會產生副作用的話都會有問題。

Solution 3:

result = [code for code in (foo(item) for item in
item_lst) if code != -1]

使用 生成器表達式 來處理中間結果,不需要臨時列表,並且是基於叠代器的,優於上面兩種方法。

參考

  1. How to execute a filter by function return value in list comprehension?

【Tips】Python 針對函數返回值實現列表推導