python exercise function之高阶函数filter

版权声明:本文章为博主原创文章,未经博主允许不得转载,如有问题,欢迎留言交流指正 https://blog.csdn.net/finalkof1983/article/details/88888977

python中的几个常用高阶函数包括:filter、map、reduce、zip、sorted

本文主要对filter进行说明


filter(function, iterable)

python内建函数,用于过滤序列。接收两个参数,函数及可迭代对象。将可迭代对象中的值依次传递给函数进行处理,保留返回值为Ture的元素。

示例1 返回列表中大于N的数

a = [1, 2, 3, 4, 5, 6, 7]
print(list(filter(lambda x: x > 4, a)))

print([i for i in a if i > 4])


#输出
[5, 6, 7]
[5, 6, 7]

上例为打印列表中大于4的元素,函数部分使用了lambda表达式,从列表a中找到并返回大于4的值。而filter返回的是一个filter对象,需要转化为list或其他序列查看其中的元素。

示例2 返回列表中所有数的平方

a = [1, 2, 3, 4, 5, 6, 7]
print(tuple(filter(lambda x:x*x, a)))


#输出
(1, 2, 3, 4, 5, 6, 7)

可见这种操作对于filter并不合适,因为所有元素都能进行平方计算,所以每个元素返回的都是True,并不是返回所有元素的平台,所以此操作应该由map函数来完成。这也是这两个函数的主要区别,filter用于所有值的过滤,而map用于所有值的计算

示例3 去掉列表中所有的偶数

a = [1, 2, 3, 4, 5, 6, 7]
print(list(filter(lambda x: x % 2 == 1, a)))

print([i for i in a if i % 2 != 0])


#输出
[1, 3, 5, 7]
[1, 3, 5, 7]

示例4 去掉列表中的空元素

a = ['A', '', 'B', None, 'C', '  ']
print(list(filter(lambda x: x and x.strip(), a)))

print([x for x in a if x is not None and x.strip() != ''])


#输出
['A', 'B', 'C']
['A', 'B', 'C']

示例5 用filter统计质数

def find_prime(num):
    odd_list = []
    prime_set = set()
    i=3
    while i<=num:
        odd_list.append(i)
        i += 2
    while len(odd_list)>0:
        prime_num = odd_list.pop(0)
        prime_set.add(prime_num)
        odd_list = list(filter(lambda x:x%prime_num != 0, odd_list))
    prime_set.add(2)
    return prime_set


print(find_prime(100))


#输出
{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97}

第一个while循环生成一个值包含奇数的列表,第二个while循环遍历奇数列表,弹出首个元素(肯定为质数)加入到set集合中,每次使用filter函数去掉odd_list中该元素的倍数,生成新的odd_list用于顶层循环。用set保存结果,使成员in / not in操作更快。

示例6 对于给定列表中的元素判断哪些是质数

alist = [4,1,51,24,56,85,85,23,137]
prime_set = find_prime(max(alist))
print(list(filter(lambda x:x in prime_set, alist)))


#输出
[23, 137]

调用示例5的函数,以给定列表的最大值生成质数集合,依次遍历列表的值,判断是否存在与集合中

猜你喜欢

转载自blog.csdn.net/finalkof1983/article/details/88888977