三大高阶函数(map,filter)用法详解

定义:高阶函数就是指可以接受其他函数的函数,这个函数可以是系统内置函数,自定义函数,lambda匿名函数

1,map

map这个函数用法在初级中特别方便使用,通常一行代码可以抵得上好几行代码。

格式:map(function,sequence [,sequence[,sequence……]])

map就是用接收到的函数,来对序列(sequence)进行一些操作,通过函数对序列的处理,将返回结果放到一个映射组中,可以对这个映射组进行遍历,转化等操作。

下面来看一个例子:

def square(n):
    return n**2
s = [1, 2, 3, 4, 5, 6]
k = list(map(square, s))
print(k)

# 返回结果[1, 4, 9, 16, 25, 36]

 也可写为:

s = [1, 2, 3, 4, 5, 6]
k = list(map(lambda n: n**2, s))
print(k)

# 返回结果[1, 4, 9, 16, 25, 36]

想必大家都看出来了,这个就是一个求S中每个元素的平方

那么是怎么实现的呢?

首先map是接收函数对序列进行操作,也就是,依次从序列S中取值,分别为1,2,3,4,5,6

再通过函数lambda n:n**2对每个元素进行运算,lambda n:n**2接收的第一个值就是1,

返回值也就是1的平方,再将返回值加入到映射组中,依次为2的平方……。

但由于map返回的是一个<map object at 0x000002AFBFDD2788>

所以我们需要对map进行转化,将map转化为列表类型<class 'list'>,就可以看到处理的结果了。

map函数还可以接收python内置的函数:

比如上述所说的求S中每个元素的平方,我们可以写为:

s = [1, 2, 3, 4, 5, 6]
b = [2]*6
k = list(map(pow, s, b))
print(k)
# 返回结果[1, 4, 9, 16, 25, 36]

map可以接收多个序列,而由于pow(a,b)返回的a**b,它接收的是两个参数,所以我们要传入两个序列,针对两个序列,map会从两个序列中的0号元素依次取值,也就是(1,2),(2,2)……

(6,2),这样取值,然后将pow的返回值加入到映射组中,通过list()转化为列表输出。

求序列中的每个元素的阶乘:

def factorial(n):
    if n == 1:
        return 1
    else:
        return n*factorial(n-1)
b=list(map(factorial,[1,2,3,4,5,6]))
print(b)
# 返回结果[1, 2, 6, 24, 120, 720]

math库中也有一个直接求阶乘的函数,也可以用内置函数直接写:

import math
b=list(map(math.factorial,[1,2,3,4,5,6]))
print(b)
# 返回结果[1, 2, 6, 24, 120, 720]

2.filter

filter(过滤器)filter是一个筛选函数,它的作用就是来筛选一个序列中满足条件的元素
filter返回的是<filter object at 0x000002AFBFDD2708>,他的参数跟map一样,都是接受函数,和序列。这里就不多说了,看几个例子就懂了。

def even_numbers(n):
    return n%2==0
m=list(filter(even_numbers,[1,2,3,4,5,6]))
# 返回结果[2, 4, 6]

这里大家也看出来了,filter的功能就是把序列中满足条件的元素筛选出来,上面这个例子功能就是:将序列中偶数筛选出来

注意:filter接收的函数返回值必须为bool(True或False)值,这样才能正确利用filter函数。

还可以写为:

m=list(filter(lambda n: n%2==0,[1,2,3,4,5,6]))
print(m)
# 返回结果[2, 4, 6]

filter筛选出一百以内的素数:

def prime_number(n):
    for i in range(2, n):
        if n % i == 0:
            return False
    else:
        return True

k = list(filter(prime_number, list(range(2, 101))))
print(k)
# 返回结果[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]

自己理解着写的,看不懂多看两遍哈!

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值