python基础系列 —— 迭代器与内置高阶函数
创始人
2024-05-30 10:01:46
0

目录

一、迭代器

1、基本概念

2、如何定义一个迭代器

3、如果判断对象是否是迭代器

4、如何重置迭代器

5、如何调用迭代器

二、高阶函数

1、map函数 

2、filter函数

3、reduce函数

4、sorted函数


一、迭代器

1、基本概念

    迭代:是一个重复的过程,每次重复都是基于上一次的结果而继续,单纯的重复不是迭代。

    可迭代对象:是指任何可以使用for循环遍历其元素的对象;常见的可迭代对象包括列表、元组、字符串和字典等;所有可迭代对象都有一个__iter__()方法。

setvar = {"a",1,"b",2}
for i in setvar:print(i)res = dir(setvar)
print(res)

     迭代器:迭代器是可以实现对集合从前向后依次遍历的一个对象;Python中所有可迭代对象都有一个__iter__()方法,该方法返回一个迭代器对象。这个迭代器对象具有__next__()方法,用于逐个返回序列中的下一个值。当没有更多值可供返回时,__next__()会引发StopIteration异常。

setvar =  {"a",1,"b",2}
it = iter(setvar) 
print(it)
print(dir(it))

    关联:可迭代对象 和 迭代器之间的关系: 从不可被直接获取 => 可被直接获取的过程。如果是一个可迭代对象,不一定是一个迭代器,如果是一个迭代器,一定是一个可迭代对象。可以通过dir()方法判断是否是迭代器。

2、如何定义一个迭代器

    通过iter()方法定义

"""(1)iter(可迭代对象)(2)可迭代对象.__iter__()
"""
setvar =  {"a",1,"b",2}
it = iter(setvar) 
print(it) # iterator

3、如果判断对象是否是迭代器

    通过三方包Iterator,Iterable判断

from collections import Iterator,Iterable
"""from 从哪里...  import 引入Iterator 迭代器类型 Iterable 可迭代对象
"""
# 判断setvar是否为可迭代对象
setvar = {"a","b","c"}
res = isinstance(setvar, Iterable)
print(res)# 判断range是否为迭代器
it = iter(range(5))
res = isinstance(it,Iterator)
print(res)

4、如何重置迭代器

    因为迭代器是不可逆的,重置需要重新调用

"""
next调用,单项不可逆,一条路走到黑
"""
it = iter(setvar)
res = next(it)
print(res)

5、如何调用迭代器

    (1) next(迭代器)
    (2)迭代器.__next__()
    迭代器通过next方法调用时,是单向不可逆的过程

# 1.通过next获取迭代器中的数据
setvar = {"a", "b", "c"}
it = iter(setvar)
print(next(it))
print(next(it))
print(next(it))# 2.通过for循环,遍历迭代器
print("<========>")
it = iter(range(6))
for i in it:print(i)
print("<========>")
# 3.for 和 next 配合调用迭代器
it = iter(range(100000))
for i in range(10): # 只调用前10个,0-9res = next(it)print(res)print("<===>")
for i in range(10): # 没有重置,继续从10开始调用res = next(it)print(res)

二、高阶函数

    高阶函数 : 能够把函数当成参数传递的就是高阶函数,主要包括map、filter、reduce、sorte。

1、map函数 

map(func,iterable)功能:把iterable里面的数据一个一个拿出来,放到func函数中进行处理,把处理的结果扔到迭代器中,返回迭代器
参数:func 自定义函数 或者 内置函数iterable 可迭代对象 (容器类型数据 range 迭代器)
返回值:迭代器
备注:主要做批处理,把iterable里面的数据根据自己的规则进行处理,最终输出。
# 1.转换列表的字符串为数字
# ["1","2","3","4"] => [1,2,3,4]lst = ["1","2","3","4"]
print(lst)
it = map(int,lst)
lst = list(it)
print(lst)# 代码分析:map函数首先拿出列表当中的"1",扔到int函数当中处理,处理的结果扔到迭代器当中,依次遍历。然后通过list强转迭代器 ,返回一个列表。# 2.处理列表的元素,整体变为二次方
# [1,2,3,4] => [1,4,9,16]lst = [1,2,3,4]# map方法一,自定义处理逻辑函数
def func(n):return n ** 2
it = map(func,lst)
# map方法二,利用匿名函数简化代码(推荐)
it = map( lambda n : n ** 2 , lst )# 强转成列表,瞬间拿到所有数据
print(list(it))# 3.根据字典的k或者v,取出对应的值
# dic = {97:"a",98:"b",99:"c"} 给你["a","b","c"] => 返回 [97,98,99]lst = ["a","b","c"]
dic = {97:"a",98:"b",99:"c"}def func(n):for k,v in dic.items():if n == v:return k
it = map(func,lst)
print(list(it))

