复习:
迭代器和生成器
迭代器:
魔法方法__iter__()很少直接调用的方法,一般情况下是通过其他方法触发的
可迭代的 -- 可迭代协议 含有__iter__的方法 __iter__ in dir(obj)
迭代器协议: 含有__iter__ __next__方法
迭代器一定可迭代,可迭代的通过调用__iter__方法就能得到一个迭代器
迭代器特点:
很方便使用,一个迭代器只能取所有的数据一次
节省内存空间
生成器(本质是迭代器):
生成器的表现形式:
生成器函数
含有yield关键字的函数就是生成器函数
特点:
调用函数的时候函数不执行,返回一个生成器
调用__next__()方法的时候会取到一个值
知道取到最后一个之后,会抛出错误
def wahaha(): for i in range(20): yield 'wahaha%s' % i g = wahaha()
list(g) # 数据类型的强制转化(占内存) g.__next__() # 每次执行就是从生成器中取值,预示着生成器函数中的代码继续执行 count = 0 for i in g: num += 1 if num > 50: break print(i)
生成器中取值的几个方法:
next
for
数据类型的强制转化
生成器函数进阶
def generator(): print(123) yield 1 print(456) yield 2 print(789) # 没有yield函数会继续执行,最后抛出错误 g = generator() ret = g.__next__() print(ret)
ret = g.send(None) # send的效果和next一样 ret = g.__next__() print(ret) ret = g.__next__() print(ret)
def generator(): print(123) content = yield 1 print('====',content) print(456) yield 2 print(789) # 没有yield函数会继续执行,最后抛出错误 g = generator() ret = g.__next__() print(ret) ret = g.send(‘hello’) # send的效果和next一样 ret = g.__next__() print(ret) ret = g.__next__() print(ret) # send的获取下一个值的效果和next基本一致, # 在获取的下一个值得时候,给上一值的位置传递一个数据
send的注意事项:
第一次使用生成器的时候,是用的next获取第一个yield的值
最后一个yield不能接受外部的值,