一、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总结相关推荐

  1. async function_理解 Iterator, Generator 和 Async/Await

    戳蓝字「前端技术优选」关注我们哦! 这里重点理解他们三者分别是什么,有什么区别,以及分别适用什么场景 Iterator Iterator是最简单最好理解的,在很久之前我写过一篇文章 循环的秘密 里面讨 ...

  2. python中的生成器和迭代器:Generator和Iterator以及yield

    文章目录 Iterator Generator 构造生成器 Iterator 即迭代器,源自可迭代对象,例如list,tuple,dict,set,str等(凡是含有__iter__方法的,都是可迭代 ...

  3. ES Next Arrow function Promise Iterator Generator yield Async Await

    ES Next & Arrow function & Promise & Iterator & Generator yield & Async Await It ...

  4. 基于 Generator 和 Iterator 的惰性列表

    初识 Lazy List 如果有了解过 Haskell 的朋友,对下面的这些表达一定不陌生 repeat 1 -- => [1, 1, 1, 1, 1,...] cycle "abc& ...

  5. Python的生成器(generator)

    如果函数要产生一系列结果,那么最简单的做法是把这些结果放在一份列表(list)中,并将其返回给函数调用者.例如我们要获得一份文本中每个单词的长度. def get_word(text):result ...

  6. Python语言学习:复杂函数(yield/@property)使用方法、案例应用之详细攻略

    Python语言学习:复杂函数(yield/)使用方法.案例应用之详细攻略 目录 yield 1.生成斐波那契數列 @property 其他函数 yield 带有 yield 的函数在 Python ...

  7. Python天天美味(25) - 深入理解yield

    yield的英文单词意思是生产,刚接触Python的时候感到非常困惑,一直没弄明白yield的用法.只是粗略的知道yield可以用来为一个函数返回值塞数据,比如下面的例子: def  addlist( ...

  8. Python错误:AttributeError: 'generator' object has no attribute 'next'解决办法

    今天在学习生成器对象(generation object)运行以下代码时,遇到了一个错误: #定义生成器函数 def liebiao(): for x in range(10): yield x #函 ...

  9. 连Python产生器(Generator)的原理都解释不了,还敢说Python用了5年?

    最近有很多学Python同学问我,Python Generator到底是什么东西,如何理解和使用.Ok,现在就用这篇文章对Python Generator做一个敲骨沥髓的深入解析. 为了更好地理解产生 ...

最新文章

  1. c语言增强,C语言提高-day5
  2. 解决不了bug先放着,这里有40条提升编程技能小妙招
  3. ubuntu 安装Pangolin 过程_余辉亮的学习笔记的博客-CSDN博客_pangolin安装
  4. [TJOI2013]拯救小矮人(反悔贪心证明),「ICPC World Finals 2019」Hobson 的火车(基环树,差分)
  5. 洛谷 P1101 单词方阵
  6. XML解析-Dom4j的DOM解析方式更新XML
  7. 深度学习算法_深度学习算法
  8. 基于卷积神经网络模型的MSTAR高分辨率图像数据集识别实践
  9. ps新手秒变大师必备的Ps插件全在这!(mac版本)
  10. 尚硅谷大数据技术之Sqoop
  11. UWB超宽带定位技术
  12. 新产品开发流程管理:以市场为驱动【笔记】(二)
  13. IM TeamTalk流程分析
  14. 怎样才能走上架构师岗位
  15. 网页设计 基础知识汇总
  16. 一二线城市互联网公司汇总,助你拿高薪!
  17. Linux系统下安装Adobe Flash Player插件观播放视频
  18. Android高性能日志模块-Xlog 正篇
  19. 华为发布折叠屏官方适配方案
  20. 弹性与智能—下一代移动网络系统(RINGS)

热门文章

  1. Mongoose的链接和model优化
  2. WEB前后端交互原型通用元件库、常用组件、信息输出、信息输入、信息反馈、综合系列、页面交互、首页、分类页、内容详情、用户中心、注册登录、找回密码、元件库、web元件库、rplib、axure
  3. Axure高保真web端后台管理系统/垃圾回收分类系统/垃圾回收高保真原型设计 /垃圾分类后台管理系统/垃圾回收分类平台//垃圾回收分类智慧管理系统/订单管理/财务管理/系统管理/库存管理/设备管理
  4. 团队作业(二):项目选题
  5. blongsTo 用法
  6. AGC 26 F Manju Game
  7. Linux基础之命令练习Day4-fdisk,mkfs,mlabel,mount,umount,mkswap,swapon,dd,top,free,ps,kill,rpm,yum,make...
  8. 树状数组(搬运自维基百科)
  9. 【转载】Kali-linux安装之后的简单设置
  10. Looper,Handler, MessageQueue