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

Python(15)迭代器和生成器

        在 Python 编程领域中,迭代器和生成器是两个强大且独特的概念,它们为处理数据序列提供了高效且灵活的方式。这篇博客将结合菜鸟教程内容,通过丰富的代码示例,深入学习 Python3 中的迭代器与生成器知识,方便日后复习回顾。


一、迭代器

1.1 迭代器基础概念

        迭代是 Python 中访问集合元素的重要方式,而迭代器则是实现这一过程的关键对象。迭代器可以记住遍历的位置,从集合的第一个元素开始访问,直到所有元素访问完毕,且只能往前移动。像字符串、列表、元组这些常见的数据类型,都能用来创建迭代器。例如:

my_list = [10, 20, 30, 40]
my_iter = iter(my_list)
print(next(my_iter))  
print(next(my_iter))  

        上述代码中,先使用iter()函数将列表my_list转换为迭代器对象my_iter,然后通过next()函数逐个获取迭代器中的元素,依次输出1020 。

1.2 使用 for 语句遍历迭代器

        除了用next()函数,还能借助常规的for语句遍历迭代器。示例如下:        

my_list = [5, 10, 15, 20]
my_iter = iter(my_list)
for num in my_iter:print(num, end=" ")

        在这段代码里,for循环会自动调用迭代器的next()函数,直到迭代结束,输出结果为5 10 15 20。这种方式更为简洁直观,在实际编程中使用频率很高。

1.3 使用 while 循环结合 next () 函数遍历迭代器

        利用while循环和next()函数也能实现对迭代器的遍历,不过需要处理StopIteration异常来避免无限循环。示例代码如下:

import sys
my_list = [1, 2, 3]
my_iter = iter(my_list)
while True:try:print(next(my_iter))except StopIteration:sys.exit()

        在这个例子中,while循环持续调用next()函数获取迭代器中的元素,当迭代结束时,会抛出StopIteration异常,通过except语句捕获该异常并使用sys.exit()退出程序。

1.4 创建自定义迭代器

        创建自定义迭代器,需要在类中实现__iter__()__next__()方法。以创建一个从指定数字开始逐步递增的迭代器为例:

class IncrementIterator:def __init__(self, start=1):self.current = startdef __iter__(self):return selfdef __next__(self):value = self.currentself.current += 1return valuemy_iter = IncrementIterator(3)
print(next(my_iter))  
print(next(my_iter))  

        在上述代码中,IncrementIterator类实现了迭代器协议。__init__()方法用于初始化迭代器的起始值,__iter__()方法返回迭代器对象本身,__next__()方法返回当前值并将其递增。运行代码后,依次输出34

        还可以设置迭代的终止条件。比如,让迭代器在达到某个上限时停止:

class LimitedIncrementIterator:def __init__(self, start=1, limit=5):self.current = startself.limit = limitdef __iter__(self):return selfdef __next__(self):if self.current > self.limit:raise StopIterationvalue = self.currentself.current += 1return valuemy_iter = LimitedIncrementIterator(2, 6)
for num in my_iter:print(num)

        在这个示例中,LimitedIncrementIterator类增加了一个终止条件。__next__()方法会检查当前值是否超过上限limit,如果超过则抛出StopIteration异常,从而结束迭代。运行代码后,会输出23456


二、生成器

2.1 生成器基础概念

        在 Python 中,使用yield关键字的函数就是生成器函数,调用生成器函数会返回一个迭代器对象。生成器函数的独特之处在于,它可以在迭代过程中逐步产生值,而不是一次性返回所有结果,这在处理大量数据时能有效节省内存。例如,创建一个简单的生成器函数,用于生成从某个数开始递减的序列:

def decreasing_sequence(start):while start > 0:yield startstart -= 1my_generator = decreasing_sequence(4)
print(next(my_generator))  
print(next(my_generator))  

        在这段代码中,decreasing_sequence是生成器函数,yield语句使函数暂停执行并返回当前的start值。每次调用next()函数时,函数会从上次暂停的地方继续执行。运行代码后,依次输出43

