一、迭代器
什么是可迭代对象:内部含有__iter__方法的对象就叫做可迭代对象
可迭代对象就遵循可迭代协议。
如何判断 两种方式
# print('__iter__' in dir(s)) # from collections import Iterable # l = [1, 2, 3, 4] # print(isinstance(l, Iterable)) # True # print(type(l)) # print(isinstance(l,list))
可迭代对象转化成迭代器:可迭代对象.__iter__() --->迭代器
迭代器不仅含有__iter__,还含有__next__。遵循迭代器协议。
迭代器的好处:
1,节省内存空间。
2,满足惰性机制。
3,不能反复取值,不可逆。
1,将可迭代对象转化成迭代器
2,内部使用__next__方法取值
3,运用了异常处理去处理报错。
l2 = [1, 2, 3, 4, 5, 6, 7, 8] l2_obj = l2.__iter__() while True: try: i = l2_obj.__next__() print(i) except Exception: break
二、生成器
生成器:生成器本质上是迭代器。
生成器的产生方式:
1,生成器函数构造。
2,生成器推导式构造。
3,数据类型的转化。
# def func1(): # print(111) # print(222) # print(333) # return 666 # print(func1()) # def func1(): # print(111) # print(222) # print(333) # yield 666 # yield 555 # yield 777 # g = func1() # print(g) # <generator object func1 at 0x0000000001197888> #第一:函数中只要有yield 那他就不是一个函数,而是一个生成器 #第二:g称作生成器对象。 # print(g.__next__()) # print(g.__next__()) # print(g.__next__()) # def func1(): # for i in range(1,10001): # print('老男孩校服%d号' % i) # func1() # def func1(): # for i in range(1,10001): # yield '老男孩校服%d号' % i # g = func1() # # for i in range(50): # g.__next__() # # for j in range(150): # print(g.__next__()) # l1 = [i for i in range(1000)] #send def generator(): print(123) content = yield 1 print(content) print(456) yield 2 g = generator() g.__next__() g.send('hello') ''' next 和send 功能一样,都是执行一次 send可以给上一个yield赋值。 '''