迭代器和生成器
迭代器协议和可迭代协议
可迭代协议:只要含有__iter__方法的都是可迭代的。
可以被迭代要满足的要求就叫做可迭代协议。可迭代协议的定义非常简单,就是内部实现了__iter__方法。
from collections import Iterable #Iterable 可迭代的 print(isinstance[],Iterator) # isintance 判读是什么类型
可以被迭代要满足的要求就叫做可迭代协议。可迭代协议的定义非常简单,就是内部实现了__iter__方法。
print(dir([1,2]))
print(dir((2,3)))
print(dir({1:2}))
print(dir({1,2}))
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__',
'__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__',
'__gt__', '__hash__','__iadd__', '__imul__', '__init__', '__iter__', '__le__',
'__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__',
'__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index',
'insert', 'pop', 'remove', 'reverse', 'sort']
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__',
'__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__',
'__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__',
'__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__',
'__str__', '__subclasshook__', 'count', 'index']
['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__',
'__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__',
'__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear',
'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
['__and__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__',
'__ge__', '__getattribute__', '__gt__', '__hash__', '__iand__', '__init__', '__ior__', '__isub__',
'__iter__', '__ixor__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__',
'__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__',
'__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'add', 'clear', 'copy',
'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint',
'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference',
'symmetric_difference_update', 'union', 'update']
可迭代的概念:
1.可以被for循环的都是可迭代的
2.只要是迭代器一定 可迭代
3.可迭代的.__iter__()方法就可以得到一个迭代器
迭代器协议:内部含有__next__和__iter__方法的就是迭代器。
判断是否是迭代器
1.iterator
2.可迭代对象
3.直接给你内存地址
4.for
只有是可迭代对象的时候,才能用for
当我们遇到一个新的变量,不确定能不能for循环的时候,就判断它是否可迭代。
迭代器的好处:
1.从容器类型中一个一个的取值,会把所有的值都取到。
2.可以节省内存空间。
3.迭代器并不会在内存中再占用一大块内存,而是随着循环每次生成,每次next每次给我一个。
from collections import Iterator #iterator 迭代器。 print(isinstance[],Iterator) #isinstance 判断是什么类型
for循环内置了一个迭代器。
生成器
生成器函数:执行之后会得到一个生成器作为返回值
生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表。
生成器Generator:
本质:迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现)。
特点:惰性运算,开发者自定义。
def generator print(1) yield 'a' ret = generator() print(ret) print(ret.__next__()) def generator(): print(1) yield 'a' print(2) yield'b' g = generator() ret = g.__next__() # 这个是读取文件1,'a' print(ret) ret = g.__next__() #在写一个就是读取文件2,'a' print(ret) for i in g: #这个是直接打印出两个结果 print(i)
生成器的优点:
1.不会一下子在内存中生成太多数据。
2.延迟计算,一次返回一个结果。也就是说,它不会一次生成所有的结果,这对于大数据量处理,将会非常有用。
3.提高代码可读性
def wahaha(): for i in range(2000000): #不会在内存中生成太多数据 yield 'wahaha%s' % i g = wahaha() count = 0 for i in g: count += 1 print(i) if count > 50: # 提取到50 break for i in g: count += 1 print(i) if count > 100: # 提取到100 break print(g.__next__()) # 这个就是从101提取
生成器例子(监听文件例子)
def tail(filename): f = open(filename,encoding='utf-8') while True: line = f.readline() if line.strip(): yield line.strip() g = tail('file') for i in g: #输入文件会跟着一起读取 print(i) for i in g: if 'python' in i: #规定只读取带'python'的文件 print(i)