高阶函数主要有map,reduce,filter,sorted四种
map函数接受两个参数,一个是函数,一个是序列,map会把该函数依次作用于这个序列的元素上,但是返回值是一个迭代器,是一个惰性序列,这里可以通过list函数让它把整个序列计算出来并以list的形式返回(感觉有点像matlab里的cellfun函数,也是依次对元胞数组的内容作用一个函数)
map(fun,序列)
a=[1,2,3,4,5]
b=list(map(lambda x:x*x*x,a))
print(b)
#[1, 8, 27, 64, 125]
reduce同上,但是这个传入的函数需要两个参数,reduce会把此次计算结果和序列中下一个没有参与计算的元素作为下一次调用函数的参数,以此类推,做累计计算,比如累加,累积
reduce(fun,序列)此fun需要两个输入参数
a=[1,2,3,4,5]
b=reduce(lambda x,y:x*y,a)
print(b)
#120
map和reduce经常一起配合可以做有用的事
比如字符串‘123321’转化成123321(虽然可以直接int暴力转化,这里只是另一个实现思路)
from functools import reduce
dict = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
def str2int(s):
number=reduce(lambda x,y:10*x+y,map(lambda x:dict[s],s))
return number
filter函数也是接受一个函数和一个序列,将此函数作用于序列中每一个元素,filter顾名思义过滤器,它会根据函数作用后返回的True或者False只留下返回为True的元素。返回的同map也是一个惰性序列,这里同样可以通过list函数让它把整个序列计算出来并以list的形式返回
filter(fun,序列) 此fun返回值需为True或者False
a=list(range(50))
b=list(filter(lambda x:x%7==0,a))
print(b)
#[0, 7, 14, 21, 28, 35, 42, 49]
sorted主要是用于排序的,既可以直接排序(默认升序)
a=sorted([2,3,9,3,-11,2,4])#默认升序排列
print(a)
#[-11, 2, 2, 3, 3, 4, 9]
a=sorted([2,3,9,3,-11,2,4],reverse=True)#设置reverse=True为倒序排列
print(a)
#[9, 4, 3, 3, 2, 2, -11]
也可以通过参数key来传入自定义函数来实现自定义排序
a=sorted(['bob', 'about', 'Zoo', 'Credit'], key=lambda x :x.lower(),reverse=True)
print(a)
#['Zoo', 'Credit', 'bob', 'about']
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
def sort_name(L):
new_list=sorted(L,key=lambda x :x[1],reverse=True)
return new_list
print(sort_name(L))
#[('Adam', 92), ('Lisa', 88), ('Bob', 75), ('Bart', 66)]
这些高阶函数都是可以搭配起来用的,逻辑清晰,这里举个廖雪峰老师课后一个回文数习题的栗子:
回文数即从左到右和从右到左是一样的数字,比如123321,888这种
from functools import reduce
dict = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
def init():#设置一个自然数序列
n=0
while True:
yield n
n+=1
def is_palindrome(n):#判断是否是回文数
str_list=list(str(n))
num_list=list(map(lambda x :dict[x],str_list))
op_num_list=num_list[::-1]#倒序列表
op_n=reduce(lambda x,y:10*x+y,op_num_list)
return n==op_n
def p():#设置一个回文数序列
it=init()
it = filter(is_palindrome, it)
while True:
n=next(it)
yield n
for number in p():#p()返回的是迭代器,惰性序列,需要逼出来
if number>1000:
break
print(number)