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之集成开发环境(IDE)
Sep 12 Python
python套接字流重定向实例汇总
Mar 03 Python
Python实现压缩与解压gzip大文件的方法
Sep 18 Python
Python类的继承和多态代码详解
Dec 27 Python
CentOS7.3编译安装Python3.6.2的方法
Jan 22 Python
pandas 按照特定顺序输出的实现代码
Jul 10 Python
对python pandas读取剪贴板内容的方法详解
Jan 24 Python
Python使用numpy模块实现矩阵和列表的连接操作方法
Jun 26 Python
深入了解Python在HDA中的应用
Sep 05 Python
Python+redis通过限流保护高并发系统
Apr 15 Python
python多进程 主进程和子进程间共享和不共享全局变量实例
Apr 25 Python
Python-openpyxl表格读取写入的案例详解
Nov 02 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 不同编码下的字符串长度区分
2009/09/26 PHP
php设计模式 Delegation(委托模式)
2011/06/26 PHP
php缩放图片(根据宽高的等比例缩放)实例介绍
2013/06/09 PHP
php使用sql数据库 获取字段问题介绍
2013/08/12 PHP
Yii框架连表查询操作示例
2019/09/06 PHP
js小技巧--自动隐藏红叉叉
2007/08/13 Javascript
javascript Excel操作知识点
2009/04/24 Javascript
Knockout数组(observable)使用详解示例
2013/11/15 Javascript
快速学习jQuery插件 jquery.validate.js表单验证插件使用方法
2015/12/01 Javascript
浅谈Angular.js中使用$watch监听模型变化
2017/01/10 Javascript
超全面的JavaScript开发规范(推荐)
2017/01/21 Javascript
使用JavaScript进行表单校验功能
2017/08/01 Javascript
React Native模块之Permissions权限申请的实例相机
2017/09/28 Javascript
[原创]js实现保存文本框内容为本地文件兼容IE,chrome,火狐浏览器
2018/02/14 Javascript
uni-app使用微信小程序云函数的步骤示例
2020/05/22 Javascript
Swiper实现导航栏滚动效果
2020/10/16 Javascript
ajax jquery实现页面某一个div的刷新效果
2021/03/04 jQuery
[50:04]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第二局
2016/02/28 DOTA
python实现在无须过多援引的情况下创建字典的方法
2014/09/25 Python
Flask入门教程实例:搭建一个静态博客
2015/03/27 Python
用Python写一个无界面的2048小游戏
2016/05/24 Python
Python 使用requests模块发送GET和POST请求的实现代码
2016/09/21 Python
利用Python批量提取Win10锁屏壁纸实战教程
2018/03/27 Python
python实现矩阵打印
2019/03/02 Python
介绍一款python类型检查工具pyright(推荐)
2019/07/03 Python
pytorch 中pad函数toch.nn.functional.pad()的用法
2020/01/08 Python
解决tensorflow读取本地MNITS_data失败的原因
2020/06/22 Python
python 实现简单的计算器(gui界面)
2020/11/11 Python
简单掌握CSS3中resize属性的用法
2016/04/01 HTML / CSS
CSS3实现翘边的阴影效果的代码示例
2016/06/13 HTML / CSS
日本面向世界,国际级的免税在线购物商城:DOKODEMO
2017/02/01 全球购物
C语言中一个结构不能包含指向自己的指针吗
2012/05/25 面试题
英语专业毕业个人求职自荐信
2013/09/21 职场文书
企业文化演讲稿
2014/05/20 职场文书
四风之害观后感
2015/06/09 职场文书
2016大学生暑期社会实践心得体会
2016/01/14 职场文书