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发送邮件实例
Jan 10 Python
Windows上使用virtualenv搭建Python+Flask开发环境
Jun 07 Python
python实现获取Ip归属地等信息
Aug 27 Python
Python入门_浅谈逻辑判断与运算符
May 16 Python
TensorFlow实现Softmax回归模型
Mar 09 Python
在python中利用KNN实现对iris进行分类的方法
Dec 11 Python
Python中遍历列表的方法总结
Jun 27 Python
从列表或字典创建Pandas的DataFrame对象的方法
Jul 06 Python
Python Opencv提取图片中某种颜色组成的图形的方法
Sep 19 Python
python装饰器的特性原理详解
Dec 25 Python
浅谈Pycharm的项目文件名是红色的原因及解决方式
Jun 01 Python
浅析NumPy 切片和索引
Sep 02 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
基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
2013/05/07 PHP
PHP array_multisort() 函数的深入解析
2013/06/20 PHP
php二维码生成以及下载实现
2017/09/28 PHP
PHP程序员简单的开展服务治理架构操作详解(二)
2020/05/14 PHP
CCPry JS类库 代码
2009/10/30 Javascript
SwfUpload在IE10上不出现上传按钮的解决方法
2013/06/25 Javascript
div模拟选择框示例代码
2013/11/03 Javascript
浅析JavaScript基本类型与引用类型
2014/05/28 Javascript
javascript实现随机读取数组的方法
2015/08/03 Javascript
学习JavaScript设计模式(单例模式)
2015/11/26 Javascript
VUEJS实战之构建基础并渲染出列表(1)
2016/06/13 Javascript
JS使用单链表统计英语单词出现次数
2016/06/16 Javascript
javascript获取网页各种高宽及位置的方法总结
2016/07/27 Javascript
Bootstrap实现input控件失去焦点时验证
2016/08/04 Javascript
bootstrap实现的自适应页面简单应用示例
2017/03/09 Javascript
vue.js项目 el-input 组件 监听回车键实现搜索功能示例
2018/08/25 Javascript
python实现划词翻译
2020/04/23 Python
对python中url参数编码与解码的实例详解
2019/07/25 Python
flask框架jinja2模板与模板继承实例分析
2019/08/01 Python
Python 基于FIR实现Hilbert滤波器求信号包络详解
2020/02/26 Python
Django admin管理工具TabularInline类用法详解
2020/05/14 Python
如何一键升级Python所有包
2020/11/05 Python
python搜索算法原理及实例讲解
2020/11/18 Python
用CSS3打造HTML5的Logo(实现代码)
2016/06/16 HTML / CSS
IE10 Error.stack 让脚本调试更加方便快捷
2013/04/22 HTML / CSS
杭州联环马网络笔试题面试题
2013/08/04 面试题
什么是跨站脚本攻击
2014/12/11 面试题
客服端调用EJB对象的几个基本步骤
2012/01/15 面试题
Java程序开发中如何应用线程
2016/03/03 面试题
学生自我鉴定范文
2013/10/04 职场文书
优秀中学生事迹材料
2014/01/31 职场文书
2015仓库保管员年终工作总结
2015/05/13 职场文书
教师培训简讯
2015/07/20 职场文书
听课评课活动心得体会
2016/01/15 职场文书
《巨人的花园》教学反思
2016/02/19 职场文书
Redis实现主从复制方式(Master&Slave)
2022/06/21 Redis