[英]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.