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爬虫框架Scrapy安装使用步骤
Apr 01 Python
python中根据字符串调用函数的实现方法
Jun 12 Python
pandas使用get_dummies进行one-hot编码的方法
Jul 10 Python
对python实现模板生成脚本的方法详解
Jan 30 Python
在Python 中同一个类两个函数间变量的调用方法
Jan 31 Python
Python字符串处理的8招秘籍(小结)
Aug 13 Python
关于Python核心框架tornado的异步协程的2种方法详解
Aug 28 Python
Python类中方法getitem和getattr详解
Aug 30 Python
python3.8与pyinstaller冲突问题的快速解决方法
Jan 16 Python
pycharm激活码快速激活及使用步骤
Mar 12 Python
Python 打印自己设计的字体的实例讲解
Jan 04 Python
Python创建SQL数据库流程逐步讲解
Sep 23 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
2021年最新CPU天梯图
2021/03/04 数码科技
PHP 已经成熟
2006/12/04 PHP
PHP采集腾讯微博的实现代码
2012/01/19 PHP
ThinkPHP5.0框架使用build 自动生成模块操作示例
2019/04/11 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
2019/06/03 PHP
laravel 创建命令行命令的图文教程
2019/10/23 PHP
JavaScript 动态将数字金额转化为中文大写金额
2009/05/14 Javascript
JavaScript中两个感叹号的作用说明
2011/12/28 Javascript
实测jquery data()如何存值
2013/08/18 Javascript
JS设置获取cookies的方法
2014/01/26 Javascript
javascript类型转换使用方法
2014/02/08 Javascript
jquery基础教程之数组使用详解
2014/03/10 Javascript
JS常用倒计时代码实例总结
2017/02/07 Javascript
详解webpack 最简打包结果分析
2019/02/20 Javascript
[05:42]DOTA2英雄梦之声_第10期_蝙蝠骑士
2014/06/21 DOTA
Python模拟浏览器上传文件脚本的方法(Multipart/form-data格式)
2018/10/22 Python
Django自定义模板过滤器和标签的实现方法
2019/08/21 Python
python协程gevent案例 爬取斗鱼图片过程解析
2019/08/27 Python
Python面向对象之Web静态服务器
2019/09/03 Python
python 哈希表实现简单python字典代码实例
2019/09/27 Python
Python如何获取Win7,Win10系统缩放大小
2020/01/10 Python
python 安装库几种方法之cmd,anaconda,pycharm详解
2020/04/08 Python
css3 transform属性详解
2014/09/30 HTML / CSS
CSS Grid布局教程之什么是网格布局
2014/12/30 HTML / CSS
日本非常有名的内衣丝袜品牌:GUNZE
2017/01/06 全球购物
泰坦健身器材:Titan Fitness
2018/02/13 全球购物
美国领先的家庭健康检测试剂盒提供商:LetsGetChecked
2019/03/18 全球购物
Linux如何为某个操作添加别名
2013/03/01 面试题
企业法人代表任命书
2014/06/06 职场文书
小学校本培训方案
2014/06/06 职场文书
2015年六一儿童节演讲稿
2015/03/19 职场文书
党小组鉴定意见
2015/06/02 职场文书
2015年支教教师工作总结
2015/07/22 职场文书
宿舍管理制度范本
2015/08/07 职场文书
Go Gin实现文件上传下载的示例代码
2021/04/02 Golang
详解flex:1什么意思
2022/07/23 HTML / CSS