-3 python python-3.x python-3.6
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)
Run Code Online (Sandbox Code Playgroud)
为什么人可以这样写filter()函数?第一个参数接受两个函数作为参数
每个filter都采用一个谓词(确定元素是否为成员的函数),但有两个过滤器。这相当于:
numbers = filter(lambda x: type(x) == int or type(x) == float, L)
return list(filter(lambda x: x%2 == 0, numbers))
Run Code Online (Sandbox Code Playgroud)
然而,这是令人难以置信的可怕。首先,L不应该是异构的。如果是这样,我们可能在代码库的其他地方做了一些不好的事情。即使是这种情况,由于我们之后要强制转换为列表,因此我们应该只使用列表推导式开始。
return [x for x in L if isinstance(x, (int, float)) and x%2==0]
Run Code Online (Sandbox Code Playgroud)
在这里,我还使用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
Run Code Online (Sandbox Code Playgroud)
但是我必须强调,像这样的代码是代码库中其他地方出错的标志。您的函数不应该在处理对象之前测试类型——它应该尽可能是类型安全的,即使在 Python 中也是如此。