python生成器,可迭代对象,迭代器区别和联系


Posted in Python onFebruary 04, 2018

生成器,可迭代对象,迭代器之间究竟是什么关系?

用一幅图来概括:

python生成器,可迭代对象,迭代器区别和联系

1.生成器

定义生成器

方式一:

//区别于列表生成式 gen = [x*x for x in range(5)]
gen = (x*x for x in range(5)) 
print(gen) //Out:<generator object <genexpr> at 0x00000258DC5CD8E0>

方式二:

def fib():
  prev, curr = 0, 1
  while True:
    yield curr
    prev, curr = curr, curr + prev
f = fib()
print(f) //Out:<generator object fib at 0x00000258DC5CD150>

定义成功后,我们可以利用next()访问生成器下一个元素

print(next(gen)) //0
print(next(gen)) //1
...
print(next(gen)) //16
print(next(gen)) //StopIteration

但一般用for循环遍历

for n in gen:
  print(n) //0 1 4  9 16

2.迭代器

任何实现了__iter__和__next__()方法的对象都是迭代器。__iter__返回迭代器自身,__next__返回容器中的下一个值。所以生成器是特殊的迭代器,她内部具有这两种方法。

一个自定义的迭代器如下:

class Fib:
  def __init__(self):
    self.prev = 0
    self.curr = 1
 
  def __iter__(self):
    return self
 
  def __next__(self):
    value = self.curr
    self.curr += self.prev
    self.prev = value
    return value
f = Fib() 
count = 1 
for n in f:
  print(n)
  count = count+1
  if count>=10:
    break
//Out:1 1 2 3 5 8 13 21 34

3.可迭代对象

像list,tuple,set,dict,str等可以直接作用于for循环的对象,称为可迭代对象。可迭代对象实现了__iter__方法,用于返回迭代器。

demo = [1,2,3,4]
print(isinstance(demo, Iterable)) //True
iter_object = iter(demo)
print(iter_object) //<list_iterator object at 0x00000258DC5EF748>

 

Python 相关文章推荐
linux系统使用python获取内存使用信息脚本分享
Jan 15 Python
python应用程序在windows下不出现cmd窗口的办法
May 29 Python
python实现超简单端口转发的方法
Mar 13 Python
python实现将pvr格式转换成pvr.ccz的方法
Apr 28 Python
简析Python的闭包和装饰器
Feb 26 Python
python解决汉字编码问题:Unicode Decode Error
Jan 19 Python
Python实现通讯录功能
Feb 22 Python
利用python将json数据转换为csv格式的方法
Mar 22 Python
Python实现的爬取网易动态评论操作示例
Jun 06 Python
解决Django中checkbox复选框的传值问题
Mar 31 Python
Django-simple-captcha验证码包使用方法详解
Nov 28 Python
只需要100行Python代码就可以实现的贪吃蛇小游戏
May 27 Python
python实现mysql的读写分离及负载均衡
Feb 04 #Python
python负载均衡的简单实现方法
Feb 04 #Python
python爬虫爬取某站上海租房图片
Feb 04 #Python
Python爬虫实现百度图片自动下载
Feb 04 #Python
Python中的defaultdict与__missing__()使用介绍
Feb 03 #Python
Python网络爬虫神器PyQuery的基本使用教程
Feb 03 #Python
numpy.random.seed()的使用实例解析
Feb 03 #Python
You might like
图书管理程序(二)
2006/10/09 PHP
php下foreach提示Warning:Invalid argument supplied for foreach()的解决方法
2014/11/11 PHP
解析PHP之提取多维数组指定列的方法
2017/01/03 PHP
CSS中简写属性要注意TRouBLe的顺序问题(避免踩坑)
2021/03/09 HTML / CSS
关于IFRAME 自适应高度的研究
2006/07/20 Javascript
用javascript父窗口控制只弹出一个子窗口
2007/04/10 Javascript
javascript下arguments,caller,callee,call,apply示例及理解
2009/12/24 Javascript
js实现在同一窗口浏览图片
2014/09/17 Javascript
再谈javascript注入 黑客必备!
2016/09/14 Javascript
微信小程序 滚动到某个位置添加class效果实现代码
2017/04/19 Javascript
微信小程序出现wx.navigateTo页面不跳转问题的解决方法
2017/12/26 Javascript
js计算两个日期间的天数月的实例代码
2018/09/20 Javascript
Angular中innerHTML标签的样式不起作用的原因解析
2019/06/18 Javascript
es6数组之扩展运算符操作实例分析
2020/04/25 Javascript
ant design pro中可控的筛选和排序实例
2020/11/17 Javascript
[01:18:36]LGD vs VP Supermajor 败者组决赛 BO3 第一场 6.10
2018/07/04 DOTA
python去除文件中空格、Tab及回车的方法
2016/04/12 Python
使用Python抓取豆瓣影评数据的方法
2018/10/17 Python
python匹配两个短语之间的字符实例
2018/12/25 Python
python一些性能分析的技巧
2020/08/30 Python
Python爬虫scrapy框架Cookie池(微博Cookie池)的使用
2021/01/13 Python
python中time包实例详解
2021/02/02 Python
canvas裁剪clip()函数的具体使用
2018/03/01 HTML / CSS
应届行政管理专业个人自我评价
2013/12/28 职场文书
机关作风建设自查报告
2014/10/22 职场文书
党的群众路线教育实践活动心得体会(教师)
2014/10/31 职场文书
2014年酒店工作总结范文
2014/11/17 职场文书
合作与交流自我评价
2015/03/09 职场文书
村级干部党员公开承诺事项
2015/05/04 职场文书
复兴之路观后感
2015/06/02 职场文书
安娜卡列尼娜观后感
2015/06/11 职场文书
运动会广播稿300字
2015/08/19 职场文书
妇联2016年六一国际儿童节活动总结
2016/04/06 职场文书
Nginx反向代理及负载均衡如何实现(基于linux)
2021/03/31 Servers
浅谈Python从全局与局部变量到装饰器的相关知识
2021/06/21 Python
Mysql 如何合理地统计一个数据库里的所有表的数据量
2022/04/18 MySQL