day 13 迭代器,生成器
1、迭代器
for 循环可以循环的就是可迭代对象
可迭代对象:str,list,tuple,dict,set,range
迭代器:f1文件句柄
什么事可迭代对象:内部含有__iter__方法的对象就叫做可迭代对象
可迭代对象就遵循可迭代协议。
如何判断 两种方式
1 print('__iter__' in dir(s)) 2 from collections import Iterable 3 l = [1, 2, 3, 4] 4 print(isinstance(l,Iterable)) 5 print(type(l)) 6 print(isinstance(l,list))
迭代器
l1 = [1, 2, 3]
可迭代对象转化成迭代器:可迭代对象.__iter__() --->迭代器
迭代器不仅含有__iter__,还含有__next__。遵循迭代器协议。
迭代器,
1 l1_obj = l1.__iter__() #迭代器 2 print('__iter__ in dir(li_obj)) 3 print('__next__' in dir(l1)) 4 print('__next__' in dir(l1_obj)) 5 print(l1_obj.__next__()) 6 print(l1_obj.__next__()) 7 print(l1_obj.__next__()) 8 print(l1_obj.__next__()) 9 for i in l1_obj: 10 print(i) 11 #判断迭代器: 12 print('__iter__' in dir(l1_obj)) 13 print('__next__' in dir(l1_obj)) 14 from collections import Itrrator 15 print(isinstance(l1_obj,Iterator))
迭代器的好处:
1、节省内存空间。
2、满足惰性机制。
3、不能反复取值,不可逆。
for循环实质
1、将可迭代对象转化成迭代器
2、内部使用__next__方法取值
3、运用了异常处理去处理报错
1 l2 = [1, 2, 3, 4, 5, 6, 7, 8] 2 l2_obj = l2.__iter__() 3 while True: 4 try: 5 i = l2_obj.__next__() 6 print(i) 7 except Exception: 8 break
生成器
生成器本质上市迭代器。
生成器的产生方式:
1、生成器函数构造
2、生成器推导式构造
3、数据类型的转化
def func():
print(111)
print(222)
print(333)
yield 666
yield 555
yield 444
g = func()
print(g) # <generator object func1 at 0x0000000001197888>
1、函数中只要有yield 那他就不是一个函数,而是一个生成器
2、g称作为生成器对象
print(g.__next__())
print(g.__next__())
print(g.__next__())
next 和send 功能一样,都是执行一次
send可以给上一个yield赋值。
1 # def func1(): 2 # for i in range(1,10001): 3 # print('老男孩校服%d号' % i) 4 # func1() 5 6 # def func1(): 7 # for i in range(1,10001): 8 # yield '老男孩校服%d号' % i 9 # g = func1() 10 # 11 # for i in range(50): 12 # g.__next__() 13 # 14 # for j in range(150): 15 # print(g.__next__()) 16 17 # l1 = [i for i in range(1000)] 18 19 #send 20 def generator(): 21 print(123) 22 content = yield 1 23 print(content) 24 print(456) 25 yield 2 26 g = generator() 27 g.__next__() 28 g.send('hello') 29 30 ''' 31 next 和send 功能一样,都是执行一次 32 send可以给上一个yield赋值。

浙公网安备 33010602011771号