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使用在线API查询IP对应的地理位置信息实例
Jun 01 Python
python使用range函数计算一组数和的方法
May 07 Python
Python多线程爬虫简单示例
Mar 04 Python
深入理解Django的中间件middleware
Mar 14 Python
解决Tensorflow使用pip安装后没有model目录的问题
Jun 13 Python
对python读写文件去重、RE、set的使用详解
Dec 11 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
Mar 20 Python
Windows下pycharm创建Django 项目(虚拟环境)过程解析
Sep 16 Python
基于python的selenium两种文件上传操作实现详解
Sep 19 Python
python 普通克里金(Kriging)法的实现
Dec 19 Python
python中if及if-else如何使用
Jun 02 Python
pytorch中Schedule与warmup_steps的用法说明
May 24 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自动更新新闻DIY
2006/10/09 PHP
php中禁止单个IP与ip段访问的代码小结
2012/07/04 PHP
php与Mysql的一些简单的操作
2015/02/26 PHP
PHP strripos函数用法总结
2019/02/11 PHP
NiftyCube——轻松实现圆角边框
2007/02/20 Javascript
jQuery Form 页面表单提交的小例子
2013/11/15 Javascript
jQuery+Ajax实现无刷新分页
2015/10/30 Javascript
七个不允许错过的jQuery小技巧
2015/12/21 Javascript
基于JavaScript短信验证码如何实现
2016/01/24 Javascript
预防网页挂马的方法总结
2016/11/03 Javascript
Bootstrap和Java分页实例第一篇
2016/12/23 Javascript
手机端js和html5刮刮卡效果
2020/09/29 Javascript
JS中静态页面实现微信分享功能
2017/02/06 Javascript
浅谈$_FILES数组为空的原因
2017/02/16 Javascript
JavaScript实现时间表动态效果
2017/07/15 Javascript
React Native时间转换格式工具类分享
2017/10/24 Javascript
ES6 系列之 WeakMap的使用示例
2018/08/06 Javascript
ES6学习笔记之字符串、数组、对象、函数新增知识点实例分析
2020/01/22 Javascript
OpenLayers3实现测量功能
2020/09/25 Javascript
[06:49]2018DOTA2国际邀请赛寻真——VirtusPro傲视群雄
2018/08/12 DOTA
[03:13]DOTA2-DPC中国联赛1月25日Recap集锦
2021/03/11 DOTA
python之import机制详解
2014/07/03 Python
基于Python实现的百度贴吧网络爬虫实例
2015/04/17 Python
Python使用MYSQLDB实现从数据库中导出XML文件的方法
2015/05/11 Python
使用Python实现博客上进行自动翻页
2017/08/23 Python
名片管理系统python版
2018/01/11 Python
Python常见MongoDB数据库操作实例总结
2018/07/24 Python
Python3内置函数chr和ord实现进制转换
2020/06/05 Python
Html5新标签解释及用法
2012/02/17 HTML / CSS
HTML5学习笔记之History API
2015/02/26 HTML / CSS
Guess荷兰官网:美国服饰品牌
2020/01/22 全球购物
作风整顿个人剖析材料
2014/10/06 职场文书
党性分析材料格式
2014/12/19 职场文书
2015年国际护士节演讲稿
2015/03/18 职场文书
无房证明样本
2015/06/17 职场文书
Mysql 一主多从的部署
2022/05/20 MySQL