在 Python 中,filter
函数是一种内置的高阶函数,它可能承受一个函数和一个迭代器,而后返回一个新的迭代器,这个新的迭代器仅蕴含使给定函数返回 True 的原始元素。这个性能在许多状况下都十分有用,比方当你须要从一个大的数据集中筛选出满足某些条件的数据时。
一、filter 函数的根本用法
在最根本的模式中,filter
函数承受一个函数和一个迭代器,并返回一个新的迭代器,其中蕴含原始迭代器中使给定函数返回 True 的元素。这个函数通常被称为 ” 谓词 ”,因为它应该返回一个布尔值。
这是一个简略的例子:
def is_even(n):
return n % 2 == 0
numbers = [1, 2, 3, 4, 5, 6]
even_numbers = filter(is_even, numbers)
print(list(even_numbers)) # 输入:[2, 4, 6]
在这个例子中,咱们首先定义了一个函数 is_even
,这个函数承受一个数字并查看它是否是偶数。而后,咱们创立了一个列表numbers
。接着,咱们应用filter
函数和 is_even
函数来从 numbers
列表中筛选出偶数。最初,咱们将 filter
对象转换为列表并打印后果。
二、应用匿名函数与 filter 函数
你能够应用匿名函数(也称为 lambda 函数)作为 filter
函数的第一个参数。这在你只须要在一个中央应用函数,并且函数的逻辑非常简单时十分有用。
上面是一个应用匿名函数的例子:
numbers = [1, 2, 3, 4, 5, 6]
even_numbers = filter(lambda x: x % 2 == 0, numbers)
print(list(even_numbers)) # 输入:[2, 4, 6]
在这个例子中,咱们间接在 filter
函数调用中定义了一个匿名函数。这个匿名函数承受一个数字并查看它是否是偶数。这与后面的例子完全相同,然而更加简洁。
三、应用 filter 函数解决简单数据结构
filter
函数也能够解决更简单的数据结构。例如,如果你有一个蕴含字典的列表,你能够应用 filter
函数来筛选出满足某些条件的字典。
上面是一个例子,咱们应用 filter
函数筛选出年龄大于 30 的人:
data = [{'name': 'Alice', 'age': 25}, {'name': 'Bob', 'age': 30}, {'name': 'Charlie', 'age': 35}]
old_people = filter(lambda x: x['age'] > 30, data)
print(list(old_people)) # 输入:[{'name': 'Charlie', 'age': 35}]
在这个例子中,咱们首先定义了一个蕴含字典的列表 data
,每个字典代表一个人,并含有他们的名字和年龄。而后咱们应用filter
函数和一个匿名函数来筛选出年龄大于 30 的人。
四、性能思考
尽管 filter
函数能够不便地筛选数据,但如果你解决的数据集十分大,你可能须要思考性能问题。因为 filter
函数返回的是一个迭代器,所以它只在须要的时候解决数据,这能够节俭大量内存。
然而,如果你须要频繁地拜访筛选后的数据,或者须要在多个中央应用它,你可能会发现间接应用列表推导式更加高效。这是因为 filter
函数每次迭代都会调用函数,而列表推导式则会立刻计算结果。
上面是一个应用列表推导式实现的和后面例子雷同的筛选操作:
numbers = [1, 2, 3, 4, 5, 6]
even_numbers = [n for n in numbers if n % 2 == 0]
print(even_numbers) # 输入:[2, 4, 6]
五、总结
filter
函数是 Python 中的一种弱小的工具,能够帮忙你不便地筛选数据。尽管它可能不如列表推导式在所有状况下都高效,但在解决大数据集或者简单数据结构时,filter
函数能够是一个十分有用的工具。