如教程所说,迭代器和生成器算是 Python 一大特色,其核心是基于迭代器协议来的。

而平时我们经常使用的 for in 循环体,本质就是迭代器协议的一大应用。

同时 Python 内置的集合类型(字符、列表、元组、字典)都已经实现了迭代器协议,所以才能使用 for in 语句进行迭代遍历。for in 循环体在遇到 StopIteration 异常时,便终止迭代和遍历。

再说下可迭代、迭代器、生成器三个概念的联系和区别。

1、可迭代概念范围最大,生成器和迭代器肯定都可迭代,但可迭代不一定都是迭代器和生成器,比如上面说到的内置集合类数据类型。可以认为,在 Python 中,只要有集合特性的,都可迭代。

2、迭代器,迭代器特点是,均可以使用 for in 和 next 逐一遍历。

3、生成器,生成器一定是迭代器,也一定可迭代。

至于 Python 中为何要引入迭代器和生成器,除了节省内存空间外,也可以显著提升代码运行速度。

自定义迭代器类示例和说明如下:

class MyIter():

def __init__(self):

#为了示例,用一个简单的列表作为需迭代的数据集合,并且私有化可视情况变为其他类型集合

self.__list1=[1,2,3,4]

self.__index=0

def __iter__(self):

#该魔法方法,必须返回一个迭代器对象,如果self已经定义了__next__()魔法方法,则只需要返回self即可

#因为如上面所述,生成器一定是迭代器

return iter(self.list1)

def __next__(self):

#此处的魔法函数,python会自动记忆每次迭代的位置,无需再使用yield来处理

#在使用next(obj)时,会自动调用该魔法方法

res=self.__list1[self.__index]

self.__index+=1

return res

以上为自定义迭代器类的机制。

下面再示例说明下,如何自定义生成器函数,因为大多数实战场景中,使用生成器函数可能会更多一些:

def my_gene_func():

index=0

li=[1,2,3,4,5]

yield li[index]

index+=1

调用以上函数时,会返回一个生成器对象,然后对该生成器对象,使用 next() 逐一返回:

gene=my_gene_func()

next(gene)

其实核心的概念还是记忆上次迭代的位置,类中直接使用 __next__ 魔法方法实现,函数中使用 yield 实现。且怀疑,类中的 __next__ 魔法方法底层也是使用 yield 来实现的。

迭代器和生成器具体应用场景,就凡是需要提升运行效率或节约内存资源,且遍历的数据是集合形式的,都可以考虑。

另外一个小众的使用场景,是变相实现协程的效果,即在同一个线程内,实现不同任务交替执行

def mytask1():

print('task1 开始执行')

'''

task code

'''

yield

def mytask2():

print('task2 开始执行')

'''

task code

'''

yield

gene1=mytask1()

gene2=mytask2()

for i in range(100):

next(gene1)

next(gene2)

闫伟超

闫伟超

yif***chaoran@163.com6个月前 (05-14)

python3菜鸟-Python3 迭代器与生成器相关推荐

  1. Python3 中打的迭代器与生成器

    迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退 ...

  2. python3学习笔记10(迭代器和生成器)

    参考http://www.runoob.com/python3/python3-iterator-generator.html 迭代器 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束 ...

  3. python3 生成器_python3之迭代器和生成器

    python3之迭代器和生成器 一.迭代器 一) 迭代 重复多次,可以用 for-in 循环 字符串,元组,列表,字典,range都是可迭代的,但不是迭代器,可用来创建迭代器 二) 迭代器 包含 __ ...

  4. python3可迭代对象、迭代器、生成器、协程yield入门

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2019-01-24 16:13:07 # @Author : cdl (1217096 ...

  5. python yield用法_Python中迭代器和生成器的区别?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  6. python迭代器两个基本方法可供参考_浅析python迭代器和生成器

    可迭代对象 概念 一个对象(在Python里面一切都是对象)只要实现了只要实现了__iter__()方法,那么这个对象就是可迭代对象 常见的可迭代对象 集合或序列类型(如list.tuple.set. ...

  7. 怎么确定迭代器后面还有至少两个值_如何理解Python中的可迭代对象、迭代器和生成器

    ▍前言 在讨论可迭代对象.迭代器和生成器之前,先说明一下迭代器模式(iterator pattern),维基百科这么解释: 迭代器是一种最简单也最常见的设计模式.它可以让用户透过特定的接口巡访容器中的 ...

  8. 代码流程图生成器_【进阶Python】第五讲:迭代器与生成器

    点击蓝字关注我 迭代是Python中常用且非常强大的一个功能,它可以用于访问集合.列表.字符串.字典等数据结构的元素.我们经常使用循环和条件语句,我们也清楚哪些是可以迭代访问,但是具体它们之间有什么有 ...

  9. python魔法函数和装饰器_python魔法方法、构造函数、序列与映射、迭代器、生成器...

    在Python中,所有以__双下划线包起来的方法,都统称为"魔术方法".比如我们接触最多的__init__,魔法方法也就是具有特殊功能的方法. 构造函数 构造函数不同于普通方法,将 ...

最新文章

  1. The 13th Zhejiang Provincial Collegiate Contest(2016年浙江省赛)
  2. 为什么有的人知道很多却一事无成?
  3. 吉大18秋学期C语言作业二答案,吉大18秋《C语言程序设计》在线作业12参考
  4. 剑桥大学在机器人,半导体,5G,区块链方面的研究实验室
  5. P3302 SDOI2013森林
  6. Linux中wait()函数及waitpid()函数
  7. Java代码的编译与反编译那些事儿
  8. Nodejs留言板案例总结
  9. mysql利用binlog删除数据库_MySQL数据库之mysql手动删除BINLOG的方法
  10. 管理感悟:复制代码是错误行为
  11. RADIUS服务器不是消息,RADIUS通过如下哪些手段来确保RADIUS服务器与RADIUS客户端之间交互消息正确性()。...
  12. 招聘工作总结(精选多篇)
  13. 在 KITTI 数据集中利用车辆位姿真值拼接 pcd 点云并滤波,得到一个准确的点云地图
  14. python求幂_python 求幂
  15. html如何实现自动登录,Js实现下次自动登录功能
  16. android摄影程序,手机影像魅力:10款最佳Android摄影程序
  17. 八十二烷基笼状聚倍半硅氧烷poss无色透明黏稠液体|提高颜料分散性
  18. webstorm安装eslint插件_在WebStorm中使用ESLint开发Vue项目 | 六阿哥博客
  19. OpenGL(预备篇3)---OpenGL编程环境配置 vs2017篇---GLM---(自己动手系列)
  20. nacos使用mysql8作为存储媒介时报Caused by: com.mysql.cj.exceptions.CJException: Public Key Retrieval is not all

热门文章

  1. You Don't Know JS: Scope Closures(翻译)
  2. CF1081G Mergesort Strikes Back
  3. 视图组件,路由组件,版本控制
  4. SQL语句正常,在Navicat中运行正常,但是在后台运行,无法查询出数据,也不报错...
  5. Vue之vue-cli安装与简单调试
  6. 普通软件项目开发过程规范(五)—— 总结 (转)
  7. 如何用python创建一个下载网站-详解如何用python实现一个简单下载器的服务端和客户端...
  8. python基础教程第三版和第二版选哪个-python基础教程 2版和3版哪个适合新手?!...
  9. python入门基础知识教程-Python基础知识入门,这三个原则是你要知道的,还有教程...
  10. python编码读法-python中文读法