定义:高阶函数就是指可以接受其他函数的函数,这个函数可以是系统内置函数,自定义函数,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]
自己理解着写的,看不懂多看两遍哈!