【python】基础之迭代器

news/2024/11/16 8:35:23/文章来源:https://www.cnblogs.com/xwltest/p/18383645
  • 1.总览

  • 2.迭代器介绍

    • 2.1:迭代器是一个实现了迭代协议的对象,它可以让我们遍历一个容器中的所有元素,而不需要知道容器的内部结构,迭代器可以用于遍历列表,元祖,字典,集合等容器类型;
    • 2.2:迭代器的工作原理是通过实现两个方法:iter()和__next__()方法,iter()方法返回迭代器对象本身,next()方法每次调用都会返回容器中的下一个元素,直到容器中的所有元素都被遍历完毕后,再调用__next__()方法就会抛出Stopiteration异常;
  • 3.for循环底层原理

# 可迭代对象 === 容器
list01 = [11,22,33,44]# 迭代过程
# for item in list01:
#     print(item)# 迭代原理
# 面试题:for循环的原理是什么?
#      可以被for的条件时什么?
#         答:必须具备__iter__方法
# 1.获取迭代器
iterator = list01.__iter__()
# 2.循环获取每一个元素
while True:try:item = iterator.__next__()print(item)# 3.遇到异常停止迭代except StopIteration:break
  • 3.1:可以直接用作for循环的数据类型有:1、集合数据类型,如list,tuple,dict,set,str等;2、generator,包含生成器和带yeild的generator方法。这些用作for循环的对象统称为可迭代对象:iterable;而可以被next()函数调用并且不断返回下一个值的对象称为迭代器:iterator。

  • 3.2:list,dict,str等虽然是iterable,却不是iterator
    注:为什么list,dict,str等数据类型不是iterator?因为python的iterator对象表示的是一个数据流,iterator对象可以被next函数调用并且不断返回下一个数据,直到没有数据抛出Stopiteration错误,可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能通过next函数实现下一个数据,所以iterator的计算是惰性的。

  • 4.自定义迭代器

"""
迭代器:
"""
class Skill:passclass SkillIterator:def __init__(self,target):self.__target = targetself.__index = 0def __next__(self):# 如果没有数据了,抛出异常if self.__index > len(self.__target)-1:raise StopIteration# 返回下一个数据temp = self.__target[self.__index]self.__index += 1return tempclass SkillManger:def __init__(self):self.__skills = []def add_skill(self,skill):self.__skills.append(skill)def __iter__(self):# 创建一个迭代器对象,并传递需要被迭代的数据return SkillIterator(self.__skills)manger = SkillManger()
manger.add_skill(Skill())
manger.add_skill(Skill())
manger.add_skill(Skill())# for item in manger:
#     print(item)iterator = manger.__iter__()
while True:try:item = iterator.__next__()print(item)except StopIteration:break
  • 5.迭代器的优缺点
    • 优点
      • 为序列和非序列类型提供了一种统一的迭代取值方式。
      • 惰性计算:
        • 迭代器对象表示的是一个数据流,可以只在需要时才去调用next来计算出一个值
        • 就迭代器本身来说,同一时刻在内存中只有一个值,因而可以存放无限大的数据流,
        • 而对于其他容器类型,如列表,需要把所有的元素都存放于内存中,受内存大小的限制,可以存放的值的个数是有限的。
    • 缺点
      • 除非取尽,否则无法获取迭代器的长度
      • 只能取下一个值,不能回到开始,更像是‘一次性的’,迭代器产生后的唯一目标就是重复执行next方法直到值取尽,否则就会停留在某个位置,等待下一次调用next;
      • 若是要再次迭代同个对象,你只能重新调用iter方法去创建一个新的迭代器对象,如果有两个或者多个循环使用同一个迭代器,必然只会有一个循环能取到值。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java元注解介绍

Java四种元注解相关介绍 概述 注解从Java1.5引入以来,不断地简化我们编写代码的流程,逐渐的也成为了我们必学的一项技术。我们学习了各种注解,学习了他们的用法,学习了他们的限制,是否想过他们的组成呢,下面我将我对元注解的理解分享给大家。 元注解是用来修饰注解的注解…

RocketMQ在基金大厂的分布式事务实践

