Python的filter()函数详解和使用方法示例
Python中的filter()函数是一个内置函数,用来筛选序列中符合条件的元素。它的使用方式非常简单,可以通过lambda表达式或者其他可调用对象指定一个布尔判断规则,对目标序列的每个元素进行判断,并保留符合条件的元素。本文将详细讲解filter()函数的用法,并给出几个简单易懂的示例。
1.函数的基本语法
首先我们需要了解一下filter()函数的基本语法:
filter(function, iterable)
其中,function是一个用于过滤的函数,需要返回True或False;iterable是一个序列,可以是列表、元组、集合等。filter()函数返回的是一个迭代器对象,其中包含符合条件的元素。
2.使用lambda表达式过滤序列
lambda表达式可以让我们方便地定义一个简单的函数,通常用于对序列中的元素进行计算或者判断。下面我们以lambda表达式为例,演示一下如何使用filter()函数过滤序列。
假设我们有一个包含0到9的整数列表,我们只希望保留其中的偶数元素,可以使用以下代码:
nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
even_nums = filter(lambda x: x % 2 == 0, nums)
print(list(even_nums))
这段代码中,我们首先定义了一个整数列表nums,然后使用lambda表达式定义了一个函数,它的参数为x,当x能够被2整除时返回True,否则返回False。最后我们调用了filter()函数,将nums作为第二个参数传入该函数,并将返回的迭代器对象转换为列表输出。
输出结果为[0, 2, 4, 6, 8],正是我们希望保留的偶数元素。
3.使用其他可调用对象过滤序列
除了lambda表达式,我们还可以使用其他可调用对象来定义过滤函数。例如下面这个示例中,我们使用一个普通的函数来判断字符串中是否包含指定的字符:
def contains_ab(string):
return 'a' in string or 'b' in string
strings = ['hello', 'world', 'apple', 'banana']
filtered_strings = filter(contains_ab, strings)
print(list(filtered_strings))
在这个示例中,我们定义了一个contains_ab()函数,它的参数为一个字符串string,当该字符串中包含字符'a'或'b'时返回True,否则返回False。然后我们将该函数作为filter()函数的 个参数传入,将字符串列表作为第二个参数传入,并将返回的迭代器对象转换为列表输出。
输出结果为['apple', 'banana'],这两个字符串中均包含字符'a'或'b'。
4.使用filter()函数去除序列中的空值
有时候我们需要从序列中删除空值,可以使用filter()函数来实现。以下是一个简单的示例:
values = ['hello', '', 'world', None, 'python', '']
filtered_values = filter(None, values)
print(list(filtered_values))
在这个示例中,我们将None作为函数参数传入filter()函数,因为None可以被看作是一个布尔值False,所以它会对序列中的每个元素进行判断,删除空值并返回一个新的迭代器对象。
输出结果为['hello', 'world', 'python'],空值已经被成功删除了。
5.filter()函数的高级用法
除了上述简单的用法,filter()函数还有一些高级用法,可以更加灵活地满足不同的需求。以下是一些示例:
(1)多个序列进行筛选
我们可以使用zip()函数将多个序列打包为一个元组列表,并将其作为filter()函数的第二个参数传入。下面是一个示例:
nums1 = [1, 2, 3, 4, 5]
nums2 = [10, 20, 30, 40, 50]
filtered_nums = filter(lambda x: x[0] + x[1] < 30, zip(nums1, nums2))
print(list(filtered_nums))
在这个示例中,我们定义了两个整数列表nums1和nums2,然后使用lambda表达式定义了一个过滤函数,它的参数为一个元组x,当该元组中两个数的和小于30时返回True,否则返回False。最后我们使用zip()函数将两个序列打包为元组列表,并将其作为filter()函数的第二个参数传入。
输出结果为[(1, 10), (2, 20), (3, 30)],只有前三个元组中的两个数的和小于30。
(2)使用partial()函数定义过滤函数
如果我们想使用filter()函数对一些开销较大的函数进行过滤,可以使用functools.partial()函数定义一个新的函数,然后将其作为filter()函数的 个参数传入。下面是一个示例:
import functools
def is_prime_number(num):
if num <= 1:
return False
for i in range(2, int(num ** 0.5) + 1):
if num % i == 0:
return False
return True
nums = [3, 12, 17, 28, 37, 42]
filtered_nums = filter(functools.partial(is_prime_number), nums)
print(list(filtered_nums))
在这个示例中,我们定义了一个is_prime_number()函数,它的参数为一个整数num,当该整数为素数时返回True,否则返回False。然后我们使用functools.partial()函数定义了一个新的函数,即将is_prime_number()函数中的num参数替换为filter()函数中迭代器对象中的每个元素。
输出结果为[3, 17, 37],符合条件的素数被成功保留了下来。
6.总结
filter()函数是Python内置函数中非常实用的一个函数,它能够帮助我们快速地筛选出序列中符合条件的元素。本文中我们介绍了filter()函数的基本语法、lambda表达式和其他可调用对象的用法、去除序列中的空值的方法,以及高级用法,希望能够对读者加深对filter()函数的理解和掌握。
