Iterator 与 gerater的作用是优化内存,当处理大文件,大数据的时候可以使用。

  1. 对大列表进行优化

  2. 大文件的优化

一、基本概念

迭代器:  一种数据类型,用来处理大数据

可迭代对象:一个对象,能每次返回数据组中的一个成员,for循环中每次返回一个数据或者用来作为iter内置函数的参数,返回迭代器对象

生成器:  生成器是通过yield 或 生成器表达式,用一种比较方便的方式生成了迭代器。

二、代码视线部分

2.1  yield

yield函数就是一个生成器:

yield的作用:

  1. 相当于return返回一个值

  2. 记住该位置,下次进来从这个位置开始。

两种使用方式:

1. 使用next 和 send 需结合异常处理(当超出最大值的时候,会报错)

2. 使用for循环,for内部自动帮我们处理异常

def ge():yield 8yield 88yield 888g = ge()
print(next(g))
print(next(g))
print(next(g))
print(next(g))  # 报错,超出

使用for处理

def gen_num2():for i in range(8):  # range是一个惰性机制。yield ifor i in gen_num2():print(i)

2.2 迭代器,可迭代对象,生成器的类型判断

from collections import Iterator, Iterable, Generator# 列表的类型判断
li = [1, 2, 3, 4]
print(isinstance(li, Iterable))  # True
print(isinstance(li, Iterator))  # False
print(isinstance(li, Generator)) # False# 字典的类型判读
dic = {'name':'hui', 'age':18}
print(isinstance(dic, Iterable))  # True
print(isinstance(dic, Iterator))  # False
print(isinstance(dic, Generator)) # False# range的类型判断
# range是一个可迭代对象,不是迭代器。但是他跟迭代器有类似的地方,又一个惰性机制,所有也很节约内存
r = range(10)
print(type(r))
print(isinstance(r, Iterable))  # True
print(isinstance(r, Iterator))  # False
print(isinstance(r, Generator))  # False# 文件对象 是一个迭代器
with open('1.txt', 'wb') as f:pass
print(isinstance(f, Iterable))   # True
print(isinstance(f, Iterator))   # True
print(isinstance(f, Generator))  # False# yield对象
def ge():for i in range(9):yield(i)
g = ge()
print(isinstance(g, Iterable))   # True
print(isinstance(g, Iterator))   # True
print(isinstance(g, Generator))  # False

2.3 可迭代对象转换为迭代器,优化内存

  使用iter内置函数

from collections import Generator, Iterable, Iteratorx = [x for x in range(10)]
y = iter(x)     # 列表转换为迭代器
print(next(y))
print(next(y))
print(next(y))
print(next(y))
print(isinstance(y, Iterable))
print(isinstance(y, Iterator))  # 是迭代器对象,
print(isinstance(y, Generator))dic = {'name':'hui', 'age':18}
print(isinstance(dic, Iterable))
print(isinstance(dic, Iterator))
print(isinstance(dic, Generator))d = iter(dic)  # 字典转换为迭代器
print(type(d))
print(isinstance(d, Iterable))
print(isinstance(d, Iterator))
print(isinstance(d, Generator)) 

2.4 生成器表达式

# 列表表达式
y = [x for x in range(10)]# 生成器表达式
z = (x for x in range(10))
print(type(z), z)

2.5 大文件 与 函数优化

1. 函数优化

# 斐波那契
# 0,1,1,2,3
def fb(n):a, b = 0, 1while a < n:print(a)a,b = b, a+bdef fb_list(n):a, b = 0, 1fblist = []while a < n:fblist.append(a)  # 当数据量非常大的时候,就会造成内存爆炸a, b = b, a+breturn fblistprint(fb_list(1000))def fb_ge(n):a, b = 0, 1fblist = []while a < n:yield a         # 使用生成器每次来取,优化内存a, b = b, a+bfor i in fb_ge(1000):print(i, end=' ')

2. 大文件优化

  打开文件的对象,本身就是一个迭代器。

with open('1.txt', 'wb') as f:pass
print(isinstance(f, Iterable))   # True
print(isinstance(f, Iterator))   # True
print(isinstance(f, Generator))  # False

转载于:https://www.cnblogs.com/louhui/p/9381668.html

