什么是高阶函数?
- 函数接收一个或多个函数作为参数传入
- 函数返回一个函数
只要满足以上一条的函数就是高阶函数了
map函数
map(function, *iterable) 返回一个可迭代对象,此可迭代对象用函数function对可迭代对象iterable中的每一个元素作为参数计算后得到新的数据。
举个栗子就懂了,文字叙述有点绕
如:求1-9的每个元素的平方:
def power(x):
return x ** 2
for x in map(power, range(1, 10)):
print(x, end=' ') # 1 4 9 16 ... 81
map(power, range(1, 10))先看这条语句,其中power是上边的函数名,range不用说了,是一个可迭代对象。那么它执行的流程是什么呢?
- 先拿出 1 传给power,然后return 1^2 -> 1
- 再拿出 2 传给power,然后return 2^2 -> 4
- 再拿出 3 传给power,然后return 3^2 -> 9
- …
- 最后拿出 9 传给power,然后return 9^2 -> 81
总起来就是说可以这么理解:可迭代对象有多少个就调用多少次对应的函数
配个debug图:
可迭代对象不一定只有一个,但必须和函数形参个数相同,再举个栗子:
如:#生成一个可迭代对象,可以提供:1^4,2^3,3^2,4^1
def mypow(x, y):
return x ** y
for i in map(mypow, [1, 2, 3, 4], (4, 3, 2, 1)):
print(i, end=' ')
filter函数
filter(function, iterable)
filter函数的作用:
- 筛选可迭代对象iterable中的数据,返回一个可迭代对象,此可迭代对象只返回iterable中符合条件的数据
- function将对iterable中提供的每个数据进行布尔求值,True则保留,否则丢弃
举个栗子:以列表的形式打印1-10之间的奇数
def isodd(x):
return x % 2 == 1
L = list(filter(isodd, range(10)))
print('L=', L) # L= [1, 3, 5, 7, 9]
filter(isodd, range(10)) 先看这条,执行过程同map一样,只不过filter返回的是True或False
如果是map返回是什么呢?
L= [False, True, False, True, False, True, False, True, False, True]
filter可以了解为一个过滤器,如果返回的是True,就保留让它返回True的这个数据,否则的话就丢弃
再举个栗子:求1-100之间的素数(用filter实现)
def isprime(x):
if x < 2:
return False
for i in range(2, x):
if x % i == 0: # 一旦整除,x一定不是素数
return False
return True
L = list(filter(isprime, range(100)))
print('L=', L)
# 结果:L= [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]
sorted函数
sorted函数的作用:
将原可迭代对象的数据进行排序,生成排序后的列表
函数的参数格式:
sorted(iterable, key=None, reverse=False)
参数说明:
- iterable 可迭代对象
key 函数是用来提供一个值,将这个值作为排序的依据,如果不给出这个key函数,则用原数据的值进行比较和排序
举几个栗子:
>>> L = [5 , -2, -4, 0, 3, 1]
>>> L2 = sorted(L)
>>> L2
[-4, -2, 0, 1, 3, 5]
>>> L3 = sorted(L, reverse=False)
>>> L3
[-4, -2, 0, 1, 3, 5]
>>> L4 = sorted(L, reverse=True)
>>> L4
[5, 3, 1, 0, -2, -4]
以上栗子解释reverse的作用:默认为False升序,可以不写,如果是True则为降序
>>> L5 = sorted(L, key=abs)
>>> L5
[0, 1, -2, 3, -4, 5]
以上栗子解释key值使用内置函数,abs是绝对值,也就是按绝对值的大小来排序,key的函数也可以自定义
如:
按字符串的反序排序
names = ['Tom', 'Jerry', 'Spike', 'Tyke']
def mysorted(L): # 依次传入name的值
return L[::-1] # 将name字符串反转
print(sorted(names, key = mysorted))
# 结果: ['Spike', 'Tyke', 'Tom', 'Jerry']
提示:反转后的names列表是:
names = [‘Tyke’, ‘Spike’, ‘Jerry’, ‘Tom’] ,然后按照这个排序
本节完