4.4 可迭代对象(Iterable)与迭代器(Iterator)
创始人
2024-05-13 12:32:46
0

4.4 可迭代对象(Iterable)与迭代器(Iterator)

4.4.1 可迭代(Iterable)对象
如果一个对象实现了__iter__方法,那么这个对象就是可迭代(Iterable)对象
>>> #如何知道一个对象实现了那些方法,请使用help(对象)函数?
>>> help(list)
Help on class list in module builtins:class list(object)|  list(iterable=(), /)||  Built-in mutable sequence.||  If no argument is given, the constructor creates a new empty list.|  The argument must be an iterable if specified.||  Methods defined here:||  __add__(self, value, /)|      Return self+value.||  __contains__(self, key, /)|      Return key in self.||  __delitem__(self, key, /)|      Delete self[key].||  __eq__(self, value, /)|      Return self==value.||  __ge__(self, value, /)|      Return self>=value.||  __getattribute__(self, name, /)|      Return getattr(self, name).||  __getitem__(...)|      x.__getitem__(y) <==> x[y]||  __gt__(self, value, /)|      Return self>value.||  __iadd__(self, value, /)|      Implement self+=value.||  __imul__(self, value, /)|      Implement self*=value.||  __init__(self, /, *args, **kwargs)|      Initialize self.  See help(type(self)) for accurate signature.||  __iter__(self, /)|      Implement iter(self).||  __le__(self, value, /)|      Return self<=value.||  __len__(self, /)|      Return len(self).||  __lt__(self, value, /)
-- More  --

我们还可以通过调用Python内置函数isinstance()来判断一个对象是否属于可迭代(Iterable)对象。

在这里插入图片描述

不是可迭代对象:数字

可迭代对象:列表,元组,字典,集合,字符串,range对象

4.4.2 迭代器
实现了__iter__方法和__next__方法,并且可以通过__next__方法不断返回下一个值的对象称为迭代器(Iterator)。迭代器(Iterator)还可以通过内置函数next()访问下一个元素。

通过调用Python内置函数isinstance()来判断一个对象是否属于迭代器(Iterator)

在这里插入图片描述

列表,元组,字典,集合,字符串,range对象,数字,都不属于迭代器。


虽然列表、元组、字符串、字典、集合都是可迭代(Iterable)对象而不是迭代器(Iterator),但可以通过iter()函数获得一个迭代器(Iterator)

>>> from collections.abc import Iterator
>>> list=[1,2,3,4,5]
>>> isinstance(list,Iterator)
False
>>> #使用iter()函数获得一个迭代器
>>> list_iter=iter(list)
>>> isinstance(list_iter,Iterator)
True
>>> #返回下一个值
>>> list_iter.__next__()
1
>>> list_iter.__next__()
2
>>> #使用内置函数next()访问下一个元素
>>> next(list_iter)
3
>>> next(list_iter)
4
>>> next(list_iter)
5
>>> next(list_iter)
Traceback (most recent call last):File "", line 1, in 
StopIteration
>>> #没有下一个元素,则会触发StopIteration异常
4.4.3 相关内置函数
enumerate()

enumerate(iterable,start=0)

返回一个enumerate对象---下标和值,第一个参数表示可迭代对象,第二个参数表示下标的开始值,默认从0开始。

enumerate对象即是可迭代对象也是可迭代器

list(),tuple(),dict(),set()函数能将可迭代对象转换为列表、元组、字典、集合。

>>> l=['a','b']
>>> e=enumerate(l)
>>> e

>>> type(e)

>>> from collections.abc import Iterator
>>> isinstance(e,Iterator)
True
>>> #enumerate 对象转为列表list
>>> list(e)
[(0, 'a'), (1, 'b')]
>>> #enumeratr对象转为元组tuple,同时设置输出下标开始值为2
>>> #设置enumerate对象输出下标开始值为2
>>> e2=enumerate(l,2)
>>> #将enumerate对象转为元组tuple
>>> tuple(e2)
((2, 'a'), (3, 'b'))
>>> #遍历enumerate对象中的元素
>>> for i in enumerate(l):
...     print(i)
...
(0, 'a')
(1, 'b')
>>> #遍历enumerate对象元素的下标和值
>>> for i,j in enumerate(l):
...     print(i,j)
...
0 a
1 b
>>> #遍历enumerate对象,结尾使用‘ ’分隔
>>> for i,j in enumerate(l):
...     print(i,j,end=' ')
...
0 a 1 b >>>
>>> #将enumerate对象转换为字典
>>> e2=enumerate(l,1)
>>> dict(e2)
{1: 'a', 2: 'b'}
>>> #将enumerate对象转换为集合
>>> set(e2)
set()
>>> e2=enumerate(l,1)
>>> set(e2)
{(2, 'b'), (1, 'a')}
zip()

zip(iter1[,iter2[…]])

将多个迭代器(Iterator)对象(或者可迭代(Iterable)对象)中的元素压缩到一起,返回一个zip对象

将多个迭代器(Iterator)对象(或者可迭代(Iterable)对象)中的元素压缩到一起,返回一个zip对象

>>> l1=['a','b','c','d']
>>> l2=['A','B','C','D']
>>> #压缩l1和l2
>>> z1=zip(l1,l2)
>>> #转换为list
>>> list(z1)
[('a', 'A'), ('b', 'B'), ('c', 'C'), ('d', 'D')]
>>> l3=[1,2,3,4]
>>> #压缩l1,l2,l3并转为list
>>> z2=zip(l1,l2,l3)
>>> list(z2)
[('a', 'A', 1), ('b', 'B', 2), ('c', 'C', 3), ('d', 'D', 4)]
>>> l4=['一','二']
>>> #压缩l1和l4,不同长短时,匹配完最短的结束
>>> z3=zip(l1,l4)
>>> list(z3)
[('a', '一'), ('b', '二')]
>>> #只压缩一个迭代对象时
>>> z4=zip(l1)
>>> list(z4)
[('a',), ('b',), ('c',), ('d',)]
>>> #可见,将l1中的每个值,都转成了truple
>>> #只压缩一个迭代器对象时
>>> z5=zip(enumerate(l1))
>>> list(z5)
[((0, 'a'),), ((1, 'b'),), ((2, 'c'),), ((3, 'd'),)]
>>>
map()

map(func,*iterables)

把一个函数func依次映射到可迭代(Iterable)对象的每个元素上,返回一个map对象。

map对象既是一个可迭代(Iterable)对象也是一个迭代器(Iterator)对象。

>>> l=[1,2,3,4,5]
>>> #将l中的值,转为float类型
>>> l1=map(float,l)
>>> #此时将迭代器对象转为list
>>> list(l1)
[1.0, 2.0, 3.0, 4.0, 5.0]
>>> #将l中的值转为str类型
>>> list(map(str,l))
['1', '2', '3', '4', '5']
>>> #自定义函数,并融合map使用
>>> def cc(x):
...     return x*8
...
>>> list(map(cc,l))
[8, 16, 24, 32, 40]
>>> #使用lambda函数
>>> list(map(lambda x,y:x**2+y**2,[1,2],(2,3)))
[5, 13]
>>>
fiter()

filter(function or None,iterable)

1、function:iterable的元素作为入参传入函数,并使函数返回True时,保留当前元素
2、None,函数为None,则iterable中元素等价于True的元素保留。
>>> l=[1,2,3,'',True,'1','2',[],[1]]
>>> l
[1, 2, 3, '', True, '1', '2', [], [1]]
>>> #筛选出l中所有等价于True的元素
>>> list(filter(None,l))
[1, 2, 3, True, '1', '2', [1]]
>>> #筛选出所有数字
>>> def int_ok(x):
...     return isinstance(x,int)
...
>>> list(filter(int_ok,l))
[1, 2, 3, True]
>>> isinstance(True,int)
True
>>> #使用lambda函数
>>> list(filter(lambda x:isinstance(x,int),l))
[1, 2, 3, True]
>>> #预习:使用列表推导式也可以实现筛选
>>> [x for x in l if isinstance(x,int)]
[1, 2, 3, True]
>>>

上一篇:使用 npm 包

下一篇:蓝眼人问题

相关内容

热门资讯

原生安卓系统怎样升级,从基础到... 你有没有发现,你的安卓手机用久了,有时候就像老牛拉车一样,慢吞吞的?别急,今天就来给你支个招,让你的...
安卓13系统怎么开发,开发者的... 你有没有听说安卓13系统已经发布了?这可是个大新闻呢!作为一个热衷于手机开发的小伙伴,你是不是也跃跃...
安卓q系统镜像下载,轻松升级体... 你有没有听说安卓Q系统已经发布了?这可是安卓家族里的一大亮点呢!今天,我就要来给你详细介绍一下安卓Q...
安卓系统色彩校正软件,打造个性... 你有没有发现,手机屏幕的色彩有时候会让人感觉不太对劲?有时候,画面看起来有点灰蒙蒙的,有时候又太艳丽...
苹果能否下个安卓系统,开启新篇... 你有没有想过,苹果的iOS系统会不会有一天突然宣布,它要拥抱安卓的大家庭呢?想象iPhone和iPa...
树莓派 装 安卓系统,轻松安装... 你有没有想过,用树莓派装上安卓系统,那会是怎样一番景象呢?想象一个迷你电脑,竟然能运行起我们日常使用...
安卓系统怎么打印小票,安卓系统... 你是不是也遇到了这样的烦恼:手机里存了好多重要的小票,但是想打印出来保存或者报销,却发现安卓系统里的...
安卓10安装系统应用,轻松上手... 你有没有发现,你的安卓手机最近是不是有点儿“慢吞吞”的?别急,别急,今天就来给你支个招——升级安卓1...
美国不提安卓系统华为,迈向自主... 华为与美国:一场关于技术、市场与政策的较量在当今这个数字化的世界里,智能手机已经成为我们生活中不可或...
安卓系统怎么打开ppt,选择文... 你有没有遇到过这种情况:手里拿着安卓手机,突然需要打开一个PPT文件,却怎么也找不到方法?别急,今天...
谷歌退回到安卓系统,探索创新未... 你知道吗?最近科技圈可是炸开了锅,谷歌竟然宣布要退回到安卓系统!这可不是一个简单的决定,背后肯定有着...
安卓系统待机耗电多少,深度解析... 你有没有发现,手机电量总是不经用?尤其是安卓系统,有时候明明没怎么用,电量就“嗖”的一下子就下去了。...
小米主题安卓原生系统,安卓原生... 亲爱的手机控们,你是否曾为手机界面单调乏味而烦恼?想要给手机换换“衣服”,让它焕然一新?那就得聊聊小...
voyov1安卓系统,探索创新... 你有没有发现,最近你的手机是不是变得越来越流畅了?没错,我要说的就是那个让手机焕发青春的Vivo V...
电脑刷安卓tv系统,轻松打造智... 你有没有想过,家里的安卓电视突然变得卡顿,反应迟钝,是不是时候给它来个“大保健”了?没错,今天就要来...
安卓系统即将要收费,未来手机应... 你知道吗?最近有个大消息在科技圈里炸开了锅,那就是安卓系统可能要开始收费了!这可不是开玩笑的,这可是...
雷凌车载安卓系统,智能出行新体... 你有没有发现,现在的汽车越来越智能了?这不,我最近就体验了一把雷凌车载安卓系统的魅力。它就像一个聪明...
怎样拍照好看安卓系统,轻松拍出... 拍照好看,安卓系统也能轻松搞定!在这个看脸的时代,拍照已经成为每个人生活中不可或缺的一部分。无论是记...
安卓车机系统音频,安卓车机系统... 你有没有发现,现在越来越多的汽车都开始搭载智能车机系统了?这不,咱们就来聊聊安卓车机系统在音频方面的...
老苹果手机安卓系统,兼容与创新... 你手里那台老苹果手机,是不是已经陪你走过了不少风风雨雨?现在,它竟然还能装上安卓系统?这可不是天方夜...