python高阶函数map reduce filter sorted_day13:迭代器&高阶函数(map,reduce,filter,sorted)

迭代器

1.迭代器的定义: 能被next调用,并不断返回下一个值的对象,叫做迭代器(对象)

2.迭代器的概念:

迭代器指的是迭代取值的工具,迭代是一个重复的过程,

每次重复都是基于上一次的结果而继续的,

单纯的重复并不是迭代

3.迭代器的特征: 并不依赖索引,而通过next指针迭代所有数据,一次只取一个值,大大节省空间

4.dir: 获取当前类型对象中的所有成员

其中,里面有一个魔术方法,叫做__iter__方法,

__iter__方法用来判断是否是可迭代性数据

setvar = {"a",bcd"}

lst= dir(setvar) #获取setvar对象中的所有成员

print(lst)'''['__and__','__class__','__contains__','__delattr__','__dir__','__doc__','__eq__','__format__','__ge__','__getattribute__','__gt__','__hash__','__iand__','__init__','__init_subclass__','__ior__','__isub__','__iter__','__ixor__','__le__','__len__','__lt__','__ne__','__new__','__or__','__rand__','__reduce__','__reduce_ex__','__repr__','__ror__','__rsub__','__rxor__','__setattr__','__sizeof__','__str__','__sub__','__subclasshook__','__xor__','add','clear','copy','difference','difference_update','discard','intersection','intersection_update','isdisjoint','issubset','issuperset','pop','remove','symmetric_difference','symmetric_difference_update','union','update']'''

5.关于迭代器,需要注意的点:

for 循环能够遍历一切可迭代性数据的原因在于,1)">底层调用了迭代器,通过next方法中的指针实现数据的获取

可迭代对象(不能够被next直接调用)  -> 迭代器(可以被next直接调用的过程)

一个可迭代对象不一定是迭代器

一个迭代器就一定是一个可迭代对象

6.定义一个迭代器

定义迭代器需要使用iter()方法

setvar = {}

it= iter(setvar) 将可迭代对象setvar变成了迭代器

print(it)

7.判断一个迭代器

迭代器必须要有__iter__方法和__next__方法

res = __iter__" in dir(it) and __next__indir(it)print(res) True

8.调用迭代器

next在调用迭代器中的数据时,是单向不可逆,一条路走到黑的过程

当没有可迭代的数据后,抛出一个StopIteration的异常,并且停止迭代

setvar = {将可迭代对象setvar变成了迭代器

res =next(it)c

res =d

res =a

res =b

res =当没有可迭代的数据后,抛出一个StopIteration的异常,并且停止迭代

9.重置迭代器

重置迭代器,只需要再次调用iter()方法即可

it = iter(setvar) 重置迭代器

res =print(res)

10.使用其他方式判断是否是可迭代对象/迭代器

"""Iterator 迭代器 Iterable 可迭代对象"""

from collections importIterator,Iterable

it=iter(setvar)

res=isinstance(it,Iterator)(res)

res=print(res)

11.除了next(),也可以使用以下两种方式调用迭代器中的数据

1. for 循环

print(<=>)for i it:(i)2. for + next

)

lst= [1,2,3,4,5,6,7,8,9,10]

it=iter(lst)in range(10):

res=next(it)(res)(next(it))print(next(it))

高阶函数

高阶函数的定义:能够把函数当成参数传递的就是高阶函数

常用的四大高阶函数:map filter reduce sorted

1.map

map(func,Iterable)

功能:处理数据

把Iterable中的数据一个一个拿出来,扔到func函数中做处理

把处理之后的结果放到迭代器当中,最后返回迭代器

参数:

func : 自定义函数 或 内置函数

Iterable : 可迭代性数据(容器类型数据 range对象 迭代器)

返回值:

迭代器

示例1:将["1","2","3","4"]转化成[1,4]

常规写法:

lst = [1234]常规写法

lst_new =[]lst:

lst_new.append(int(i))print(lst_new)

用map改造的写法:

map改造

it = map(int,lst) it是一个map对象

print(list(it)) [1,4]

map(int,lst)的实现过程:

首先把"1" 扔到int当中做处理,将强转后的结果扔到迭代器中

然后把"2" 扔到int当中做处理,将强转后的结果扔到迭代器中

