迭代器可迭代对象与生成器
Posted louhui
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迭代器可迭代对象与生成器相关的知识,希望对你有一定的参考价值。
Iterator 与 gerater的作用是优化内存,当处理大文件,大数据的时候可以使用。
1. 对大列表进行优化
2. 大文件的优化
一、基本概念
迭代器: 一种数据类型,用来处理大数据
可迭代对象:一个对象,能每次返回数据组中的一个成员,for循环中每次返回一个数据或者用来作为iter内置函数的参数,返回迭代器对象
生成器: 生成器是通过yield 或 生成器表达式,用一种比较方便的方式生成了迭代器。
二、代码视线部分
2.1 yield
yield函数就是一个生成器:
yield的作用:
1. 相当于return返回一个值
2. 记住该位置,下次进来从这个位置开始。
两种使用方式:
1. 使用next 和 send 需结合异常处理(当超出最大值的时候,会报错)
2. 使用for循环,for内部自动帮我们处理异常
def ge(): yield 8 yield 88 yield 888 g = ge() print(next(g)) print(next(g)) print(next(g)) print(next(g)) # 报错,超出
使用for处理
def gen_num2(): for i in range(8): # range是一个惰性机制。 yield i for 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, Iterator x = [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, 1 while a < n: print(a) a,b = b, a+b def fb_list(n): a, b = 0, 1 fblist = [] while a < n: fblist.append(a) # 当数据量非常大的时候,就会造成内存爆炸 a, b = b, a+b return fblist print(fb_list(1000)) def fb_ge(n): a, b = 0, 1 fblist = [] while a < n: yield a # 使用生成器每次来取,优化内存 a, b = b, a+b for 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
以上是关于迭代器可迭代对象与生成器的主要内容,如果未能解决你的问题,请参考以下文章