簡體   English   中英

有人可以為我解釋這個 filter() 函數嗎?

[英]can someone explain this filter() function for me?

def only_even(L):

    return list(filter(lambda x: x%2==0,filter(lambda x:type(x) == int or type(x) == float,L)))

a = only_even([1,2,3,46,"String", "noch ein String", 2.0, True, [2,4]])
print(a)

為什么 man 可以這樣編寫filter()函數? 第一個參數接受兩個函數作為參數

每個filter采用一個謂詞(確定元素是否為成員的函數),但有兩個過濾器。 這相當於:

numbers = filter(lambda x: type(x) == int or type(x) == float, L)
return list(filter(lambda x: x%2 == 0, numbers))

然而,這是令人難以置信的可怕。 首先, L不應該是異質的。 如果是這樣,我們可能在代碼庫的其他地方做了一些不好的事情。 即使是這種情況,由於我們之后要強制轉換為列表,因此我們應該只使用列表推導式開始。

return [x for x in L if isinstance(x, (int, float)) and  x%2==0]

在這里,我還使用isinstance在一次調用中檢查任一類型,而不是通過相等性比較type(x)兩次。

或者,您可以明確地編寫它,它不那么簡潔但更易於閱讀

evens = []
for candidate in L:
    try:
        if candidate % 2 == 0:
            evens.append(candidate)
    except TypeError:
        # "candidate" is not a number -- ignore it
        pass
return evens

但是我必須強調,像這樣的代碼是代碼庫中其他地方出錯的標志。 您的函數不應該在處理對象之前測試類型——它應該盡可能是類型安全的,即使在 Python 中也是如此。

filter()方法有兩個參數:

function - 測試可迭代元素是否返回 true 或 false 的函數 如果None ,則該函數默認為 Identity 函數 - 如果任何元素為 false 則返回 false

iterable - 要過濾的可迭代對象,可以是任何迭代器的集合、列表、元組或容器。

filter()方法返回可迭代的。

在您的情況下,該函數被定義為一個 lambda,它檢查數字是否為偶數( lambda x: x%2==0 )。 可迭代對象根據類型進行過濾,僅接受整數和浮點數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM