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

news2024/11/25 12:34:47

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 "<stdin>", line 1, in <module>
StopIteration
>>> #没有下一个元素,则会触发StopIteration异常
4.4.3 相关内置函数
enumerate()

enumerate(iterable,start=0)

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

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

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

>>> l=['a','b']
>>> e=enumerate(l)
>>> e
<enumerate object at 0x0000022B06394B80>
>>> type(e)
<class 'enumerate'>
>>> 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]
>>>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/169266.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32MP157内核移植相关bug

STM32MP157 官方Linux5.15内核移植相关bug一、主频问题二、驱动开发时的头文件缺失问题三、结语一、主频问题 在初学STM32MP157驱动开发时&#xff0c;笔者曾对官方最新版的Linux内核进行了移植&#xff0c;但是因为一些问题&#xff0c;导致移植后的系统存在一些bug。最近笔者…

Java学习之抽象类

目录 一、抽象类引出 二、抽象类的介绍 三、抽象类的细节 第一条 第二点 第三点 第四点 第五点 第六点 第七点 第八点 四、练习 第一题 第二题 一、抽象类引出 当父类的一些方法不能确定时,可以用abstract关键字来修饰该方法&#xff0c;这个方法就是抽象方法,用…

【设计模式】创建者模式·建造者模式

学习汇总入口【23种设计模式】学习汇总(数万字讲解体系思维导图) 写作不易&#xff0c;如果您觉得写的不错&#xff0c;欢迎给博主来一波点赞、收藏~让博主更有动力吧&#xff01; 一.概述 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 …

Python实现哈里斯鹰优化算法(HHO)优化支持向量机回归模型(SVR算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 2019年Heidari等人提出哈里斯鹰优化算法(Harris Hawk Optimization, HHO)&#xff0c;该算法有较强的全…

目标检测——day66 Scaled-YOLOv4: Scaling Cross Stage Partial Network

Scaled-Yolov4:可伸缩跨级部分网络 Scaled-YOLOv41. Introduction2. Related work2.1. Real-time object detection2.2. Model scaling&#xff08;模型缩放&#xff09;3. Principles of model scaling4. Scaled-YOLOv44.1. CSP-ized YOLOv44.2. YOLOv4-tiny4.3. YOLOv4-large…

上海亚商投顾:沪指缩量小幅调整 半导体与旅游股领涨

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。市场情绪沪指今日缩量小幅调整&#xff0c;创业板指稍显强势&#xff0c;多数时间红盘运行&#xff0c;科创50指数涨超1%。半…

springMVC讲解(上)

SpringMvc 1&#xff0c;简介 springmvc是spring的一个后续产品&#xff0c;是spring的一个子项目&#xff0c;是spring为表示层所开发的一整套完备的解决方案&#xff0c;在表示层框架经历了struct、webWork、struct2等诸多产品的历代更迭之后&#xff0c;目前业界普遍选择了…

JAVA就业课程,面试题大全

面试整体流程1.1 简单的自我介绍我是xxxx,工作xxx年.我先后在xxxx公司、yyyy公司工作。先后做个xxxx项目、yyyy项目。1.2 你简单介绍一下xxxx项目为了解决xxxx问题&#xff0c;开发了一套xxxx系统&#xff0c;该系统主要有那些部分组成。简单介绍项目的整体架构。参与某个模块的…

【Python学习】输入和输出

前言 往期文章 【Python学习】列表和元组 【Python学习】字典和集合 【Python学习】条件和循环 在很多时候&#xff0c;你会想要让你的程序与用户&#xff08;可能是你自己&#xff09;交互。你会从用户那里得到输入&#xff0c;然后打印一些结果。我们可以使用iinput和pr…

MATLAB趣味绘图-内接正六边形旋转

MATLAB趣味绘图-内接正六边形旋转 观察一下内部的正六边形大概在外部的正六边形边的四等分点的位置&#xff0c;通过数学平面几何知识可得边和角度的迭代关系式为&#xff1a; an134an−1θnθn−1arctan⁡36a_n \frac{\sqrt{13}}{4} a_{n-1} \\ \theta_n \theta_{n-1}\arcta…

金融行业数据库场景下,SmartX 超融合表现如何|性能验证与落地实践

在金融行业&#xff0c;数据库是一项至关重要的 IT 基础设施。作为交易和数据的主要载体&#xff0c;数据库往往需要在短时间内处理大量的业务数据&#xff0c;其可靠性、稳定性和性能将直接影响业务系统的运行状态。而在进行数据库基础架构选型时&#xff0c;一些客户对于超融…

C++学习笔记——类和对象

1.面向对象的三大特性&#xff1a;封装、继承、多态 2.对象有其属性和行为 3.具有相同性质的对象&#xff0c;可被抽象为类 1.封装 1.封装是C面向对象三大特性之一 2.封装的意义&#xff1a; &#xff08;1&#xff09;将属性&#xff08;变量&#xff09;和行为&#xff…

python学习 --- 字典基础

目录 一、什么是字典&#xff1f; 1、字典示意图-无序说明 2、字典实现原理 二、字典的创建 1、使用花括号 2、使用内置函数dict() 三、字典常用操作 1、字典中元素的获取 2、key的判断&#xff08;存在与否&#xff09; 3、字典元素的删除 4、字典元素的新增 5、获…

计讯物联智慧水务解决方案:用“智水”捍卫生命之泉

项目背景 水是生命的源泉&#xff0c;是城市的灵魂&#xff0c;是农业的命脉&#xff0c;是工业的基石。2022年以来&#xff0c;基于国家政策的引导、科技革新的驱动与供排水需求增长&#xff0c;智慧水务的发展突飞猛进&#xff0c;从信息化到数字化&#xff0c;再到智能化&a…

若依 ruoyi vue el-switch 列表开关状态显示有误 全部关闭的问题

后台使用int类型传状态status的值但是前端列表展示的开关状态是未开启&#xff0c;实际上&#xff0c;后台传的都是开启的状态结果应该是这样确定后台传的status值 在 el-switch 标签中是否使用了正确的值判断&#xff0c;比如 后台用的是字符串、布尔 或者是 数值类型&#xf…

android判断文件是否存在跳转不同activity

android studio版本&#xff1a;2021.2.1Patch 2例程名称&#xff1a;ActivityJump完成日期&#xff1a;2023.1.17一直在完善一个小东西&#xff0c;也是不断的在学习。之前做的那个桌面日历天气&#xff08;老旧安卓手机发挥余热做桌面时钟摆件使用&#xff09;&#xff0c;有…

java 数列排序

试题 基础练习 数列排序提交此题 评测记录 资源限制内存限制&#xff1a;512.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s问题描述给定一个长度为n的数列&#xff0c;将这个数列按从小到大的顺序排列。1<n<200输入格式…

【渗透测试】信息搜集总结

前言零零散散的发布过很多文章了&#xff0c;但是也没有完整的总结一下&#xff0c;今天就从信息搜集入手&#xff0c;系统的总结一下。一方面可以巩固自己的基础&#xff0c;作为自己的字典随用随查&#xff0c;另一方面希望对大家的学习和工作起到帮助作用。按照这个过程基本…

求两点间的距离-C语言实现

任务描述 已知两点A(x1,y1),B(x2,y2),求其间的距离。 输入 一行四个浮点数,x1,y1,x2,y2 输出 两点间的距离,要求不要输出多余的零。 本关知识 两点间的距离公式 pow函数 在C语言中,提供了用于求x的y次幂的函数,函数原型为: double pow(double x, double y…

啊啊啊小红书爆款标题技巧被我找到了!

我通过平日里对小红书的了解和积累&#xff0c;再加上这一阵子对小红书爆款笔记的研究&#xff0c;终于在这么多笔记当中发现了小红书爆款笔记标题的撰写规律&#xff01; 我们在撰写小红书的时候恨不得篇篇都是爆文&#xff0c;那么今天就来讲一下小红书那些爆款笔记标题的撰写…