1 行业背景 基金公司核心业务主要分为:投研线业务,即投资管理和行业研究业务,体现基金公司核心竞争力 市场线业务,即基金公司利用自身渠道和市场能力完成基金销售并做好客户服务随互联网技术发展,基金销售渠道更加多元化,线上成为基金销售重要渠道。相比传统基金客户,线上…

从混乱到有序:10款建筑项目管理软件推荐

国内外主流的 10 款建筑企业项目管理系统对比:PingCode、Worktile、广联达、泛普软件、建文软件、Asana、Trello、Basecamp、Jira、Monday.com。在建筑行业,找到一个能够高效管理时间、成本和资源的项目管理系统常常是一项挑战。这种系统的选择不仅影响项目的流程和效率,还直…

begin-预览,不行啊还是太弱了

方便管理,主要是想熟悉下git的操作 先创建并且切换到一个新的分支: git commit --allow-empty -am "before starting PA1" git checkout -b PA1其中--allow-empty表示允许提交一个空的提交,git默认是不能提交一个空的提交信息,如果当前的文档没有什么修改,那么就…

nginx部署出现 Welcome to nginx! If you see this page 该如何解决

当你部署nginx的时候出现,ping域名网站可以通,但是访问不了网站怎么办,不用急,往下看; 1.问题所在其实出现以上的问题就代表你已经成功搭建好了nginx,只是现在默认访问的时候跳转到了nginx的首页问题。 2.解决方案 默认情况下,Nginx 安装后会使用默认配置文件,这些文件…

GLM-4-Flash 大模型API免费了,手把手构建“儿童绘本”应用实战(附源码)

GLM-4-Flash 大模型API免费了,我们本文基于免费API构建一个“儿童绘本”应用,包括使用文生图产出绘本故事插图……老牛同学刚刷到了一条劲爆的消息,GLM-4-Flash大模型推理 API 免费了:https://bigmodel.cn/pricing老牛同学一直觉得上次阿里云百炼平台为期 1 个月免费额度的…

CoreShop---.NET、Uni-App开发支持多平台的小程序商城系统

前言 小程序商城系统是当前备受追捧的开发领域,它可以为用户提供一个更加便捷、流畅、直观的购物体验,无需下载和安装,随时随地轻松使用。今天给大家推荐一个基于.NET、Uni-App开发支持多平台的小程序商城系统(该商城系统完整开源、无封装无加密、商用免费、支持二次开发、…

SQL server 特殊字符\u0000处理

某天,接到用户反馈点击某个项目分组的时候页面报错,点击其他项目不报错。初步以为是下标数字特殊符号导致的。通过前台输出对应的数值后发现该字段末尾有个“\u0000”特殊字符(ASCII字符char(0))。通常是导入数据时的格式问题或是程序处理时将页面中的换行字符保存数据库导…

Kettle: pentaho-server-ce-9.4 连接失败:ConnectionServiceImpl.ERROR_0009

pentaho-server-ce-9.4 数据库连接MYSQL8.0.37 , 测试连接失败, 提示: ConnectionServiceImpl.ERROR_0009-Connection to database [MYSQL8] failed .pentaho-server-ce-9.4 数据库连接MYSQL8.0.37 , 测试连接失败, 提示: ConnectionServiceImpl.ERROR_0009-Connection…

蓝桥杯补档

2013 省B P8597 翻硬币 H 一排硬币给出初态和终态,每次只能翻转相邻的两枚,求最少多少次 用贪心,因为翻转两次相当于没翻,所以最优方案中同一组硬币肯定最多翻转一次,所以翻转顺序无后效性。从前往后翻,只要不一样就把它和它后面的硬币都翻转一次,计数器累加2023 省A P9…

.NET周刊【8月第4期 2024-08-25】

国内文章 从控制台开始 关联 Win2D 和 WinUI 3 应用 https://www.cnblogs.com/lindexi/p/18378612 本文将告诉大家如何从最简单的控制台开始搭建,让 Win2D 和 WinUI 3 关联起来,让 Win2D 可以将内容渲染到 WinUI 3 应用上。 为何 Thread.Sleep 半毫秒和一毫秒等待时间差距如此…