注:本文所有代码均经过Python 3.7实际运行检验,保证其严谨性。
Python内置序列函数系列所有文章都以几个术语为基础:可迭代对象(iterable)、迭代器(iterator)、序列(sequence)、生成器(generator)等。若对此不太理解,可移步Python随笔4查看。
今天讨论的内置序列函数是filter函数。filter的意思是过滤、筛选,而这也的确是这个函数要实现的功能。
fileter函数的具体用法是:
filter(function, iterable)——参数function是一个能够对可迭代对象(iterable)中的元素进行True或者False判断的函数。filter函数返回的就是可迭代对象(iterable)中经过function函数判断后为True的元素构成的迭代器(iterator)。
filter(function, iterable) 相当于一个生成器表达式。
请看以下例子:
l = [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]def function(n): if n > 0: return True else: return Falsefilter(function, l) # 返回的是一个迭代器,无法直接查看。Out[18]: l1 = list(filter(function, l)) # 迭代器中的元素可以通过list()来查看。l1Out[20]: [1, 2, 3, 4, 5]
值得注意的是,function可以是None,如果是这种情况function相当于 (item for item in iterable if item) 。
l = [0, 1, '', 'a', False, True, range(0), set(), (), [], {}]l1 = list(filter(None, l))l1 Out[36]: [1, 'a', True]
这里涉及了对任意类型的变量的值的True和False的判断,下面基本完整地列出了会被视为假值的内置对象:
被定义为假值的常量: None 和 False。
任何数值类型的零: 0, 0.0, 0j, Decimal(0), Fraction(0, 1)。
空的序列和多项集: '', (), [], {}, set(), range(0)。
filter配合可迭代对象如列表、字典,尤其是配合字典时,就很有意思:
strength = {'吕布': 100, '张飞': 98, '关羽': 97, '张郃': 94, '牛金': 83, '潘凤': 75, '刘禅': 7}# 过滤只留下strength的值大于90的键值对的元组形式。 for i in filter(lambda x: x[1] > 90, strength.items()): print(i, end = " ")('吕布', 100) ('张飞', 98) ('关羽', 97) ('张郃', 94) # 过滤只留下strength的值大于60小于90的键值对的元组形式。 for i in filter(lambda x: 60 < x[1] < 90, strength.items()): print(i, end = " ")('牛金', 83) ('潘凤', 75) # 过滤只留下strength的值小于10的键值对的元组形式。 for i in filter(lambda x: x[1] < 10, strength.items()): print(i, end = " ")('刘禅', 7)