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 相关文章推荐
python脚本设置超时机制系统时间的方法
Feb 21 Python
Python读取Word(.docx)正文信息的方法
Mar 15 Python
Python实现判断并移除列表指定位置元素的方法
Apr 13 Python
Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例
Jul 27 Python
Window 64位下python3.6.2环境搭建图文教程
Sep 19 Python
python3实现钉钉消息推送的方法示例
Mar 14 Python
python利用多种方式来统计词频(单词个数)
May 27 Python
pyqt5 lineEdit设置密码隐藏,删除lineEdit已输入的内容等属性方法
Jun 24 Python
Python转换字典成为对象,可以用&quot;.&quot;方式访问对象属性实例
May 11 Python
Python字符串函数strip()原理及用法详解
Jul 23 Python
Python中json.load()和json.loads()有哪些区别
Jun 07 Python
Python一些基本的图像操作和处理总结
Jun 23 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
PHP中round()函数对浮点数进行四舍五入的方法
2014/11/19 PHP
PHP计算加权平均数的方法
2015/07/16 PHP
php框架CodeIgniter使用redis的方法分析
2018/04/13 PHP
Thinkphp 3.2框架使用Redis的方法详解
2019/10/24 PHP
通过代码实例解析PHP session工作原理
2020/12/11 PHP
如何让您的中波更粗更长 - 中波框形天线制作
2021/03/10 无线电
jQuery 使用手册(五)
2009/09/23 Javascript
javascript 弹出层组件(升级版)
2011/05/12 Javascript
Jquery提交表单 Form.js官方插件介绍
2012/03/01 Javascript
如何从jQuery的ajax请求中删除X-Requested-With
2013/12/11 Javascript
node.js中的fs.readFile方法使用说明
2014/12/15 Javascript
JavaScript实现更改网页背景与字体颜色的方法
2015/02/02 Javascript
JavaScript实现数字数组按照倒序排列的方法
2015/04/06 Javascript
HTML5游戏引擎LTweenLite实现的超帅动画效果(附demo源码下载)
2016/01/26 Javascript
jQuery展示表格点击变色、全选、删除
2017/01/05 Javascript
初探nodeJS
2017/01/24 NodeJs
vue 实现axios拦截、页面跳转和token 验证
2018/07/17 Javascript
Vue.js路由实现选项卡简单实例
2019/07/24 Javascript
vue父子组件通信的高级用法示例
2019/08/29 Javascript
python文件读写操作与linux shell变量命令交互执行的方法
2015/01/14 Python
Python数据类型详解(二)列表
2016/05/08 Python
Python实现字符串与数组相互转换功能示例
2017/09/22 Python
python的exec、eval使用分析
2017/12/11 Python
PyTorch上实现卷积神经网络CNN的方法
2018/04/28 Python
python微元法计算函数曲线长度的方法
2018/11/08 Python
python增加图像对比度的方法
2019/07/12 Python
Python 进程操作之进程间通过队列共享数据,队列Queue简单示例
2019/10/11 Python
Python实现代码块儿折叠
2020/04/15 Python
python爬虫scrapy框架的梨视频案例解析
2021/02/20 Python
夜大毕业生自我评价分享
2013/11/10 职场文书
运动会表扬稿大全
2014/01/16 职场文书
乡镇干部先进事迹材料
2014/02/03 职场文书
通信工程专业求职信
2014/06/04 职场文书
八项规定个人对照检查材料思想汇报
2014/09/25 职场文书
学雷锋献爱心倡议书
2015/04/27 职场文书
2016年乡镇七一建党节活动总结
2016/04/05 职场文书