迭代器和生成器
凡是可以使用for循环取值的都是可迭代的
可迭代协议:
内部含有__iter__方法的都是可迭代的
迭代器协议
内部含有__iter方法和__next__方法的都是迭代器
什么是迭代器
迭代器=iter(可迭代的).自带一个__next__方法
优势:节省内存快
特性:惰性运算
常用的:列表字典元素字符串集合 ange文件句柄enumerate
python 2和python3中的range区别
python2x种range不管range多少,会生成一个列表,这个列表将用来存贮所有的值
python3中,不管range多少,都不会实际的生成热呢一个值
python3种,有yield from
生成器函数:
凡是带有yield的函数,就是一个生成器函数;
生成器函数的调用不会触发代码的执行,而是会返回一个生成器;想要生成器函数执行,用next()
记录当前所在的位置,等待
如何从生成器中取值?
1)next 随时都可以停止,最后一次会报错
2)for循环,从头到尾遍历一次,不遇到break eturn不会停止
3)list uple 数据类型的强制转换
yield返回值的简便方法,如果本身就是循环一个可迭代的,且要把可迭代数据中的没一个元素都返回,可以用yield from
使用send的时候,在生成器创造出来之后需要进行预激活,可以用装饰器实现.
生成器用来解决内存问题和程序功能之间的解耦
列表推导式:
[i for i in rang(30) if i%3==0]
生成器表达式
(i for i in rang(30) if i%3==0)
一个生成器只能取一次
生成器在不找他要值得时候,不取值.