python generator iterator_Python:Iterator、Generator和Yield总结
一、Iterator和Iterable
首先,要明白Iterable可迭代对象 和Iterator 迭代器的区别。
类中实现了__iter__(),那就认为它有迭代能力,其对象即可迭代对象,具有迭代能力,通常此函数必须返回一个实现__next__()的对象,如果这个类自身已经实现了__next__(),可以返回self,当然这个返回值不是必须的。
Iterator是迭代器,是指同时实现了__iter__()和__next__()的对象,缺一不可。
可以使用collection.abs里面的Iterator和Iterable配合isinstance函数来判断一个对象是否是可迭代的,是否是迭代器对象。该模块定义了一些抽象基类,它们可用于判断一个具体类是否具有某一特定的接口;例如,这个类是否可哈希,或其是否为映射类。
举个例子:
class B(object):
def __next__(self):
raise StopIteration
class A(object):
def __iter__(self):
return B()
class C:
def __iter__(self):
return self
def __next__(self):
raise StopIteration
from collections.abc import *
a = A()
b = B()
c=C()
print(isinstance(a, Iterable))
print(isinstance(a, Iterator))
print(isinstance(b, Iterable))
print(isinstance(b, Iterator))
print(isinstance(c, Iterable))
print(isinstance(c, Iterator))
输出结果为:True False False False True True
二、iter()
iter(object[, sentinel])object -- 支持迭代的集合对象。
sentinel -- 如果传递了第二个参数,则参数 object 必须是一个可调用的对象(如,函数),此时,iter 创建了一个迭代器对象,每次调用这个迭代器对象的__next__()方法时,都会调用 object。
返回值: 迭代器对象。
三、实现一个迭代器类,实现range()功能
通过next函数访问这个迭代器对象的下一个元素。在你停止迭代时抛出StopIteration的异常(for语句会捕获这个异常,并且自动结束for),下面实现了一个类似range函数的功能。
class MyRange(object):
def __init__(self, end):
self.start = 0
self.end = end
def __iter__(self):
return self
def __next__(self):
if self.start < self.end:
ret = self.start
self.start += 1
return ret
else:
raise StopIteration
from collections.abc import *
a = MyRange(5)
print(isinstance(a, Iterable))
print(isinstance(a, Iterator))
for i in a:
print(i)
#使用next()
print(next(a))
print(next(a))
print(next(a))
print(next(a))
print(next(a)) #其实到这里已经完成遍历了
print(next(a)) # 这里将抛出stopiteration的错误。
四、map()函数
map() 函数语法:map()会根据提供的函数对指定序列做映射
map(function, iterable, ...)
参数function -- 函数
iterable -- 一个或多个序列
返回值
Python 2.x 返回列表。
Python 3.x 返回迭代器。
五、yield和生成器
使用yield的主要目的是为了边用边生成,减少内存。
yield其实相当于return,不同的是含有yield的函数系统会将其视为生成器。当执行函数时,由于yield的关键字,其返回一个迭代器。
def foo():
print("starting...")
while True:
res = yield 4
print("res:",res)
g = foo()
print(isinstance(g,Iterator)) #True
print(next(g)) #4
print("*"*20)
print(next(g)) #res:None
4
代码中第一次执行next(g)时遇到yield后即返回4,因此print(next(g))输出4。
执行到第二个print(next(g))时,是从上次停止的断点开始执行的,即 res = yield 4;由于yield 4之前已经返回,没有值能够赋给res,因此res=None,加下来又运行到下一个yield 4停止,返回并输出4。
②、 send()方法
def foo():
print("starting...")
while True:
res = yield 4
print("res:",res)
g = foo()
print(next(g)) # 4
print("*"*20)
print(g.send(7)) # res:7
4
send()的作用是将值传递到上次执行的断点,然后接着向下执行一次,因此res为7,同时又走到下一次yield 4的位置。
python generator iterator_Python:Iterator、Generator和Yield总结相关推荐
- async function_理解 Iterator, Generator 和 Async/Await
戳蓝字「前端技术优选」关注我们哦! 这里重点理解他们三者分别是什么,有什么区别,以及分别适用什么场景 Iterator Iterator是最简单最好理解的,在很久之前我写过一篇文章 循环的秘密 里面讨 ...
- python中的生成器和迭代器:Generator和Iterator以及yield
文章目录 Iterator Generator 构造生成器 Iterator 即迭代器,源自可迭代对象,例如list,tuple,dict,set,str等(凡是含有__iter__方法的,都是可迭代 ...
- ES Next Arrow function Promise Iterator Generator yield Async Await
ES Next & Arrow function & Promise & Iterator & Generator yield & Async Await It ...
- 基于 Generator 和 Iterator 的惰性列表
初识 Lazy List 如果有了解过 Haskell 的朋友,对下面的这些表达一定不陌生 repeat 1 -- => [1, 1, 1, 1, 1,...] cycle "abc& ...
- Python的生成器(generator)
如果函数要产生一系列结果,那么最简单的做法是把这些结果放在一份列表(list)中,并将其返回给函数调用者.例如我们要获得一份文本中每个单词的长度. def get_word(text):result ...
- Python语言学习:复杂函数(yield/@property)使用方法、案例应用之详细攻略
Python语言学习:复杂函数(yield/)使用方法.案例应用之详细攻略 目录 yield 1.生成斐波那契數列 @property 其他函数 yield 带有 yield 的函数在 Python ...
- Python天天美味(25) - 深入理解yield
yield的英文单词意思是生产,刚接触Python的时候感到非常困惑,一直没弄明白yield的用法.只是粗略的知道yield可以用来为一个函数返回值塞数据,比如下面的例子: def addlist( ...
- Python错误:AttributeError: 'generator' object has no attribute 'next'解决办法
今天在学习生成器对象(generation object)运行以下代码时,遇到了一个错误: #定义生成器函数 def liebiao(): for x in range(10): yield x #函 ...
- 连Python产生器(Generator)的原理都解释不了,还敢说Python用了5年?
最近有很多学Python同学问我,Python Generator到底是什么东西,如何理解和使用.Ok,现在就用这篇文章对Python Generator做一个敲骨沥髓的深入解析. 为了更好地理解产生 ...
最新文章
- c语言增强,C语言提高-day5
- 解决不了bug先放着,这里有40条提升编程技能小妙招
- ubuntu 安装Pangolin 过程_余辉亮的学习笔记的博客-CSDN博客_pangolin安装
- [TJOI2013]拯救小矮人(反悔贪心证明),「ICPC World Finals 2019」Hobson 的火车(基环树,差分)
- 洛谷 P1101 单词方阵
- XML解析-Dom4j的DOM解析方式更新XML
- 深度学习算法_深度学习算法
- 基于卷积神经网络模型的MSTAR高分辨率图像数据集识别实践
- ps新手秒变大师必备的Ps插件全在这!(mac版本)
- 尚硅谷大数据技术之Sqoop
- UWB超宽带定位技术
- 新产品开发流程管理:以市场为驱动【笔记】(二)
- IM TeamTalk流程分析
- 怎样才能走上架构师岗位
- 网页设计 基础知识汇总
- 一二线城市互联网公司汇总,助你拿高薪!
- Linux系统下安装Adobe Flash Player插件观播放视频
- Android高性能日志模块-Xlog 正篇
- 华为发布折叠屏官方适配方案
- 弹性与智能—下一代移动网络系统(RINGS)
热门文章
- Mongoose的链接和model优化
- WEB前后端交互原型通用元件库、常用组件、信息输出、信息输入、信息反馈、综合系列、页面交互、首页、分类页、内容详情、用户中心、注册登录、找回密码、元件库、web元件库、rplib、axure
- Axure高保真web端后台管理系统/垃圾回收分类系统/垃圾回收高保真原型设计 /垃圾分类后台管理系统/垃圾回收分类平台//垃圾回收分类智慧管理系统/订单管理/财务管理/系统管理/库存管理/设备管理
- 团队作业(二):项目选题
- blongsTo 用法
- AGC 26 F Manju Game
- Linux基础之命令练习Day4-fdisk,mkfs,mlabel,mount,umount,mkswap,swapon,dd,top,free,ps,kill,rpm,yum,make...
- 树状数组(搬运自维基百科)
- 【转载】Kali-linux安装之后的简单设置
- Looper,Handler, MessageQueue