news 2026/5/30 5:27:35

8.8 迭代器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
8.8 迭代器

文章目录

  • 前言
  • 一、迭代与可迭代对象
    • 1.1 什么是迭代?
    • 1.2 可迭代对象
    • 1.3 自定义可迭代对象
  • 二、迭代器
    • 2.1 什么是迭代器?

前言

本文主要介绍了迭代与可迭代对象以及迭代器的基础知识。


一、迭代与可迭代对象

1.1 什么是迭代?

迭代是指通过重复执行某个过程来逐项访问集合中的元素。在Python中,我们经常使用 for 循环进行迭代。

pythonprint("迭代的基本概念:")print("="*50)# 字符串迭代print("1. 字符串迭代:")forcharin"Hello":print(f"{char}")print("\n2. 列表迭代:")# 列表迭代fruits=["apple","banana","cherry"]forfruitinfruits:print(f"{fruit}")print("\n3. 字典迭代:")# 字典迭代person={"name":"Alice","age":25,"city":"New York"}forkeyinperson:print(f"{key}:{person[key]}")# 更优雅的字典迭代方式print("\n 字典项迭代:")forkey,valueinperson.items():print(f"{key}:{value}")print("\n4. 使用enumerate同时获取索引和值:")# 使用enumerate获取索引和值colors=["red","green","blue"]forindex,colorinenumerate(colors):print(f" 索引{index}:{color}")print("\n5. 使用zip同时迭代多个序列:")# 使用zip同时迭代多个序列names=["Alice","Bob","Charlie"]scores=[85,92,78]forname,scoreinzip(names,scores):print(f"{name}:{score}分")

1.2 可迭代对象

可迭代对象是实现了iter() 方法的对象,或者实现了getitem() 方法且参数从0开始索引的对象。Python中大多数容器类型都是可迭代的。

pythonfromcollections.abcimportIterableprint("可迭代对象判断:")print("="*50)# 判断各种类型是否为可迭代对象test_items=[("字符串","Hello"),("列表",[1,2,3]),("元组",(1,2,3)),("集合",{1,2,3}),("字典",{"a":1,"b":2}),("range对象",range(5)),("数字",123),("布尔值",True),("None",None),("文件对象",open(__file__,'r')),("生成器",(xforxinrange(3))),]forname,itemintest_items:try:is_iterable=isinstance(item,Iterable)print(f"{name:15}是可迭代对象:{is_iterable}")# 尝试使用for循环验证ifis_iterableandnamenotin["文件对象","生成器"]:# 对于文件对象和生成器,我们不在这里迭代print(f" 示例迭代: ",end="")count=0forelementinitem:ifcount<3:# 只显示前3个元素print(f"{element}",end=" ")count+=1else:print("...",end="")breakprint()exceptExceptionase:print(f"{name:15}检查出错:{e}")print()# 注意:对于文件对象需要关闭ifisinstance(test_items[9][1],Iterable):test_items[9][1].close()print("可迭代对象的特点:")print("1. 可以使用 for 循环进行遍历")print("2. 可以使用 iter() 函数获取迭代器")print("3. 可以使用解包操作")print("4. 可以作为某些函数的参数(如 sum(), max(), min())")

1.3 自定义可迭代对象

pythonprint("自定义可迭代对象:")print("="*50)# 方法1:实现 __iter__() 方法classMyIterable1:"""通过实现 __iter__() 方法创建可迭代对象"""def__init__(self,data):self.data=datadef__iter__(self):# 返回一个迭代器returniter(self.data)# 方法2:实现 __getitem__() 方法classMyIterable2:"""通过实现 __getitem__() 方法创建可迭代对象"""def__init__(self,data):self.data=datadef__getitem__(self,index):returnself.data[index]def__len__(self):returnlen(self.data)# 测试自定义可迭代对象print("1. 实现 __iter__() 方法的类:")my_iter1=MyIterable1([10,20,30,40,50])print(f" 类型:{type(my_iter1)}")print(f" 是否可迭代:{isinstance(my_iter1,Iterable)}")print(" 迭代结果:",end=" ")foriteminmy_iter1:print(item,end=" ")print()print("\n2. 实现 __getitem__() 方法的类:")my_iter2=MyIterable2(["A","B","C","D","E"])print(f" 类型:{type(my_iter2)}")print(f" 是否可迭代:{isinstance(my_iter2,Iterable)}")print(" 迭代结果:",end=" ")foriteminmy_iter2:print(item,end=" ")print()print("\n3. 使用iter()函数获取迭代器:")# iter()函数的工作方式data=[1,2,3]iterator=iter(data)# 相当于 data.__iter__()print(f" 原始数据:{data}")print(f" 迭代器:{iterator}")print(f" next(iterator):{next(iterator)}")print(f" next(iterator):{next(iterator)}")print(f" next(iterator):{next(iterator)}")try:print(f" next(iterator):{next(iterator)}")exceptStopIterationase:print(f" 捕获 StopIteration 异常:{e}")print("\n4. 迭代器耗尽后重新获取:")# 迭代器只能使用一次,需要重新获取iterator1=iter(data)iterator2=iter(data)print(f" iterator1 - next():{next(iterator1)}")print(f" iterator2 - next():{next(iterator2)}")print(f" iterator1 - next():{next(iterator1)}")print(f" iterator2 - next():{next(iterator2)}")

