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单线程实现多个定时器示例
Mar 30 Python
python的变量与赋值详细分析
Nov 08 Python
TF-IDF与余弦相似性的应用(一) 自动提取关键词
Dec 21 Python
Python生成短uuid的方法实例详解
May 29 Python
Windows 8.1 64bit下搭建 Scrapy 0.22 环境
Nov 18 Python
pyqt5 使用label控件实时显示时间的实例
Jun 14 Python
django 控制页面跳转的例子
Aug 06 Python
python3中的eval和exec的区别与联系
Oct 10 Python
python输出数学符号实例
May 11 Python
浅谈如何使用python抓取网页中的动态数据实现
Aug 17 Python
详解Python openpyxl库的基本应用
Feb 26 Python
使用qt quick-ListView仿微信好友列表和聊天列表的示例代码
Jun 13 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调试及性能分析工具Xdebug详解
2017/02/09 PHP
Laravel框架使用Seeder实现自动填充数据功能
2018/06/13 PHP
laravel框架数据库配置及操作数据库示例
2019/10/10 PHP
用脚本调用样式的几种方法
2006/12/09 Javascript
jQuery学习3:操作元素属性和特性
2010/02/07 Javascript
jQuery 表单验证扩展代码(一)
2010/10/11 Javascript
增强用户体验友好性之jquery easyui window 窗口关闭时的提示
2012/06/22 Javascript
Javascript前端UI框架Kit使用指南之kitjs事件管理
2014/11/28 Javascript
JS判断iframe是否加载完成的方法
2016/08/03 Javascript
获取jqGrid中选择的行的数据
2016/11/30 Javascript
js 轮播效果实例分享
2016/12/28 Javascript
jsTree事件和交互以及插件plugins详解
2017/08/29 Javascript
使用JS实现气泡跟随鼠标移动的动画效果
2017/09/16 Javascript
three.js中文文档学习之创建场景
2017/11/20 Javascript
Vue.js实现开发购物车功能的方法详解
2019/02/22 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
浅谈vue生命周期共有几个阶段?分别是什么?
2020/08/07 Javascript
[11:01]2014DOTA2西雅图邀请赛 冷冷带你探秘威斯汀
2014/07/08 DOTA
python 矩阵增加一行或一列的实例
2018/04/04 Python
解决python os.mkdir创建目录失败的问题
2018/10/16 Python
在PyCharm中三步完成PyPy解释器的配置的方法
2018/10/29 Python
浅谈python脚本设置运行参数的方法
2018/12/03 Python
Python3 利用face_recognition实现人脸识别的方法
2020/03/13 Python
美国电子产品主要品牌的授权在线零售商:DataVision
2019/03/23 全球购物
美国珠宝精品店:Opulent Jewelers
2019/08/20 全球购物
Zatchels官网:英国剑桥包品牌
2021/01/12 全球购物
公司财务工作总结的自我评价
2013/11/23 职场文书
大学生个人自我鉴定
2013/12/03 职场文书
公司财务总监岗位职责
2013/12/14 职场文书
团组织关系介绍信
2014/01/12 职场文书
大学军训感言600字
2014/02/25 职场文书
师恩难忘教学反思
2014/04/27 职场文书
中国梦演讲稿范文
2014/08/28 职场文书
地球物理学专业推荐信
2014/09/08 职场文书
实训报告范文大全
2014/11/04 职场文书
宣传委员竞选稿
2015/11/19 职场文书