一 迭代器
迭代器的由来pythone2.2引进的,是一种序列(也是一种数据类型),也是为类对象提供一个序列的入口。
for 循环
str list tuple dict set 文件句柄
可迭代:
s = ‘abc‘ for i in s: print(i)
不可迭代
iterable for i in 55: print(i)
什么是可迭代对象?
方法一: dir(被测对象) 如果 他含有__iter__ ,那这个对象就叫做可迭代对象.
遵循可迭代协议
s = ‘abc‘ print(‘__iter__‘ in dir(s)) print(‘__iter__‘ in dir(333))
可迭代对象,iterable 与迭代器有什么关系
可迭代对象 ---> 转化成迭代器
可迭代对象.__iter__() ---> 迭代器
s = ‘abc‘ s1 = s.__iter__() print(s1) #iterator 遵循迭代器协议
迭代器取值:
s2 = ‘abcd‘ s3 = s2.__iter__() print(s3.__next__()) print(s3.__next__()) print(s3.__next__()) print(s3.__next__()) print(‘__iter__‘ in dir(s2)) print(‘__iter__‘ in dir(s3)) print(‘__next__‘ in dir(s2)) print(‘__next__‘ in dir(s3))
只含有__iter__方法的数据是可迭代对象
含有__iter__方法,并且含有__next__方法的数据是迭代器
l = [1,2,3,4] #print(dir(l)) print(‘__iter__‘ in dir(l))#判断l是不是可迭代对象 print(‘__next__‘ in dir(l))#判断l是不是迭代器 liter = l.__iter__()#l转换成迭代器 print(liter.__next__())#输出值 print(liter.__next__()) print(liter.__next__()) print(liter.__next__()) print(liter.__next__())#没有第五项所以报错
方法一: dir(被测对象) 如果 他含有__iter__ ,那这个对象就叫做可迭代对象.
遵循可迭代协议
s = ‘abc‘ print(‘__iter__‘ in dir(s)) print(‘__iter__‘ in dir(333))
方法二 测试他是迭代器还是可迭代对象
l = [1,2,3] l_iter = l.__iter__() from collections import Iterable from collections import Iterator print(isinstance(l,Iterable)) print(isinstance(l,Iterator)) print(isinstance(l_iter,Iterator)) print(isinstance(l,list))
迭代器的意义?
1,迭代器节省内存.
2,迭代器惰性机制.
3,迭代器不能反复,一直向下执行.
for循环的机制.
内部含有__iter__方法,他会将可迭代对象先转化成迭代器.
,然后在调用__next__方法.
他有异常处理的方法.
for i in [1,2,3]: print(i)
l = [1,2,3] l_iter = l.__iter__() while True: try: print(l_iter.__next__()) except StopIteration: break 可迭代对象:str list tuple dict set range 迭代器: 文件句柄 print(‘__iter__‘ in dir(range(10))) print(‘__next__‘ in dir(range(10)))
l=[1,2,3,4,5] s=l.__iter__() print(s.__next__()) print(s.__next__()) print(s.__next__()) print(s.__next__()) print(s.__next__()) # print(s.__next__()) while True: try: print(s.__next__()) except:StopIteration break
迭代器:文件句柄是一个迭代器
二 生成器
什么是生成器?
生成器的本质就是迭代器,生成器是自己用python代码写的迭代器.\
1,可以用生成器函数
2,可以用各种推导式构建迭代器.
3,可以通过数据转化.
def func(): print(111) return 222 ret = func() print(ret)
生成器函数 生成器
def gener(): print(‘aaa‘) yield 222 print(‘bbb‘) yield 333 print(‘ccc‘) g = gener() print(g) print(g.__next__()) print(g.__next__()) return yield 区别
return 返回给调用者值,并结束此函数.
yiled 返回给调用者值,并将指针停留着当前位置.
def cloth(): for i in range(10000): print(‘衣服%s‘%i) cloth()
def cloth(): for i in range(8): yield ‘衣服%s‘%i g_cloth = cloth() print(g_cloth.__next__()) print(g_cloth.__next__()) for i in range(2): print(g_cloth.__next__()) for i in range(2): print(g_cloth.__next__())
send
1,send 和next功能一样
2, 给上一个yiled 整体发送一个值
send不能给最后一个yield发送值
获取第一个值的时候,不能用send 只能用next
def gener(): yield 222 count = yield 333 print(‘-------->‘,count) yield ‘aaa‘ yield ‘bbb‘ g = gener() print(g.send(‘AAA‘)) print(g.send(None)) print(g.send(‘AAAA‘)) print(g.send(‘wwwwww‘))
def gener(): yield 222 count = yield 333 print(‘-------->‘,count) coubt1=yield 444 print(coubt1) yield ‘bbb‘ g = gener() print(g.__next__()) print(g.send(‘None‘)) print(g.send(‘AAAA‘)) print(g.send(‘ccc‘))