课前知识点:
1、dir([]) 告诉我列表(或者其他)的所拥有的方法
2、__iter__:只要是能被for循环的数据类型,就一定拥有__iter__方法
3、迭代器:一个列表执行了__iter__()之后的返回值就是一个迭代器
4、iterable:可迭代的,只要含有__iter__方法就是可迭代的
迭代器
迭代器的概念:
1、内部含有__next__和__iter__的就是迭代器------------迭代器协议
2、可迭代协议:
可以用for循环的都是可迭代的
可迭代的内部都有__iter__方法
只要是迭代器,就一定可迭代
3、【可迭代的】.__iter__方法就可以得到一个迭代器
迭代器中的__next__方法可以一个一个的获取值
4、for 循环其实就是在使用迭代器
iterator :迭代器
5、关于for:只有是可迭代对象的时候,才能用for
当我们遇到一个新的变量,不确定能不能用for循环的时候,就判断它是否可以迭代
l=[1,2,3,4,5,6]
for i in l:
pass
iterator=l.__iter__() #iterator是l用__iterator
while True:
print(iterator.__next__())
6、迭代器的好处:
从容器类型中一个一个的取值,会把所有的值都取到。
节省内存空间:迭代器并不会在内存中再占用一大块
内存,而是随着循环,每次生成一个,每次next循环每次给一个值。
生成器函数
1、只要是含有yield关键字的函数都是生成器函数
yield不能和return 公用且需要写在函数内
def aaa(): print(222) yield 111 ret=aaa() #ret 是执行之后返回得到的生成器 print(ret) print(ret.__next__())
2、含有yield ,在执行之后会得到一个生成器作为返回值
3、
#娃哈哈%i def wahaha(): for i in range(2000000): yield '娃哈哈%s'%i #使用yield,执行之后返回值是一个生成器函数 g = wahaha() count = 0 #计数功能:在执行50次之后停止 for i in g: #对 g 生成器进行循环 count +=1 print(i) if count > 50: break #50次之后停止 # print('*******',g.__next__()) #停止之后执行__next__:继续执行上一次50次停止的函数
#说明生成器是一次一次执行的 for i in g: #继续循环执行生成器,还是接着上次执行:还是说明 count +=1 #生成器是一次一次执行的 print(i) if count > 100: break