迭代器:
for 循环可以循环的就是可迭代对象。
可迭代对象:str, list, tuple, dict, set, range。
迭代器:f1文件句柄。
可迭代协议:
可以被迭代要满足的要求就叫做可迭代协议。可迭代协议的定义非常简单,就是内部实现了__iter__方法。
可迭代对象:
内部含有__iter__方法的对象就叫做可迭代对象。
如何判断:两种方式:
s = 'guqingqiu' # print(dir(s)) print('__iter__' in dir(s)) # True from collections import Iterable print(isinstance(s,Iterable)) # True
将可迭代对象转化成迭代器: 可迭代对象.__iter__() ---->迭代器
迭代器不仅含有__iter__,还含有__next__。遵循迭代器协议。
s = 'guqingqiu' l_s = s.__iter__() #将 s 转化成迭代器 print('__iter__' in dir(l_s)) # True print('__next__' in dir(s)) # False print('__next__' in dir(l_s)) # True
迭代器的好处:
1,节省内存空间。
2,满足惰性机制。
3,不能反复取值,不可逆。
l = [1,2,3,4,5] for i in l: print(i) # 1,将可迭代对象转化成迭代器。 # 2,内部使用__next__方法取值。 # 3,运用了异常处理去处理报错。
while 循环 模仿 for 循环内部机制:
l = [1,2,3,4,5] l_obj = l.__iter__() #将列表转化成迭代器 while True: try: i = l_obj.__next__() #__next__用法:惰性打印迭代器里的值 print(i) except StopIteration: # 不写默认是:Exception(可忽略所有报错),忽略StopIteration错误 break # 跳出循环
生成器:
def func(): print(111) print(222) yield 333 print(444) yield 555 g = func() g.__next__() #将生成器内的值第一个 yield 以上的打印 g.__next__() # 将生成器 第一个 yield下 第二个 yield 以上的打印出来。 # 111 # 222 # 444
1,函数中只要有 yield 那她就不是一个函数,而是一个生成器。
2,g 称作生成器对象。
send 用法:
def generator(): print(123) content = yield 1 print('yield 1:',content) # yield 1: hello print(456) yield 2 g = generator() g.__next__() # 123 g.send('hello') # 456 #send 的效果和next一样。 # send 获取下一个值得效果和 __next__基本一致。 # 只是在获取下一个值的时候,给上一个 yield 的位置传递一个数据。 # 使用 send 的注意事项: # 第一次使用生成器的时候 使用 __next__获取下一个值。 # 最后一个 yield 不能接受外部的值。