当前位置: 首页 > news >正文

学习之什么是迭代器

什么是迭代器

迭代器的作用:访问容器中的元素
首先要了解什么是Iterable

lterable(可迭代的)

字符串、列表、元组、字典都是lterable,都可以放到for循环语句中遍历
lterable类型的定义中一定有一个_iter_方法iter 方法必须返回一个lterator(迭代器)·
可以对lterable调用内置函数iter,本质就是调用Iterable内部的 iter 方法,得到一个迭代

iterator

lterator继承了lterable,所以lterator一定是可迭代的对象,反之则不然。
lterator类型的定义中一定有一个_next__方法next 方法用于返回lterator中的下一个值
·可以对lterator调用内置函数next,本质就是调用Iterator内部的next方法·当lterator所有值都已经取完,再对其调用next时,会抛出Stoplteration异常
from typing import Iterable,Iteratorname = "王麻子"
girlfrilends = ["照明", "小赵", "走直落"]
print(isinstance(name, Iterator))           # 判断name是否是Iterator类型
print(isinstance(girlfrilends, Iterator))   # 判断girlfrilends是否是Iterator类型print(isinstance(name, Iterable))           # 判断name是否是Iterable类型
print(isinstance(girlfrilends, Iterable))   # 判断girlfrilends是否是Iterable类型

运行结果
在这里插入图片描述

# 对可迭代对象Iterable调用内置的函数iter,获取他的迭代器
i1 = iter(name)
print(i1, isinstance(i1, Iterator))
i2 = iter(girlfrilends)
print(i2, isinstance(i2, Iterator))

运行结果:
在这里插入图片描述

# 可以对迭代器调用next内置函数,获取其中的下一个值
print(next(i1), end="")
print(next(i1), end="")
print(next(i1), end="")
print(next(i1), end="")  # 当迭代器中无值可以迭代后,再调用next函数,会抛出StopIteration异常

运行结果:
在这里插入图片描述

# 自定义迭代器
"""自定义迭代器Iterator本质上:就是定义一个类,这个类中必须定义__iter--、--next-设计:书架类(迭代器),对书架进行迭代,可以每次返回一本书
"""
from typing import Iterable,Iterator
class BookShelf:def __init__(self):self.books = ["西游记", "水浒传", "红楼梦", "三国演义"]self.curr_index = -1  # 当前已经迭代到的值的索引def __iter__(self):"""用于返回迭代器"""return selfdef __next__(self):if self.curr_index == len(self.books)-1:raise StopIterationself.curr_index += 1print(self.curr_index)return self.books[self.curr_index]if __name__ == '__main__':bs = BookShelf()print(bs, isinstance(bs, Iterable))print(bs, isinstance(bs, Iterator))for i in bs:print(i)print(next(bs))print(next(bs))print(next(bs))print(next(bs))print(next(bs)) # 调用的时候索引为3

运行结果:
在这里插入图片描述

http://www.lryc.cn/news/448243.html

相关文章:

  • 数据结构-3.6.队列的链式实现
  • Java中去除字符串中的空格
  • AI大模型算法工程师就业宝典—— 高薪入职攻略与转行秘籍!
  • node-rtsp-stream、jsmpeg.min.js实现rtsp视频在web端播放
  • C++ 9.27
  • 让具身智能更快更强!华东师大上大提出TinyVLA:高效视觉-语言-动作模型,遥遥领先
  • Excel 获取某列不为空的值【INDEX函数 | SMALL函数或 LARGE函数 | ROW函数 | ISBLANK 函数】
  • 爆火!大模型算法岗 100 道面试题全解析,赶紧收藏!
  • Python画笔案例-068 绘制漂亮米
  • 得物App荣获国家级奖项,正品保障引领潮流电商新风尚
  • 【BurpSuite】SQL注入 | SQL injection(1-2)
  • ThreadPoolExecutor有哪些核心的配置参数?
  • 关于工作虚拟组的一些思考
  • 【Redis入门到精通六】在Spring Boot中集成Redis(含配置和操作演示)
  • 【CSS】透明度 、过渡 、动画 、渐变
  • 尚硅谷vue3+TypeScript笔记大全
  • New major version of npm available! 8.3.1 -> 10.8.3 报错
  • Python(七)- 文件操作
  • Docker技术深度解析与实践案例
  • llama_deploy
  • 平衡二叉搜索树插入的实现
  • ROS理论与实践学习笔记——2 ROS通信机制之通信机制实践
  • CDGA|数据治理:策略与价值的深度融合
  • 49. 建模软件绘制3D场景(Blender)
  • 如何使用 DomCrawler 进行复杂的网页数据抓取?
  • 维修服务品牌小程序渠道客获
  • 【全新课程】正点原子《基于GD32 ARM32单片机项目实战入门》培训课程上线!
  • Kafka系列之:安装使用kafka_exporter详细步骤
  • Paddlets时间序列集成模型回测实战:MLPRegressor、NHiTSModel与RNNBlockRegressor
  • 【anki】显示 “连接超时,请更换网络后重试” 怎么办