一、高阶函数
函数的本质:函数是一个变量,函数名是一个变量名,一个函数可以作为另一个函数的参数或返回值使用
如果A函数作为B函数的参数,B函数调用完成之后,会得到一个结果,则B函数被称为高阶函数
常用的高阶函数:map(),reduce(),filter(),sorted()
1.map()
map(func,iterable),返回值是一个iterator【容器,迭代器】
func:函数 iterable:可迭代对象【容器】,可以是多个,常用列表
功能:将iterable容器中的每一个元素传递给func,func返回一个结果,结果会成为iterator中的元素
容器----》func----》新的容器
""" iterable:可迭代对象,list,tuple,str,dict,set,range(),生成器都是可迭代对象 iterator:迭代器,只有生成器是迭代器 """ """ map(func,iterable...),返回值是一个iterator【容器,迭代器】 func:函数 iterable:可迭代对象【容器】,可以是多个,常用列表 功能:将iterable容器中的每一个元素传递给func,func返回一个结果,结果会成为iterator中的元素 容器----》func----》新的容器 """ # 1.生成一个容器,其中的元素是1,4,9,16,25 # 方式一 list1 = [i ** 2 for i in range(1,6)] print(list1) # 方式二 def func1(x): return x ** 2 r1 = map(func1,range(1,6)) print(r1) # for ele in r1: # print("结果:",ele) print(list(r1)) # 方式三:一般情况下,如果需要自定义的函数作为参数使用且逻辑比较简单,建议使用匿名函数 r2 = map(lambda x:x ** 2,range(1,6)) print(r2) print(list(r2)) # 2. # 注意:func需要设置几个参数,取决于有几个iterable参与运算 # func的形参个数必须和iterable的个数保持一致 # 工作原理:将多个iterable相同索引出的元素同时传值给func def func2(x,y): return x + y r3 = map(func2,[1,2,3],[4,5,6]) print(list(r3)) # [5, 7, 9] r4 = map(lambda x,y:x + y,[1,2,3],[4,5,6]) print(list(r4)) # [5, 7, 9]
2.reduce()
reduce(func,seq)
func:函数 seq:序列【容器】
功能:减少
首先将seq中的第0个元素和第1个元素传递给func,进行运算,返回结果1接着,将 结果1 和第2个元素传递给func,进行运算,返回结果2接着,将 结果2 和第3个元素传递给func,进行运算,返回结果3....直到所有的元素全部参与运算,表示运算结束
""" reduce(func,seq) func:函数 seq:序列【容器】 功能:减少 工作原理: 首先将seq中的第0个元素和第1个元素传递给func,进行运算,返回结果1 接着,将 结果1 和第2个元素传递给func,进行运算,返回结果2 接着,将 结果2 和第3个元素传递给func,进行运算,返回结果3 .... 直到所有的元素全部参与运算,表示运算结束 分析: reduce(func,[a,b,c,d]) r1 = func(a,b) r2 = func(r1,c) r3 = func(r2,d) r3 = func(func(func(a,b),c),d) seq--->func---->value """ # 注意:reduce中的函数一定是两个参数,最终得到的结果是一个值 from functools import reduce # 1.求1~100之间的所有整数的和 # 方式一 total1 = 0 for i in range(1,101): total1 += i print(total1) # 方式二 total2 = sum(range(1,101)) print(total2) # 方式三 def add(x,y): # print(x,y) return x + y r = reduce(add,range(1,101)) print(r) # 方式四 r = reduce(lambda x,y:x + y,range(1,101)) print(r) # 2.练习 # a.求20的阶乘 r = reduce(lambda x,y:x * y,range(1,21)) print(r) # b.已知列表[2,5,3,9],通过reduce做出操作,得到2539数字 """ 2,5----》25---》2 * 10 + 5 25,3----》253---》25 * 10 + 3 253,9---》2539----》253 * 10 + 9 """ numlist = [2,5,3,9] r = reduce(lambda x,y:x * 10 + y,numlist) print(r) # r = int(reduce(lambda x,y:str(x) + str(y),numlist)) # print(r)
3.filter()
filter(func,iterable):过滤
func:函数 iterable:可迭代对象
功能:将iterable中的元素依次传递给func,根据func的返回值决定是否保留该元素,如果func的返回值为True,则表示当前元素需要保留,如果为False,则表示过滤
""" filter(func,iterable):过滤,返回值是迭代器 func:函数 iterable:可迭代对象【容器】 功能:将iterable中的元素依次传递给func,根据func的返回值决定是否保留该元素, 如果func的返回值为True,则表示当前元素需要保留,如果为False,则表示过滤 """ # 1.需求:已知列表list1 = [234,45,56,76,8,2,34,56,6,1,2,34,56,19,45] # 将其中的奇数过滤掉 list1 = [234,45,56,76,8,2,34,56,6,1,2,34,56,19,45] # 方式一 list2 = [] for num in list1: if num % 2 == 0: list2.append(num) print(list2) # 方式二 list3 = [num for num in list1 if num % 2 == 0] print(list3) # 方式三 def func(x): # if x % 2 == 0: # return True # return False return x % 2 == 0 r = filter(func,list1) print(r) print(list(r)) # 方式四 r1 = filter(lambda x:x % 2 == 0,list1) print(list(r1)) # 练习:已知列表,将其中的数字元素挑出来 datalist = ['faf','gag',10,'hello',35,45,7,8] # 方式一 list1 = [data for data in datalist if type(data) == int or type(data) == float] print(list1) # 方式二 list2 = list(filter(lambda x:type(x) == int or type(x) == float,datalist)) print(list2)
4.sorted()
【面试题】列表中的sort函数和高阶函数sorted的区别和联系1.调用语法:
列表.sort(reverse,key=func),
sorted(iterable,reverse,key=func)
2.结果:sort是在原列表内部排序的,sorted是生成了一个新的列表3.二者默认情况下都是升序排序,如果要降序,则都是设置reverse=True
""" 【面试题】列表中的sort函数和高阶函数sorted的区别和联系 1.调用语法: 列表.sort(reverse,key=func), sorted(iterable,reverse,key=func) 2.结果:sort是在原列表内部排序的,sorted是生成了一个新的列表 3.二者默认情况下都是升序排序,如果要降序,则都是设置reverse=True """ """ sorted(list,reverse,key=func) list:需要排序的列表 reverse:表示升序还是降序,默认值为False表示升序,如果设置为True则表示降序 key=func:表示自定义排序的规则,工作原理:将列表中的元素依次传递给func,func的返回值就是排序的规则 """ # 1.升序 list1 = [34,1,4,67] list1.sort() print(list1) # 【面试题】 list1 = [34,1,4,67] sorted(list1) print(list1) # [34,1,4,67] # 正确写法 list1 = [34,1,4,67] list2 = sorted(list1) print(list2) # [1, 4, 34, 67] # 2.降序 list1 = [34,1,4,67] list1.sort(reverse=True) print(list1) list1 = [34,1,4,67] list2 = sorted(list1,reverse=True) print(list2) # 3.自定义排序规则,如果系统有存在的函数,则直接使用,如果不存在,则自定义 # 需求:按照字符串的长度进行降序排序 list2 = ['4562','fahgjahgja','xag','r','gaga4'] list2.sort(reverse=True,key=len) print(list2) list2 = ['4562','fahgjahgja','xag','r','gaga4'] list21 = sorted(list2,reverse=True,key=len) print(list21) # 练习:按照年龄进行升序排序 students = [ {'name':'aaa','age':10}, {'name':'ccc','age':17}, {'name':'bbb','age':13}, {'name':'eee','age':20}, {'name':'ddd','age':11} ] students.sort(key=lambda x:x['age']) print(students) students = [ {'name':'aaa','age':10}, {'name':'ccc','age':17}, {'name':'bbb','age':13}, {'name':'eee','age':20}, {'name':'ddd','age':11} ] new_students = sorted(students,key=lambda x:x['age']) print(new_students)