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利用pyHook实现监听用户鼠标与键盘事件
Aug 21 Python
Python中关键字nonlocal和global的声明与解析
Mar 12 Python
Python3下错误AttributeError: ‘dict’ object has no attribute’iteritems‘的分析与解决
Jul 06 Python
你眼中的Python大牛 应该都有这份书单
Oct 31 Python
python 动态加载的实现方法
Dec 22 Python
python3读取excel文件只提取某些行某些列的值方法
Jul 10 Python
3个用于数据科学的顶级Python库
Sep 29 Python
Python寻找两个有序数组的中位数实例详解
Dec 05 Python
Python中的单下划线和双下划线使用场景详解
Sep 09 Python
opencv python如何实现图像二值化
Feb 03 Python
安装python依赖包psycopg2来调用postgresql的操作
Jan 01 Python
Python基础详解之邮件处理
Apr 28 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
浅谈Windows下 PHP4.0与oracle 8的连接设置
2006/10/09 PHP
在PHP中PDO解决中文乱码问题的一些补充
2010/09/06 PHP
基于php常用函数总结(数组,字符串,时间,文件操作)
2013/06/27 PHP
android上传图片到PHP的过程详解
2015/08/03 PHP
php组合排序简单实现方法
2016/10/15 PHP
PHP自动识别当前使用移动终端
2018/05/21 PHP
有关PHP 中 config.m4 的探索
2020/08/26 PHP
js中cookie的使用详细分析
2008/05/28 Javascript
JS实现切换标签页效果实例代码
2013/11/01 Javascript
JavaScript在IE和FF下的兼容性问题
2014/05/19 Javascript
原生js结合html5制作简易的双色子游戏
2015/03/30 Javascript
jQuery实现单击弹出Div层窗口效果(可关闭可拖动)
2015/09/19 Javascript
JavaScript实现瀑布流布局
2020/06/28 Javascript
详解vue.js全局组件和局部组件
2017/04/10 Javascript
vue引入swiper插件的使用实例
2017/07/19 Javascript
ionic2懒加载配置详解
2017/09/01 Javascript
微信jssdk逻辑在vue中的运用详解
2018/11/14 Javascript
微信小程序实现注册登录功能(表单校验、错误提示)
2019/12/10 Javascript
uni-app 组件里面获取元素宽高的实现
2019/12/27 Javascript
linux服务器快速卸载安装node环境(简单上手)
2021/02/22 Javascript
[40:57]TI4 循环赛第二日 iG vs EG
2014/07/11 DOTA
python文件比较示例分享
2014/01/10 Python
Python开发如何在ubuntu 15.10 上配置vim
2016/01/25 Python
浅谈Python 对象内存占用
2016/07/15 Python
微信跳一跳游戏python脚本
2020/04/01 Python
Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法
2018/02/03 Python
Python中数组,列表:冒号的灵活用法介绍(np数组,列表倒序)
2018/04/18 Python
CSS3属性background-size使用指南
2014/12/09 HTML / CSS
NIHAOMARKET官方海外旗舰店:意大利你好华人超市
2018/01/27 全球购物
联想阿根廷官方网站:Lenovo Argentina
2019/10/14 全球购物
市场营销个人求职信范文
2014/02/02 职场文书
不同意离婚上诉状
2015/05/23 职场文书
2015年秋季开学典礼校长致辞
2015/07/16 职场文书
运动会3000米加油稿
2015/07/21 职场文书
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
2021/04/13 Python
浅谈Node的内存泄露问题
2022/05/06 NodeJs