迭代器、可迭代对象与生成器相关推荐

  1. uniapp对象怎么获取值_第65p,关于:生成器、迭代器与迭代对象(上)

    大家好,我是杨数Tos,这是<从零基础到大神>系列课程的第65篇文章,第三阶段的课程:Python进阶知识:生成器.迭代器与迭代对象. 一.什么是可迭代对象? 迭代是一个重复的过程,迭代每 ...

  2. python手写一个迭代器_搞清楚 Python 的迭代器、可迭代对象、生成器

    很多伙伴对 Python 的迭代器.可迭代对象.生成器这几个概念有点搞不清楚,我来说说我的理解,希望对需要的朋友有所帮助. 1 迭代器协议 迭代器协议是核心,搞懂了这个,上面的几个概念也就很好理解了. ...

  3. python 生成器对象_Python 生成器, 迭代器, 可迭代对象的区别

    1.可迭代对象 在python中, 一切皆对象, 但凡是可以用for循环进行遍历取值的对象都可以称之为可迭代对象, 可迭代对象在程序的一个执行周期中,可以无限轮次的进行循环遍历 2.迭代器 a.一个可 ...

  4. 玩转Python中迭代器与迭代对象的使用与演示

    0.什么是迭代器(iterator)与迭代对象? 比如:python中的集合数据类型,如 list . tuple . dict . set . str 等,我们可以使用for遍历其中的每个元素,此外 ...

  5. python3可迭代对象、迭代器、生成器、协程yield入门

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2019-01-24 16:13:07 # @Author : cdl (1217096 ...

  6. 怎么确定迭代器后面还有至少两个值_如何理解Python中的可迭代对象、迭代器和生成器

    ▍前言 在讨论可迭代对象.迭代器和生成器之前,先说明一下迭代器模式(iterator pattern),维基百科这么解释: 迭代器是一种最简单也最常见的设计模式.它可以让用户透过特定的接口巡访容器中的 ...

  7. 【Python】【容器 | 迭代对象 | 迭代器 | 生成器 | 生成器表达式 | 协程 | 期物 | 任务】...

    Python 的 asyncio 类似于 C++ 的 Boost.Asio. 所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时,你会得到通知. Asyn ...

  8. python 函数可以作为容器对象的元素_11.Python初窥门径(函数名,可迭代对象,迭代器)...

    python(函数名,可迭代对象,迭代器) 一.默认参数的坑 # 比较特殊,正常来说临时空间执行结束后应该删除,但在这里不是. def func(a,l=[]): l.append(a) return ...

  9. Python基础9——可迭代对象

    17可迭代对象 list 是一个迭代对象 可以通过 for - in - 这类语句遍历读取数的对象称之为可迭代对象 li = [1,2,3]for i in li:print(i) 17.1 什么是可 ...

最新文章

  1. 卸载后的mysql和navicat怎么清除干净_小而巧的卸载工具
  2. 【点分治】Tree(luogu 4178/金牌导航 点分治-1)
  3. PyTorch框架学习十九——模型加载与保存
  4. PyQt4(简单界面)
  5. [USACO08OPEN]寻宝之路Clear And Present Danger
  6. python机器学习库sklearn——模型评估
  7. 测试管理中的一个问题—功能点覆盖还是功能测试点覆盖
  8. 区块链 Hyperledger fabric 排序服务Kafka
  9. 拦截器inceptor
  10. bp神经网络数据预测实例,bp神经网络预测数据
  11. 如何使用xshell4连接自己搭建的服务器
  12. 杭州电子科技大学计算机技术考研总结
  13. 使用 yarn 安装 marked
  14. 半导体器件物理【1】量子理论扫盲——从Planck到态叠加原理
  15. 没固定公网 IP 的公司内网实现动态域名解析( 阿里云万网解析 )
  16. python信息检索系统_GitHub - Uyouii/SearchingSystem: python实现的基于倒排索引和向量空间模型实现的信息检索系统...
  17. java 大小写匹配_大写字母的Java正则表达式
  18. node重新加入error execution phase kubelet-start: error uploading crisocket: Unauthorized
  19. 01-学习笔记(webstorm自定义模板代码)【新手上路,多多关照】
  20. 06 CSS-盒子模型【尚硅谷JavaWeb教程】

热门文章

  1. I/O多路转接之 select
  2. (转) Unity3D 使用Texturepacker打包工具制作NGUI(Atlas)图集
  3. django 学习笔记(一)
  4. FlexPaper二次开发问题及搜索高亮显示
  5. TreeMap之floorKey
  6. 名人尿炕被人发现后怎么办?
  7. 使用php连接mysql数据库_PHP使用mysql与mysqli连接Mysql数据库用法示例
  8. Turbo C 3.0安装及使用说明
  9. 【正一专栏】疯狂溢价的转会市场,中国足球最奇葩
  10. 怎么判断有几个滴定突跃点_高中化学怎么学?先看近5年高考化学高频考点知识点分值分析...