一、迭代器
1.可迭代对象
1 #方法一: dir(被测对象) 如果 他含有__iter__ ,那这个对象就叫做可迭代对象 2 s2 = 'abcd' 3 s3 = s2.__iter__() 4 print('__iter__' in dir(s2)) 5 print('__iter__' in dir(s3)) 6 print('__next__' in dir(s2)) 7 print('__next__' in dir(s3)) 8 # 只含有__iter__方法的数据是可迭代对象 9 # 含有__iter__方法,并且含有__next__方法的数据是迭代器
1 # 方法二 测试他是迭代器还是可迭代对象 2 l = [1,2,3] 3 l_iter = l.__iter__() 4 from collections import Iterable 5 from collections import Iterator 6 print(isinstance(l,Iterable)) 7 print(isinstance(l,Iterator)) 8 print(isinstance(l_iter,Iterator)) 9 print(isinstance(l,list))
2.迭代器的意义
- 迭代器节省内存
- 迭代器惰性机制
- 迭代器不能反复,一直执行下去
3.for循环的机制
1 #内部含有__iter__方法,他会将可迭代对象先转化成迭代器. 2 #,然后在调用__next__方法. 3 # 他有异常处理的方法. 4 for i in [1,2,3]: 5 print(i) 6 l = [1,2,3] 7 l_iter = l.__iter__() 8 while True: 9 try: 10 print(l_iter.__next__()) 11 except StopIteration: 12 break
4.可迭代对象: str list tuple dict set range
迭代器: 文件句柄
二、生成器
1.什么是生成器
- 生成器的本质就是迭代器,生成器是自己用python代码写的迭代器
- 可以用生成器函数
- 可以用各种推导式构建迭代器
- 可以通过数据转化
2.生成器函数 生成器
1 def gener(): 2 print('aaa') 3 yield 222 4 print('bbb') 5 yield 333 6 print('ccc') 7 g = gener() 8 print(g) 9 print(g.__next__()) 10 print(g.__next__())
3.return yield 区别
- return 返回给调用者值,并结束此函数
- yield 返回给调用者值,并将指针停留在当前位置
4.send
- send和next功能一样
- 给上一个yield整体发送一个值
- send不能给最后一个yield发送值
- 获取第一个值的时候,不能用send 只能用next
1 def gener(): 2 yield 222 3 count = yield 333 4 print('-------->',count) 5 yield 'aaa' 6 yield 'bbb' 7 g = gener() 8 print(g.__next__()) 9 print(g.send(None)) 10 print(g.send('AAAA'))