本站消息

站长简介/公众号


站长简介:逗比程序员,理工宅男,前每日优鲜python全栈开发工程师,利用周末时间开发出本站,欢迎关注我的微信公众号:幽默盒子,一个专注于搞笑,分享快乐的公众号

  价值13000svip视频教程,python大神匠心打造,零基础python开发工程师视频教程全套,基础+进阶+项目实战,包含课件和源码

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2020-07(7)

2020-08(35)

python基础 — 迭代器和生成器

发布于2021-06-12 12:17     阅读(602)     评论(0)     点赞(20)     收藏(0)



目录

1、迭代(iter)

2、可迭代对象(iterable)

3、迭代器(iterator)

4、生成器(generator)

5、return 和yield区别


1、迭代(iter)

迭代:访问集合元素的一种方式,可以遍历集合中的所有元素,例如我们使用的for循环来遍历列表。

迭代的好处:节省内存空间,迭代是读取多少元素,就将多少元素装载到内存中,不读取就不装。

2、可迭代对象(iterable)

可迭代对象:实现了__iter__方法,该方法会返回一个迭代器对象。for循环遍历的对象就是可迭代对象。

原生的可迭代对象:string, list, tuple, set, dict

使用内置函数isinstance()判断是否可迭代对象

  1. from collections.abc import Iterable, Iterator
  2. list = [1, 2, 3, 4]
  3. print(isinstance(list, Iterable)) # 判断是否可迭代
  4. print(isinstance(list, Iterator)) # 判断是否是迭代器
  5. print(isinstance(iter(list), Iterator)) # iter() 函数可以将可迭代对象转化成迭代器
  6. ------------------------------------------------------------------------------------------
  7. 运行结果:
  8. True
  9. False
  10. True

注:

iter()内置函数返回一个迭代器对象

3、迭代器(iterator)

如果在一个类中定义__iter__方法和__next__方法,那么这个类的实例就是一个迭代器。

迭代器是Python内置提供或转化而来的。

__iter__方法,返回一个迭代器,所以就返回对象本身即可(也就是self)。

__next__方法,返回当前迭代的结果,超出边界值会抛出StopIteration异常。

  1. # 自定义一个迭代器
  2. class MyIterator:
  3. def __init__(self, start, end):
  4. self.start = start
  5. self.end = end
  6. def __iter__(self):
  7. return self
  8. def __next__(self):
  9. if self.start < self.end:
  10. self.start += 1
  11. return self.start - 1
  12. else:
  13. raise StopIteration
  14. it = MyIterator(1, 5) # 实例化一个迭代器对象
  15. print(it)
  16. print(it.__next__())
  17. print(it.__next__())
  18. print(it.__next__())
  19. print(it.__next__())
  20. # print(it.__next__()) # 超出迭代对象的边界值,抛出StopIteration异常
  21. ------------------------------------------------------------------------
  22. 运行结果:
  23. <__main__.MyIterator object at 0x0000013CFD901AC0>
  24. 1
  25. 2
  26. 3
  27. 4

4、生成器(generator)

如果一个函数中使用了yield关键字,这个函数就是生成器函数。

生成器是开发人员自己用Python代码构建的数据结构

生成器可以看做一种特殊的迭代器,使用yield返回结果。

yield语句执行后,挂起函数的状态,起到暂停作用,以便下次从它离开的地方继续执行。

常用方法:

  1. __next__()方法,返回yield关键字后面表达式的值。
  2. send()方法,接受外部传入的一个参数,该参数指定的是上一次被挂起的yield语句的返回值。send()可以传递yield表达式的值进去。
  3. throw()方法,向生成器对象在上次被挂起处,抛出一个异常。
  4. close()方法,

 __next__()方法:

  1. def myGenerator():
  2. yield "start"
  3. yield "expression"
  4. yield "end"
  5. gen = myGenerator()
  6. print(gen) # 生成器对象
  7. print(gen.__next__())
  8. print(gen.__next__())
  9. print(gen.__next__())
  10. # print(gen.__next__())
  11. ------------------------------------------------------------
  12. 运行结果:
  13. <generator object myGenerator at 0x000001B734F7EBA0>
  14. start
  15. expression
  16. end

分析生成器执行过程:

  1. 当调用生成器方法时,会返回一个生成器对象 generator。
  2. 当调用生成器对象的__next__()方法时,会执行生成器方法中的代码,直至遇到yield语句时,方法的执行过程会被挂起。__next__()方法的返回值就是yield关键字后面表达式的返回值。
  3. 当我们继续调用__next__()方法时,从上一次挂起的地方开始,继续执行后面的代码。直至遇到下一个yield语句。
  4. 以此类推,当调用__next__()方法时,超出迭代范围,抛出StopIteration异常。

 注意:__next__()不能传递特定的值,只能传递None进去。等同于send(None)

  1. def myGenerator():
  2. value = yield "start"
  3. yield value
  4. yield "end"
  5. gen = myGenerator()
  6. print(gen)
  7. print(gen.__next__())
  8. print(gen.__next__())
  9. print(gen.__next__())
  10. ----------------------------------------------------------------
  11. 运行结果:
  12. <generator object myGenerator at 0x00000221BB85EBA0>
  13. start
  14. None
  15. end

 send() 方法: 

  1. # send方法
  2. def myGenerator():
  3. value1 = yield "start"
  4. yield value1
  5. yield "end"
  6. gen = myGenerator()
  7. print(gen)
  8. print(gen.__next__())
  9. print(gen.send("expression"))
  10. print(gen.__next__())
  11. ------------------------------------------------------------------
  12. 运行结果:
  13. <generator object myGenerator at 0x00000295E209EBA0>
  14. start
  15. expression
  16. end

注意:

在一个生成器对象没有执行__next__()方法之前,由于没有yield语句被挂起,执行send()方法会报错。

5、return 和yield区别

迭代器,return关键字返回函数的值,return后面的代码块不执行。

生成器,yield关键字返回生成器对象,需要的时候调用__next__()方法返回生成器对象的值,随用随取,节约内存空间。

原文链接:https://blog.csdn.net/panc_guizaijianchi/article/details/117515913






所属网站分类: 技术文章 > 博客

作者:csv

链接:https://www.pythonheidong.com/blog/article/984137/2636098a2e6f9fc08f8b/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

20 0
收藏该文
已收藏

评论内容:(最多支持255个字符)