python匿名函数、迭代器、高阶函数(一):https://developer.aliyun.com/article/1495740
高阶函数
#高阶函数 : 能够把函数当成 参数传递 的就是高阶函数 (map ,filter ,reduce , sorted)
1、map
map(func,iterable)
功能: 处理数据
把iterable中的数据一个一个拿出来,扔到func做处理,通过调用迭代器来获取返回值
参数:
func : 函数(内置函数,自定义函数) 定义的函数带一个参数,并且有返回值
iterable : 可迭代性对象 (容器类型数据,range对象,迭代器)
返回值:
迭代器
可以循环处理一批数据,然后再返回出来
#(1) 把列表中的元素都变成整型
lst = ["1","2","3","4"] lst_new = [] for i in lst: lst_new.append(int(i)) print(lst_new) #用map改写 from collections import Iterator,Iterable it = map(int,lst) print(isinstance(it,Iterator))
map返回的是个迭代器
代码解析:
第一次调用迭代器
先把列表中的第一个元素"1"拿出来扔到int中做强转,变成整型1返回出来
第二次调用迭代器
先把列表中的第一个元素"2"拿出来扔到int中做强转,变成整型2返回出来
第三次调用迭代器
先把列表中的第一个元素"3"拿出来扔到int中做强转,变成整型3返回出来
第四次调用迭代器
先把列表中的第一个元素"4"拿出来扔到int中做强转,变成整型4返回出来
#1.调用迭代器 next
print(next(it)) print(next(it)) print(next(it)) print(next(it)) #print(next(it)) error
#2.调用迭代器 for
print("<======>") it = map(int,lst) for i in it: print(i)
#3.调用迭代器 for + next
print("<======>") it = map(int,lst) for i in range(3): print(next(it))
#4.强转迭代器 => 列表
it = map(int,lst) print(list(it))
#(2) [1,2,3,4] => [2,8,24,64]
# print(1 * 2 ** 1) # print(2 * 2 ** 2) # print(3 * 2 ** 3) # print(4 * 2 ** 4) # 1 << 1 # 2 << 2 # 3 << 3 # 4 << 4 lst = [1,2,3,4] lst_new = [] for i in lst: lst_new.append(i << i) print(lst_new)
#map改写
def func(n): print(1111) return n << n it = map(func,lst) print(list(it))
只有在调用迭代器的时候,才会真正触发map函数中的所有内容;不调用不触发;
强转迭代器时,把可以调用的所有数据都放到列表中
第一次调用时:
把1拿出来,扔func当中做处理,返回2,
第二次调用时:
把2拿出来,扔func当中做处理,返回8,
第三次调用时:
把3拿出来,扔func当中做处理,返回24,
第四次调用时:
把4拿出来,扔func当中做处理,返回64,
到此列表[2,8,24,64]
注意点:形参和返回值必须写;
#(3) 给你一个列表[“a”,“b”,“c”] => [97,98,99]
# 字典的键值翻转操作 dic = {97:"a",98:"b",99:"c"} dic_new = {} for k,v in dic.items(): # print(k,v) # 97 a | 98 b | 99 c dic_new[v] = k # dic_new["a"] = 97 print(dic_new) lst = ["a","b","c"] lst_new = [] for i in lst: lst_new.append(dic_new[i]) print(lst_new)
#map改写
lst = ["a","b","c"] lst = ["c","b","a"] lst = ("c","b","a") # func 实现字典的翻转,通过给与a,b,c三个键,得到对应的ascii码,通过list强转得到列表 def func(n): print(n) dic = {97:"a",98:"b",99:"c"} dic_new = {} for k,v in dic.items(): dic_new[v] = k print(dic_new) # {'a': 97, 'b': 98, 'c': 99} return dic_new[n] it = map(func,lst) print(list(it))
2、reduce
reduce(func,iterable)
功能: 计算数据
把iterable中的前两个数据扔到func函数中做计算,把计算的结果和iterable中第三个值在继续扔到func中做计算
以此类推 …
所以,定义的函数必须包含两个参数,并且要把计算结果返回
最后返回计算的结果
参数:
func: 自定义函数
iterable : 可迭代对象 (容器类型数据 range对象 迭代器)
返回值:
计算的结果
#(1) [7,7,5,8] => 7758
lst = [7,7,5,8]
#方法一
strvar = "" for i in lst: strvar += str(i) res = int(strvar) print(res , type(res))
#方法二
""" 7 * 10 + 7 = 77 77 * 10 + 5 = 775 775 * 10 + 8 = 7758 """ #1.先变成迭代器 it = iter(lst) #2.取出两个值 num1 = next(it) num2 = next(it) print(num1,num2) #做计算 total = num1 * 10 + num2 print(total) # 77 #3.把计算的结果在和剩下的数据做计算 for num in it: total = total * 10 + num #4.返回最后的结果 print(total , type(total))
print(“<==========>”)
#reduce改写
‘’‘从…functools模块, 引入 … reduce方法’‘’
from functools import reduce lst = [7,7,5,8] def func(x,y): # print(x,y) return x * 10 + y res = reduce(func,lst) print(res)
如果使用reduce,定义的函数必须包含两个变量,因为reduce会把前两个数据扔给func处理,然后把计算结果再与第三个数据做计算,以此类推
#使用lambda 进行改造
print(reduce(lambda x,y: x*10 + y,lst))
#(2) “123” => 123 不使用int的情况下实现该操作;
strvar = "123" def func(x,y): return x * 10 + y #把字符串"123" 处理成数字的123 def func2(n): # dic = {"0":0,"1":1,"2":2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9} dic = {} for i in range(10): dic[str(i)] = i return dic[n] it = map(func2,strvar) # res = reduce(func,it) # print(res,type(res)) # 简写 print(reduce(lambda x,y: x*10 + y,it))
3、filter
filter(func,iterable)
功能: 过滤数据
在自定义的函数中,
如果返回True, 该数据保留
如果返回False,该数据舍弃
参数:
func: 自定义函数,只能返回True或False
iterable : 可迭代对象 (容器类型数据 range对象 迭代器)
返回值:
迭代器
#1.只要列表中所有的偶数
lst = [1,2,34,5,65,6,56,7,56,756,7567,11] lst_new = [] for i in lst: if i % 2 == 0 : lst_new.append(i) print(lst_new) #filter改写 def func(n): if n % 2 == 0: return True else: return False it = filter(func,lst) print(list(it)) # 使用lambda 改写 it = filter(lambda n :True if n % 2 == 0 else False , lst) print(list(it)) print(list(filter(lambda n :True if n % 2 == 0 else False , lst)))
3、sorted
sorted(iterable,key=函数,reverse=False)
功能:排序数据
参数:
iterable : 可迭代对象 (容器类型数据 range对象 迭代器)
key : 指定函数(自定义/内置) 自定义函数要带有一个参数,并且有返回值
reverse : 是否倒序
返回值:
列表
tup = (-90,89,78,3) #1.从小到大 res = sorted(tup) print(res,type(res))
#2.从大到小
res = sorted(tup,reverse = True) print(res,type(res))
#3.按照绝对值进行排序
tup = (-90,-100,1,2) res = sorted(tup,key=abs) print(res) 1 => abs(1) => 1 2 => abs(2) => 2 -90 => abs(-90) => 90 -100 => abs(-100) => 100
#4.按照自定义函数进行排序
tup = (19,23,42,87) """ 42 % 10 2 => 42 23 % 10 3 => 23 87 % 10 7 => 87 19 % 10 9 => 19 """ def func(n): print(n) return n % 10 lst = sorted(tup,key = func) print(lst)
#5.任意的容器类型数据都可以通过sorted排序
container = "abc" container = [1,2,3] container = (1,2,3) container = {"你好","王文","你真帅"} container = {"caixukun","xiaozhan","zhaoshenyang","wangyibo"} container = {"ww":"英俊帅气","zxy":"猥琐抠脚","zwl":"斯文败类"} # 排的是字典的键 print(sorted(container))
#总结:
sorted (推荐使用sorted)
(1) 可以排序所有的容器类型数据
(2) 返回一个新的列表
sort
(1) 只能排序列表
(2) 基于原来的列表进行排序