迭代器、可迭代对象与生成器

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
 

猜你喜欢

转载自www.cnblogs.com/louhui/p/9381668.html