然后把"3" 扔到int当中做处理,将强转后的结果扔到迭代器中

然后把"4" 扔到int当中做处理,将强转后的结果扔到迭代器中

最终返回迭代器

获取迭代器中的数据的方法:1.next()  2.for循环遍历  3.for+next  4.list(it)强转

示例2:[1,4] => [2,24,64]

map改造

参数和返回值return一定要写'''

deffunc(n):return n <

lst= [1,4]

it=map(func,lst)(list(it))lambda + map

it = map(lambda n : n <print(list(it))

示例3:dic = {97:"a",98:"b",99:"c"} # ["a","b","c"] => ascii [97,98,99]

map改造

原字典

dic = {97:}新字典

dic_new ={}遍历原字典

for k,v dic.items():更换键值对

dic_new[v] =kprint(dic_new) {'a': 97,'b': 98,'c': 99}

通过键来获取值

returndic_new[n]

lst= [print(list(it))

2.filter

filter(func,iterable)

功能: 过滤数据

return True 当前这个数据保留

return False 当前这个数据舍弃

参数:

func : 自定义函数

iterable : 可迭代型数据(容器类型数据,range对象,迭代器)

返回值:

迭代器

lst = [1,1)">]

lst:if i % 2 ==0:

lst_new.append(i)(lst_new)filter改写

func(i):0:Trueelse:False

it=filter(func,lst)filter + lambda 改写

it = filter(lambda i : True if i % 2 == 0 False,lst )print(list(it))

3.reduce

reduce(func,iterable)

功能:计算数据

先把iterable中的前两个值拿出来,扔到func当中做运算,

把计算的结果和iterable中的第三个元素在扔到func当中做运算,

再把结果算出来,和第四个元素做运算,以此类推

直到所有结果运算完毕.返回该结果

参数:

func : 自定义函数

iterable : 可迭代型数据(容器类型数据,迭代器)

返回值:

计算之后的结果

示例1:lst = [5,8]  => 整型5488

常规写法1:

strvar = ""

lst:

strvar+=str(i)(strvar,type(strvar))

res=int(strvar)print(res,type(res))

常规写法2:

print(isinstance(it,Iterator)) True

num1= next(it) 5

num2 = next(it) 4

num = num1 * 10 + num2 54

it:

num= num * 10 + i 54*10+8=548 548*10+8=5488

print(num,type(num)) 5488

reduce改造:

func(x,y):return x*10 +y

lst= [5,1)">]

res =reduce(func,type(res))

reduce(func,lst)实现的过程:

先拿出5和4两个元素,扔到func当中做运算,结果是54

在拿54和8两个元素,结果548

在拿548和8两个元素,结果5488

返回最终的结果: 5488 程序结束

reduce+lambda:

res = reduce(lambda x,y:x*10+y,1)">print(res)

示例2:"789"=>789 禁止使用int强制转换

func1(x,1)"> yfunc2(n):

dic= {0":0,1)">":1,1)">":2,1)">":3,1)">":4,1)">5":5,1)">6":6,1)">7":7,1)">8":8,1)">9":9dic[n]

it= map(func2,1)">789") [7,9]

res =reduce(func1,it)4.sorted

sorted(iterable,key=函数,reverse=False)

功能:排序

参数:

iterable:可迭代型数据(容器类型数据,迭代器)

key :指定自定义函数或内置函数

reverse :代表升序或者降序,默认是升序(从小到大排序) reverse=False

返回值:

排序后的结果

1.默认是从小到大排序

lst = [1,-90,-4,-1,100sorted(lst)2.reverse 从大到小排序

res = sorted(lst,reverse=True)3.指定函数进行排序#按照绝对值排序 abs

lst = [-10,5]

res= sorted(lst,key=abs)4.使用自定义函数进行排序

lst = [19,21,38,43,55return n % 10lst= sorted(lst,1)">func)

print(lst)

sort和sorted的区别:

(1) sorted可以排序一切容器类型数据, sort只能排列表

(2) sorted返回的是新列表,sort是基于原有的列表进行修改

(3) 推荐使用sorted

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

如您喜欢交流学习经验,点击链接加入交流1群:1065694478(已满)交流2群:163560250

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值