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时区设置方法与pytz查询时区教程
Nov 27 Python
python实现自动登录人人网并访问最近来访者实例
Sep 26 Python
python查看FTP是否能连接成功的方法
Jul 30 Python
尝试使用Python多线程抓取代理服务器IP地址的示例
Nov 09 Python
Python 模拟购物车的实例讲解
Sep 11 Python
对python插入数据库和生成插入sql的示例讲解
Nov 14 Python
对Python协程之异步同步的区别详解
Feb 19 Python
详解Python使用Plotly绘图工具,绘制甘特图
Apr 02 Python
python Django 创建应用过程图示详解
Jul 29 Python
pandas的排序和排名的具体使用
Jul 31 Python
基于h5py的使用及数据封装代码
Dec 26 Python
使用PyCharm官方中文语言包汉化PyCharm
Nov 18 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
ThinkPHP采用模块和操作分析
2011/04/18 PHP
php出现web系统多域名登录失败的解决方法
2014/09/30 PHP
thinkphp模板输出技巧汇总
2014/11/24 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
2016/02/15 PHP
PHP二维数组去重算法
2016/12/17 PHP
Yii2中多表关联查询hasOne hasMany的方法
2017/02/15 PHP
PHP实现找出有序数组中绝对值最小的数算法分析
2017/08/07 PHP
PHP实现微信申请退款功能
2018/10/01 PHP
一个XML格式数据转换为图表的例子
2010/02/09 Javascript
javascript中的nextSibling使用陷(da)阱(keng)
2014/05/05 Javascript
5个可以帮你理解JavaScript核心闭包和作用域的小例子
2014/10/08 Javascript
node.js回调函数之阻塞调用与非阻塞调用
2015/11/13 Javascript
JS原型链怎么理解
2016/06/27 Javascript
jQuery实现Select左右复制移动内容
2016/08/05 Javascript
JavaScript中Number对象的toFixed() 方法详解
2016/09/02 Javascript
JS定时器实现数值从0到10来回变化
2016/12/09 Javascript
jquery获取下拉框中的循环值
2017/02/08 Javascript
利用jquery正则表达式在页面验证url网址输入是否正确
2017/04/04 jQuery
详谈jQuery.load()和Jsp的include的区别
2017/04/12 jQuery
Vue.js实例方法之生命周期详解
2017/07/03 Javascript
vue-cli3添加模式配置多环境变量的方法
2019/06/05 Javascript
浅谈vue单页面中有多个echarts图表时的公用代码写法
2020/07/19 Javascript
[01:10]为家乡而战!完美世界城市挑战赛全国总决赛花絮
2019/07/25 DOTA
[43:53]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.22
2019/09/05 DOTA
利用Python爬虫给孩子起个好名字
2017/02/14 Python
Python中字典和集合学习小结
2017/07/07 Python
python遍历文件夹下所有excel文件
2018/01/03 Python
Python中的CSV文件使用&quot;with&quot;语句的方式详解
2018/10/16 Python
pytorch masked_fill报错的解决
2020/02/18 Python
python爬虫实现爬取同一个网站的多页数据的实例讲解
2021/01/18 Python
使用canvas对多图片拼合并导出图片的方法
2018/08/28 HTML / CSS
人力资源主管岗位职责
2014/01/29 职场文书
学生检讨书怎么写
2015/05/07 职场文书
行为习惯主题班会
2015/08/14 职场文书
基于Redis延迟队列的实现代码
2021/05/13 Redis
利用Python判断你的密码难度等级
2021/06/02 Python