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 时间处理datetime实例
Sep 06 Python
python基础教程之类class定义使用方法
Feb 20 Python
python人人网登录应用实例
Sep 26 Python
在Python编程过程中用单元测试法调试代码的介绍
Apr 02 Python
搞笑的程序猿:看看你是哪种Python程序员
Jun 12 Python
django传值给模板, 再用JS接收并进行操作的实例
May 28 Python
python中ASCII码和字符的转换方法
Jul 09 Python
使用python判断你是青少年还是老年人
Nov 29 Python
详解Python3 pickle模块用法
Sep 16 Python
Python如何安装第三方模块
May 28 Python
Python实现在线批量美颜功能过程解析
Jun 10 Python
Selenium自动化测试工具使用方法汇总
Jun 12 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
fetchAll()与mysql_fetch_array()的区别详解
2013/06/05 PHP
php实现邮件发送并带有附件
2014/01/24 PHP
php使用array_rand()函数从数组中随机选择一个或多个元素
2014/04/28 PHP
php开发中的页面跳转方法总结
2015/04/26 PHP
Codeigniter的dom类用法实例
2015/06/26 PHP
Prototype Array对象 学习
2009/07/19 Javascript
基于jquery的$.ajax async使用
2011/10/19 Javascript
Jquery 改变radio/checkbox选中状态,获取选中的值(示例代码)
2013/12/12 Javascript
动态加载js、css等文件跨iframe实现
2014/02/24 Javascript
jQuery窗口、文档、网页各种高度的精确理解
2014/07/02 Javascript
JavaScript中的闭包(Closure)详细介绍
2014/12/30 Javascript
jQuery progressbar通过Ajax请求实现后台进度实时功能
2016/10/11 Javascript
全屏滚动插件fullPage.js使用实例解析
2016/10/21 Javascript
bootstrap datepicker插件默认英文修改为中文
2017/07/28 Javascript
ReactJs实现树形结构的数据显示的组件的示例
2017/08/18 Javascript
微信小程序开发之好友列表字母列表跳转对应位置
2017/09/26 Javascript
Mac下通过brew安装指定版本的nodejs教程
2018/05/17 NodeJs
Js 利用正则表达式和replace函数获取string中所有被匹配到的文本(推荐)
2018/10/28 Javascript
微信小程序地图(map)组件点击(tap)获取经纬度的方法
2019/01/10 Javascript
在Mac OS上部署Nginx和FastCGI以及Flask框架的教程
2015/05/02 Python
Python使用中文正则表达式匹配指定中文字符串的方法示例
2017/01/20 Python
简单实现python收发邮件功能
2018/01/05 Python
python3使用pandas获取股票数据的方法
2018/12/22 Python
python实现维吉尼亚算法
2019/03/20 Python
Python 点击指定位置验证码破解的实现代码
2019/09/11 Python
解决Django部署设置Debug=False时xadmin后台管理系统样式丢失
2020/04/07 Python
python实现贪吃蛇双人大战
2020/04/18 Python
HTML5对手机页面长按会粘贴复制禁用的解决方法
2016/07/19 HTML / CSS
HTML5 常见面试题之PC端和移动端区别介绍
2018/01/22 HTML / CSS
Hobbs官方网站:英国奢华女性时尚服装
2020/02/22 全球购物
美国Max仓库:Max Warehouse
2020/05/31 全球购物
竞选班长演讲稿500字
2014/08/22 职场文书
高中教师先进事迹材料
2014/08/22 职场文书
缅怀先烈演讲稿
2014/09/03 职场文书
幼儿园园长工作总结2015
2015/05/25 职场文书
工作违纪的检讨书范文
2019/07/09 职场文书