二、迭代器

2.1 什么是迭代器?

迭代器是实现了迭代器协议的对象,必须包含两个方法:

iter():返回迭代器自身

next():返回下一个元素,如果没有元素则抛出 StopIteration 异常

pythonfromcollections.abcimportIteratorprint("迭代器详解:")print("="*50)# 判断各种对象是否为迭代器test_objects=[("列表",[1,2,3]),("列表的迭代器",iter([1,2,3])),("字符串","abc"),("字符串的迭代器",iter("abc")),("range对象",range(3)),("range对象的迭代器",iter(range(3))),("生成器表达式",(xforxinrange(3))),]print("检查是否为迭代器:")forname,objintest_objects:is_iterator=isinstance(obj,Iterator)print(f"{name:20}是迭代器:{is_iterator}")print("\n迭代器的特点:")print("1. 迭代器一定是可迭代的")print("2. 迭代器只能前进,不能后退")print("3. 迭代器是惰性的,只在需要时计算下一个值")print("4. 迭代器只能遍历一次,遍历完后需要重新创建")

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/20 11:42:23

VoxCPM-1.5-TTS-WEB-UI与网盘直链下载助手无关联说明

VoxCPM-1.5-TTS-WEB-UI 与网盘直链下载助手无关联说明 在人工智能语音技术飞速发展的今天&#xff0c;越来越多的研究者和开发者开始尝试将高质量的文本转语音&#xff08;TTS&#xff09;能力集成到实际应用中。从有声书生成、虚拟主播驱动&#xff0c;到智能客服系统构建&…

作者头像 李华
网站建设 2026/5/20 9:33:22

VoxCPM-1.5-TTS-WEB-UI语音模型开源协议说明及商用可行性分析

VoxCPM-1.5-TTS-WEB-UI语音模型开源协议说明及商用可行性分析 在智能语音技术加速落地的今天&#xff0c;越来越多企业开始关注如何以低成本、高效率的方式构建自有语音能力。尤其是在有声内容爆发、虚拟人兴起、无障碍服务普及的大背景下&#xff0c;文本转语音&#xff08;TT…

作者头像 李华
网站建设 2026/5/29 22:25:10

一文说清AD原理图如何无缝生成PCB板图

从原理图到PCB&#xff1a;如何在Altium Designer中实现真正“无缝”衔接你有没有遇到过这样的场景&#xff1f;花了整整三天画完一张复杂的STM32主控板原理图&#xff0c;信心满满地点击“Update PCB”&#xff0c;结果弹出一堆红色报错&#xff1a;“Footprint not found”、…

作者头像 李华
网站建设 2026/5/29 16:39:25

GLPI开源项目终极贡献指南:开发者快速成长路径

GLPI开源项目终极贡献指南&#xff1a;开发者快速成长路径 【免费下载链接】glpi glpi-project/glpi: 是一个用于管理 IT 资产和服务的 PHP 应用程序。适合用于 IT 资产管理和服务管理。特点是提供了简单的 API&#xff0c;支持多种 IT 资产和服务管理功能&#xff0c;并且可以…

作者头像 李华
网站建设 2026/5/29 3:26:08

从零实现Elasticsearch内存监控:手把手搭建资源观测体系

看得清&#xff0c;才能管得住&#xff1a;手把手构建 Elasticsearch 内存监控体系 你有没有遇到过这样的场景&#xff1f; 凌晨三点&#xff0c;告警突然炸响——某个 Elasticsearch 节点 OOM 退出集群。你匆忙登录系统&#xff0c;发现堆内存使用率早已突破 95%&#xff0c…

作者头像 李华
网站建设 2026/5/29 11:29:12

ONNX导出功能?暂未开放,后续可能支持

ONNX导出功能&#xff1f;暂未开放&#xff0c;后续可能支持 在当前语音合成技术飞速发展的背景下&#xff0c;像 CosyVoice3 这样的开源声音克隆项目正吸引越来越多研究者和开发者的关注。其宣称的“精准、情感丰富、多语言多方言”能力&#xff0c;为个性化语音生成打开了新的…

作者头像 李华