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