迭代器:
什么是可迭代对象?
方法1:dir(被测对象) 如果里面含有 __iter__ 则是可迭代对象
s = 'abc' print(dir(s)) #输出:['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', .......]
# 如果此列表里面有 __iter__,则是可迭代对象
s = 'abc'
print('__iter__' in dir(s))
#输出True 则代表是可迭代对象
方法2: 测试他是迭代器还是可迭代对象
from collections import Iterable from collections import Iterator l = [1,2,3] l_iter = l.__iter__() print(isinstance(l,Iterable)) #True print(isinstance(l,Iterator)) #False print(isinstance(l_iter,Iterator)) #True print(isinstance(l,list)) #True
可迭代对象 转换成 迭代器:
可迭代对象.__iter__() ---> 迭代器
s = 'abc' s = s.__iter__() print(s) #输出:<str_iterator object at 0x000000029B515588>
迭代器取值:
s = 'abcd' s = s.__iter__() print(s.__next__()) #用next,写一个打印一个 print(s.__next__()) #输出: a # b
l = [1,2,3,4] print(dir(l)) #打印:['__add__', '__class__', '__contains__', '__delattr__',....] print('__iter__' in dir(l)) #输出:True 表示__iter__ 在dir(l)里面 print('__next__' in dir(l)) #输出:False 表示__next__ 不在dir(l)里面 liter = l.__iter__() #把列表转换成迭代器 print(liter.__next__()) #输出: 1 print(liter.__next__()) #输出:2 print(liter.__next__()) #输出:3 print(liter.__next__()) #输出:4
可迭代对象和迭代器的区别:
只含有__iter__方法的数据是可迭代对象
含有__iter__方法,并且含有__next__方法的数据是迭代器
迭代器的意义?
1,迭代器节省内存.
2,迭代器惰性机制.
3,迭代器不能反复,一直向下执行.
生成器:
生成器的本质就是迭代器,生成器是自己用python代码写的迭代器.
1,可以用生成器函数
2,可以用各种推导式构建迭代器.
3,可以通过数据转化.
def gener(): print('aaa') yield 222 print('bbb') yield 333 print('ccc') g = gener() print(g.__next__()) #输出:aaa 222 print(g.__next__()) #输出:bbb 333 #yiled 返回给调用者值,并将指针停留着当前位置.
return yield 区别:
return 返回给调用者值,并结束此函数.
yiled 返回给调用者值,并将指针停留着当前位置.
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.__next__()) print(g.__next__()) print(g.send('AAAA')) print(g.__next__()) # 输出: # 222 # 333 # --------> AAAA # aaa # bbb