filter()

2018-09-29  本文已影响0人  import_hello

转载须注明出处:简书@Orca_J35

class filter(object)
 |  filter(function or None, iterable) --> filter object
 |  
 |  Return an iterator yielding those items of iterable for which function(item)
 |  is true. If function is None, return the items that are true.

filter 函数大致相当于如下代码:

def filter(function, iterable):
    if function is None:
        function = bool
    for x in iterable:
        if function(x):
            yield x

filter 函数会返回一个迭代器——该迭代器其实是一个支持迭代器协议的 filter 对象。
iterable 参数可以是序列(sequence),或是支持迭代的容器(container),还可以是迭代器。

🔨filter(None, iterable)

如果在调用 filter 函数时,function 的值是 None,便会将 iterable 中布尔值为真的元素依次用作迭代器的生成项。下面这个生成器表达式与 filter(None, iterable) 等价:

(item for item in iterable if item)

一个简单的示例:

>>> list(filter(None,['',False,'I',{}]))
['I']

🔨filter(function, iterable)

如果在调用 filter 函数时,function 的值是一个可调用对象,迭代器会将 iterable 中的各个元素依次传递给 function,并将返回值为真的元素依次用作迭代器的生成项。下面这个生成器表达式与 filter(function, iterable) 等价:

(item for item in iterable if function(item))

一些简单的示例:

>>> # 保留iterable中的奇数
>>> list(filter(lambda x: x % 2,range(10)))
[1, 3, 5, 7, 9]
>>> # 删除序列中的空字符串
>>> list(filter(lambda x: x and x.strip(), 
                ['A', '', 'B', None, 'C', '  ']))
['A', 'B', 'C']

示例,利用埃氏筛法来获取全体素数的集合:

# 奇数生成器
def _odd_iter(): 
    n = 1
    while True:
        n = n + 2
        yield n
# 定义筛选函数:
def _not_divisible(n):
    return lambda x: x % n > 0
    
# 定义用于返回素数的生成器:
def primes():
    yield 2
    it = _odd_iter() # 初始序列
    while True:
        n = next(it) # 返回序列的第一个数
        yield n
        it = filter(_not_divisible(n), it) # 构造新序列

itertools.filterfalse

filterfalse 函数大致相当于如下代码:

def filterfalse(predicate, iterable):
    # filterfalse(lambda x: x%2, range(10)) --> 0 2 4 6 8
    if predicate is None:
        predicate = bool
    for x in iterable:
        if not predicate(x):
            yield x

filterfalse 函数会返回一个迭代器,它的功能与 filter 函数正好相反。

🔨itertools.filterfalse(None, iterable)

如果在调用 filterfalse 函数时,predicate 的值是 None,便会将 iterable 中布尔值为的元素依次用作迭代器的生成项。

>>> import itertools
>>> list(itertools.filterfalse(None,['',False,'I',{}]))
['', False, {}]

🔨itertools.filterfalse(predicate, iterable)

如果在调用 filterfalse 函数时,predicate 的值是一个可调用对象,迭代器会将 iterable 中的各个元素依次传递给 predicate,并将返回值为的元素依次用作迭代器的生成项。

>>> import itertools
>>> list(itertools.filterfalse(lambda x: x%2, range(10)))
[0, 2, 4, 6, 8]
上一篇 下一篇

猜你喜欢

热点阅读