2.2 使用 for 循环遍历生成器

        使用for循环遍历生成器非常方便,for循环会自动处理StopIteration异常。示例如下:

def number_generator():for num in range(1, 4):yield numgen = number_generator()
for value in gen:print(value)

        在这个例子中,number_generator生成器函数生成 1 到 3 的数字。for循环遍历生成器,依次输出123 。

2.3 生成器实现斐波那契数列

       斐波那契数列是一个经典的数学序列,利用生成器可以简洁地实现。示例代码如下:

def fibonacci_generator(n):a, b = 0, 1count = 0while True:if count > n:returnyield aa, b = b, a + bcount += 1fib_gen = fibonacci_generator(7)
for _ in range(8):print(next(fib_gen), end=" ")

        在这段代码中,fibonacci_generator是生成斐波那契数列的生成器函数。yield语句每次返回当前的斐波那契数,函数会在下次调用时继续计算下一个数。运行代码后,会输出斐波那契数列的前 8 项:0 1 1 2 3 5 8 13


三、总结

        Python3 的迭代器和生成器为数据处理提供了强大的支持。迭代器通过实现__iter__()__next__()方法,为遍历数据序列提供了统一的接口;生成器则借助yield关键字,以一种高效、节省内存的方式生成数据序列。在实际编程中,合理运用迭代器和生成器,能够优化代码结构,提高程序的性能。希望这篇博客能帮助你更好地复习和巩固迭代器与生成器的知识,在编程实践中灵活运用它们解决各种问题。

http://www.xdnf.cn/news/2667.html

相关文章:

  • IP SSL证书常见问题:快速实现HTTPS加密
  • 使用Docker安装Harbor
  • MCP 模型上下文协议配置MCP Server开发实践
  • android录音生成wav
  • Spring Boot定时任务
  • 深入浅出JavaScript常见设计模式:从原理到实战(2)
  • 一文读懂Tomcat应用之 CentOS安装部署Tomcat服务
  • rabbitmq-集群部署
  • 当所有人都用上先进ai,如何保持你的优势?
  • 用Postman验证IAM Token的实际操作
  • Error和Exception的区别
  • 第9讲:坐标轴美学深度优化——刻度线、网格线与边框控制
  • mapbox V3 新特性,室内楼层多层同时三维展示(可单层切换),类似蜂鸟视图效果
  • 深度学习任务评估指标
  • 从普查到防控:ArcGIS洪水灾害全流程分析技术实战——十大专题覆盖风险区划/淹没制图/水文分析/洪水分析/淹没分析/项目交流,攻克防洪决策数据瓶颈!
  • QT:自定义ComboBox
  • 自动驾驶领域专业词汇(专业术语)整理
  • leetcode 206. 反转链表
  • 湖北理元理律师事务所:债务管理领域的平台化创新探索
  • 回归预测 | Matlab实现DBO-LightGBM蜣螂算法优化轻量级梯度提升机多输入单输出回归预测,作者:机器学习之心
  • 嵌入式开发面试典型编程题解析:排序算法、指针操作、字符处理、递归原理等基础原理的深度解析。
  • 第33周JavaSpringCloud微服务 分布式综合应用
  • echarts+标签+指引线
  • 【javascript】竞速游戏前端优化:高频操作与并发请求的解决方案
  • 开源模型应用落地-全能音频新纪元-Kimi-Audio-7B-Instruct-重塑多模态交互边界
  • Transformer数学推导——Q29 推导语音识别中流式注意力(Streaming Attention)的延迟约束优化
  • 核心要点:线程
  • 解决MacOS端口被占用问题
  • 升级xcode15 报错Error (Xcode): Cycle inside Runner
  • Visual Studio 技能:调整软件界面布局