2、filter函数

filter(func,iterable)功能:在自定义的函数中,过滤数据如果返回True  代表保留数据如果返回False 代表舍弃该数据
参数:func 自定义函数iterable 可迭代性数据(容器类型数据 range对象 迭代器)
返回值:迭代器
备注:这个函数f的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。
# 提取列表所有的奇数
# 1.[1,2,3,4,5,6,7,8] => [1, 3, 5, 7]lst = [1, 2, 3, 4, 5, 6, 7, 8]def func(n):if n % 2 == 0:return Falseelse:return Trueit = filter(func, lst)# 2.for
print("遍历输出所有元素")
it = filter(func, lst)
for i in it:print(i)# 3.for + next
print("遍历输出前两个元素")
it = filter(func, lst)
for i in range(2):print(next(it))# 4.list强转,瞬间得到所有数据
print("将所有结果强转为list")
it = filter(func, lst)
lst = list(it)
print(lst)# 改写成lambda 表达式
print("lambda简化代码,结果不变")
lst = [1, 2, 3, 4, 5, 6, 7, 8]
it = filter(lambda n: True if n % 2 == 1 else False, lst)
print(list(it))

3、reduce函数

reduce(func,iterable)功能:一次性从iterable当中拿出2个值,扔到func函数中进行处理,把运算的结果在和iterable的第三个值继续扔到func中做运算... 以此类推 最后返回计算的结果
参数:func 自定义函数iterable 可迭代性数据(容器类型数据 range对象 迭代器)
返回值:最后计算的结果
备注:类似聚合函数,利滚利
from functools import reduce# 1.计算列表 [2, 4, 5, 7, 12] 中所有元素的乘积,然后再将结果与初始值 2 相乘
# 2*4*5*7*12 再*2def prod(x, y):return x * y
print(reduce(prod, [2, 4, 5, 7, 12], 2))# 解释:reduce() 函数会对序列中的每个元素依次执行 prod() 函数,并将前一次调用的结果作为下一次调用时的第一个参数传入。最终得到所有元素相乘的结果。# 2.将列表转化为数字
# [5,4,8,8] => 5488lst = [5,4,8,8]
def func(x,y):return x*10 + y
res = reduce(func,lst)
print(res, type(res))"""
先从lst拿出前两个数据,5和4,扔到func当中进行运算 5 * 10 + 4 = 54
拿54 和 容器中第三个元素 8 , 扔到func当中进行运算 54 * 10 + 8 = 548 
拿548 和 容器中第四个元素 8 , 扔到func当中进行运算 548 * 10 + 8 = 5488
最后把5488 直接返回,程序结束.
"""# 优化成lambda表达式写法
print( reduce(lambda x,y : x * 10 + y,lst) )

4、sorted函数

sorted(iterable,reverse=False,key=函数)功能:  对数据进行排序
参数: iterable  : 具有可迭代性的数据(迭代器,容器类型数据,可迭代对象)reverse   : 是否反转 默认为False 代表正序, 改成True 为倒序key       : 指定函数 内置或自定义函数
返回值:返回排序后的数据
备注:可以对列表、元组等可迭代对象进行排序
# 1.对列表进行升序排列lst = [3, 2, 4, 1]
print(sorted(lst))   # 输出:[1, 2, 3, 4]# 2.对元组进行降序排列tpl = (5, 7 ,6 ,8)
print(sorted(tpl, reverse=True))   # 输出:[8, 7 ,6 ,5]# 3.按字符串长度对列表中的字符串进行升序排列lst = ['apple', 'banana', 'pear', 'orange']
print(sorted(lst,key=len))   # 输出:['pear', 'apple', 'banana', 'orange']# 4.对数组按照绝对值排序
lst = [3, -2, 4, 1, -10]
print(sorted(lst,key=abs))   # 输出:[1, -2, 3, 4, -10]

