迭代器与生成器

迭代器部分

一,可迭代对象

对象内部含有__iter__ 方法

可迭代对象满足可迭代协议

print("__iter__" in dir(list))
print("__iter__" in dir(str))
View Code

二,迭代器
内部含有__iter__和__next__方法

from collections import Iterable
from collections import Iterator
print(isinstance(str,Iterable))
print(isinstance(str,Iterator))
View Code

迭代器特点
1,迭代器可以直接取值,可迭代对象不能直接取值

2,节省空间

3,每次只能取一个值

4,单向性,只能从前向后取值,取完值后再取值会报错

while模仿for

1,用__iter__方法将可迭代对象变成迭代器

2,利用__next__取值

3,利用异常处理停止报错

a="hfaoofhajfajajfaj"
b=a.__iter__()
while 1:
    try:
        print(b.__next__())
    except StopIteration:
        pass
View Code

 

生成器部分

生成器:自己通过代码写的迭代器,生成器的本质是迭代器

一,函数生成器    将return换成yield

return  结束函数,给函数执行者返回值

yield   不会结束函数,把值返回给   生成器对象.__next__()

生成器和迭代器的区别

1,生成器可以定制

2,内存的区别    迭代器是由可迭代对象转换成的,可迭代对象本身会占内存,而生成器是直接创建,不需要转化,从本质上节省内存

def func():
    for i in range(1000):
        yield(i)
a = func()    #函数不会执行,生成生成器函数对象
for i in range(50):
    print(next(a))
View Code

send 和 next
1,send跟next的执行一样,给生成器函数对象取值

2,send可以给上一个yield传值,在用send取值的时候,第一次取值,必须用next(没有yield接受值),最后一个yield永远得不到send的传值

def func():
    a=3
    f=yield a
    print(f)
    b=4
    yield b
o=func()
print(next(o))
print(o.send("hello"))
View Code

二,生成器表达式
1,列表推导式

循环模式   [变量(加工后的变量) for 变量 in 可迭代对象] 

筛选模式  [变量(加工后的变量) for 变量 in 可迭代对象  if条件]

生成器表达式,将列表推导式的[ ]换成()就是生成器表达式

对于数据比较小的用列表表达式,数据很大的用生成器表达式

字典推导式

集合推导式

 

posted @ 2018-08-19 19:56  若兮ruoxi  阅读(92)  评论(0编辑  收藏  举报