python函数五(迭代器,生成器)
一。迭代器
1.可迭代对象(只含有__iter__方法的数据是可迭代对象)
常见的可迭代对象:str list tuple dict set range
1.1什么是可迭代对象?
方法一: dir(被测对象) 如果 他含有'__iter__ ',那这个对象就叫做可迭代对象.
遵循可迭代协议
s = 'alex' l = [1,2,3,4,5] print('__iter__' in dir(s)) print('__iter__' in dir(l)) # 输出结果: # True # True
2.迭代器(含有__iter__方法,并且含有__next__方法的数据是迭代器)
常见的迭代器:文件句柄
2.1迭代器的取值
s = 'alex' l = [1,2,3,4,5] s1 = s.__iter__() print(s1.__next__()) print(s1.__next__()) print(s1.__next__()) # 输出结果: a l e
2.2迭代器的意义:
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
3.可迭代对象与迭代器的关系
1)可迭代对象------>迭代器
可迭代对象.__iter__()------->迭代器
s = 'alex' l = [1,2,3,4,5] l1 = l.__iter__() #迭代器 print(l1) #iterator 遵循迭代器协议 # 输出结果:<list_iterator object at 0x00000156B0EC7630>
判断是可迭代对象还是迭代器
方法二(isinstance与type类似,但是功能比type更强大)
l = [1,2,3,4,5] l_iter = l.__iter__() from collections import Iterable from collections import Iterator print(isinstance(l,Iterable)) #True print(isinstance(l,Iterator)) #True print(isinstance(l_iter,Iterator)) #False print(isinstance(l,list)) #True
二。生成器
生成器的本质就是迭代器,生成器是自己用python代码写的迭代器.
1,可以用生成器函数
2,可以用各种推导式构建迭代器.
3,可以通过数据转化.
def gener(): print(111) yield 222 count = yield 333 print(count) yield 444 yield 555 g = gener() print(g) print(g.__next__()) print(g.__next__()) print(g.send('aaa')) print(g.__next__()) # 输出结果: # <generator object gener at 0x0000014CDE5B1BF8> # 111 # 222 # 333 # aaa # 444 # 555
4.send
1)send 和next功能一样
2)给上一个yiled 整体发送一个值
send不能给最后一个yield发送值
获取第一个值的时候,不能用send 只能用next