迭代器与生成器
迭代器部分
一,可迭代对象
对象内部含有__iter__ 方法
可迭代对象满足可迭代协议
print("__iter__" in dir(list)) print("__iter__" in dir(str))
二,迭代器
内部含有__iter__和__next__方法
from collections import Iterable from collections import Iterator print(isinstance(str,Iterable)) print(isinstance(str,Iterator))
迭代器特点
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
生成器部分
生成器:自己通过代码写的迭代器,生成器的本质是迭代器
一,函数生成器 将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))
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"))
二,生成器表达式
1,列表推导式
循环模式 [变量(加工后的变量) for 变量 in 可迭代对象]
筛选模式 [变量(加工后的变量) for 变量 in 可迭代对象 if条件]
生成器表达式,将列表推导式的[ ]换成()就是生成器表达式
对于数据比较小的用列表表达式,数据很大的用生成器表达式
字典推导式
集合推导式