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安装Imaging报错:The _imaging C module is not installed问题解决方法
Aug 22 Python
用实例详解Python中的Django框架中prefetch_related()函数对数据库查询的优化
Apr 01 Python
Python实现保证只能运行一个脚本实例
Jun 24 Python
详解windows python3.7安装numpy问题的解决方法
Aug 13 Python
简单了解django索引的相关知识
Jul 17 Python
python使用celery实现异步任务执行的例子
Aug 28 Python
Python操作SQLite数据库过程解析
Sep 02 Python
在keras 中获取张量 tensor 的维度大小实例
Jun 10 Python
Jmeter HTTPS接口测试证书导入过程图解
Jul 22 Python
最新pycharm安装教程
Nov 18 Python
Python Process创建进程的2种方法详解
Jan 25 Python
python自动化办公操作PPT的实现
Feb 05 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
星际争霸 Starcraft 秘技补丁
2020/03/14 星际争霸
PHP 表单提交给自己
2008/07/24 PHP
php 模拟POST|GET操作实现代码
2010/07/20 PHP
php 深入理解strtotime函数的使用详解
2013/05/23 PHP
浅析PKI加密解密 OpenSSL
2013/07/01 PHP
windwos下使用php连接oracle数据库的过程分享
2014/05/26 PHP
php实现的短网址算法分享
2014/06/20 PHP
thinkphp实现like模糊查询实例
2014/10/29 PHP
PHP生成条形码大揭秘
2015/09/24 PHP
PHP设计模式之工厂方法设计模式实例分析
2018/04/25 PHP
PHP实现的超长文本分页显示功能示例
2018/06/04 PHP
URL编码转换,escape() encodeURI() encodeURIComponent()
2006/12/27 Javascript
window.showModalDialog使用手册
2007/01/11 Javascript
jquery 简短右键菜单 多浏览器兼容
2010/01/01 Javascript
JavaScript 面向对象的 私有成员和公开成员
2010/05/13 Javascript
动态加载图片路径 保持JavaScript控件的相对独立性
2010/09/06 Javascript
jQuery通过点击行来删除HTML表格行的实现示例
2014/09/10 Javascript
jQuery中outerHeight()方法用法实例
2015/01/19 Javascript
JavaScript中的类与实例实现方法
2015/01/23 Javascript
深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP详解
2015/03/05 Javascript
使用js实现将后台传入的json数据放在前台显示
2018/08/06 Javascript
详解小程序开发经验:多页面数据同步
2019/05/18 Javascript
关于ligerui子页面关闭后,父页面刷新,重新加载的方法
2019/09/27 Javascript
javascript实现弹出层效果
2019/12/10 Javascript
[01:36:17]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第一场 1月31日
2021/03/11 DOTA
超级英雄、电影和电视、乐队和音乐T恤:Loud Clothing
2019/09/01 全球购物
英国奢侈品牌时尚购物平台:Farfetch(支持中文)
2020/02/18 全球购物
个人查摆剖析材料
2014/02/04 职场文书
医学生个人求职信范文
2014/02/07 职场文书
开业庆典策划方案
2014/02/18 职场文书
相亲活动方案
2014/08/26 职场文书
乡镇党员群众路线教育实践活动对照检查材料思想汇报
2014/10/05 职场文书
房屋授权无偿使用证明
2014/11/29 职场文书
微信小程序和php的登录实现
2021/04/01 PHP
postman中form-data、x-www-form-urlencoded、raw、binary的区别介绍
2022/01/18 HTML / CSS
Python开发五子棋小游戏
2022/05/02 Python