热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python学习【第五篇】python迭代器与生成器

一、什么是迭代器1.迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代(只能往后走不能往前退)2.


一、什么是迭代器


1.迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代(只能往后走不能往前退)


2.可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法)


3.协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如:for循环,sum,min,max函数等)使用迭代器协议访问对象


二、for循环的本质


for循环的本质:循环所有对象,全都是使用迭代器协议


字符串、列表、元祖、字典、集合、文件对象这些都不是可迭代对象(没有遵循迭代器协议,没有next方法),只不过在for循环时调用了内部的__iter__转换成了可迭代对象而已


li = [1, 2, 3]
aa = li.__iter__() # 将列表转换为可迭代对象
print(aa)
print(aa.__next__()) # 调用next方法
print(aa.__next__())
print(aa.__next__())

注:


for其实做了三件事:


1.将列表转换为可迭代对象


2.调用了__next__()方法


3.将StopIteration异常处理了


三、生成器


可以理解为一种数据类型,这种数据类型自动实现了迭代器协议,所以生成器就是可迭代对象


生成器的创建方式:



  • 生成器函数:常规函数定义,但是使用yield语句而不是return语句返回结果;yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行

  • 生成器表达式:类似于列表推导,但是生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表


生成器函数


def fun():
print("hhloo")
yield 1
print("44444")
yield 2
print('dddddd')
yield 3
g = fun() # 生成器对象
print(g) # 结果:
# 进行一次打印
print(g.__next__()) # 第一次next时调用函数到yield 1处函数返回,结果为hhloo,1
print(g.__next__()) # 第二次会从上一次离开的地方继续往下执行,结果:44444,2
print(g.__next__()) # 第三次执行 结果为:dddddd,3
print(g.__next__()) # 会抛StopIteration异常

生成器表达式


ccc = ('鸡蛋%s' % i for i in range(10))
print(ccc) # at 0x0000000000A273B8>
print(ccc.__next__())

注:


生成器表达式比生成器函数更加的节省内存


生成器注意项



  • 生成器在产生的过程中不做任何操作

  • 生成器只能遍历一次


def fun1():
for i in range(4):
yield i
t = fun1()
t1 = (i for i in t)
t2 = (i for i in t1)
print(list(t1)) # [0, 1, 2, 3]
print(list(t2)) # []

生成器的优点



  • 生成器的好处就是延迟计算,一次返回一个结果,它不会一次生成所有的结果。对于大数据处理,将会非常有用

  • 生成器还能有效的提供代码的可读性,使用生成器会使python代码更加的pythonic




推荐阅读
  • voc生成xml 代码
    目录 lxmlwindows安装 读取示例 可视化 生成示例 上面是代码,下面有调用示例 api调用代码,其实只有几行:这个生成代码也很简 ... [详细]
  • 在Python编程中,掌握高级技巧对于提升代码效率和可读性至关重要。本文重点探讨了生成器和迭代器的应用,这两种工具不仅能够优化内存使用,还能简化复杂数据处理流程。生成器通过按需生成数据,避免了大量数据加载对内存的占用,而迭代器则提供了一种优雅的方式来遍历集合对象。此外,文章还深入解析了这些高级特性的实际应用场景,帮助读者更好地理解和运用这些技术。 ... [详细]
  • 深入理解Spark框架:RDD核心概念与操作详解
    RDD是Spark框架的核心计算模型,全称为弹性分布式数据集(Resilient Distributed Dataset)。本文详细解析了RDD的基本概念、特性及其在Spark中的关键操作,包括创建、转换和行动操作等,帮助读者深入理解Spark的工作原理和优化策略。通过具体示例和代码片段,进一步阐述了如何高效利用RDD进行大数据处理。 ... [详细]
  • 开发心得:深入探讨Servlet、Dubbo与MyBatis中的责任链模式应用
    开发心得:深入探讨Servlet、Dubbo与MyBatis中的责任链模式应用 ... [详细]
  • 本文详细介绍了使用响应文件在静默模式下安装和配置Oracle 11g的方法。硬件要求包括:内存至少1GB,具体可通过命令`grep -i memtotal /proc/meminfo`进行检查。此外,还提供了详细的步骤和注意事项,确保安装过程顺利进行。 ... [详细]
  • 在稀疏直接法视觉里程计中,通过优化特征点并采用基于光度误差最小化的灰度图像线性插值技术,提高了定位精度。该方法通过对空间点的非齐次和齐次表示进行处理,利用RGB-D传感器获取的3D坐标信息,在两帧图像之间实现精确匹配,有效减少了光度误差,提升了系统的鲁棒性和稳定性。 ... [详细]
  • C#编程指南:实现列表与WPF数据网格的高效绑定方法 ... [详细]
  • 深入解析Gradle中的Project核心组件
    在Gradle构建系统中,`Project` 是一个核心组件,扮演着至关重要的角色。通过使用 `./gradlew projects` 命令,可以清晰地列出当前项目结构中包含的所有子项目,这有助于开发者更好地理解和管理复杂的多模块项目。此外,`Project` 对象还提供了丰富的配置选项和生命周期管理功能,使得构建过程更加灵活高效。 ... [详细]
  • 深入解析Java中HashCode的功能与应用
    本文深入探讨了Java中HashCode的功能与应用。在Java中,HashCode主要用于提高哈希表(如HashMap、HashSet)的性能,通过快速定位对象存储位置,减少碰撞概率。文章详细解析了HashCode的生成机制及其在集合框架中的作用,帮助开发者更好地理解和优化代码。此外,还介绍了如何自定义HashCode方法以满足特定需求,并讨论了常见的实现误区和最佳实践。 ... [详细]
  • 本文介绍了一种简化版的在线购物车系统,重点探讨了用户登录和购物流程的设计与实现。该系统通过优化界面交互和后端逻辑,提升了用户体验和操作便捷性。具体实现了用户注册、登录验证、商品浏览、加入购物车以及订单提交等功能,旨在为用户提供高效、流畅的购物体验。 ... [详细]
  • MongoDB Aggregates.group() 方法详解与编程实例 ... [详细]
  • MySQL:不仅仅是数据库那么简单
    MySQL不仅是一款高效、可靠的数据库管理系统,它还具备丰富的功能和扩展性,支持多种存储引擎,适用于各种应用场景。从简单的网站开发到复杂的企业级应用,MySQL都能提供强大的数据管理和优化能力,满足不同用户的需求。其开源特性也促进了社区的活跃发展,为技术进步提供了持续动力。 ... [详细]
  • 深入学习 Python 中的 xlrd 模块:掌握 Excel 文件读取技巧
    本文深入探讨了 Python 中的 xlrd 模块,重点介绍了如何高效读取 Excel 文件(包括 xlsx 和 xls 格式)。同时,文章还详细讲解了 xlwt 模块在 Excel 文件写操作中的应用。此外,文中列举了常见单元格数据类型及其处理方法,为读者提供了全面的实践指导。 ... [详细]
  • 如何判断一个度序列能否构成简单图——哈维尔-哈基米算法的应用与解析 ... [详细]
  • 题目编号为547的“朋友圈”问题属于中等难度。该问题描述了班级中有N名学生,部分学生之间存在友谊关系,且这种友谊关系具有传递性。即如果A和B是朋友,B和C也是朋友,那么A和C同样被视为朋友。本文将通过Python语言提供一种高效的解决方案,详细探讨如何利用图论中的并查集算法来快速计算出班级中所有互为朋友的学生群体数量。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有