上一篇:Mysql—主从复制

下一篇:Android AIDL使用

相关内容

热门资讯

刁蛮公主逍遥王有第二部吗 刁蛮公主逍遥王有第二部吗没有,这是很早的片子了吧
只有5000元想创业 如何创业... 如果你也想在家自由创业,那方式也不少:1、做短视频,当下无意是非常适合自由创业的模式,无论身处何地,...
MIT工科生跨界AI,独作论文...   炒股就看金麒麟分析师研报,权威,专业,及时,全面,助您挖掘潜力主题机会! MIT理工男跨界艺术...
创业新项目 创业新项目 创业新...  我们知道,在创业的过程中,如果总是固步自封,一成不变,终会被社会所淘汰。而那些能够突破创新的,总是...
IEEE专家展望人工智能机器人... 中新网北京6月16日电 国际电器与电子工程师协会(IEEE)16日分享一篇专家文章,展望人工智能(A...
5月份全国生产资料市场价格环比... 成品油价格环比下降4.3%,同比下降12.1%,其中,92号汽油、95号汽油、0号柴油环比下降4.5...
找不到创业项目是你在犹豫!云纸... 近两年有个行业正在悄然崛起,默默绕过了共享充电宝、共享单车,自己发展,终于在2020年开始备受老百姓...
国家统计局:多因素共同作用致今... 转自:上观新闻针对今年以来中国货物进口下降的情况,中国国家统计局新闻发言人付凌晖16日回应说,这是国...
沧月羽系列全集哪里有 沧月羽系列全集哪里有第四部都还没有消息,怎么会有全集。前三部以出版,买书吧目前只出了三本 而且还不知...
广西鹿寨县严把电线电缆质量关 中国质量新闻网讯 为保障群众生命财产安全,近日,广西鹿寨县市场监管局在辖区范围内开展在售电线电缆专项...
雪人股份:投资者欲对接财务部被... 投资者提问:贵司整体经营状态良好,我们这边有一些地方政策及金融支持,请问方便给予贵司财务部联系方式,...
广西“桂字号”夏季水果香飘北京 钦州荔枝、北流荔枝、百色芒果、平南石硖龙眼……6月14日,在北京新发地国际农产品会展中心,2025年...
2020年创业新项目有什么? ... 5G时代的技术加持下,短视频营销潮流肯定会势不可当。因为凭借适应性广、传播性强、承载量大等特点,短视...
剖判华大学生创业贷款微信dxs... 华安宝利基金-日海通讯证监会制定了《关于加强新股发行监管的措施》,5G网络建设还将带动产业链上下游以...
民族文创“潮变”:创新力量让千... 中新网北京6月16日电 (黄欣欣)近日,由国家民委文化宣传司主办的铸牢中华民族共同体意识主题文创交流...
新鲜茶树菇不能和什么一起吃 新鲜茶树菇不能和什么一起吃新鲜的茶树菇是可以吃的,所以他没有说不能和别的不能一起吃,一般情况下因为它...
2020小本创业好项目 适合小... 零食小屋随着人们生活水平的不断提高,包装精美、口味独特的健康零食,将越来越受到人们的青睐。加之春节将...
抓!一名网上在逃人员在华阴落网 近日,华阴市公安局西岳派出所持续深化追逃工作,强化信息研判与合成作战能力,经过走访摸排和调查研判,6...
国家广播电视总局实施针对互联网... 观点网讯:据人民日报,近日,国家广播电视总局实施针对互联网电视自动续费服务的专项规范管理措施。此次治...
5月市场销售明显回升 以旧换新... 转自:央视新闻客户端国家统计局发布的最新统计数据显示,5月份,市场销售明显回升,以旧换新相关商品快速...