一、迭代器
什么是迭代?
迭代就是可以将某个数据集内的数据‘一个挨着一个的取出来’
1.可迭代协议:
__iter__这个方法导致了一个数据类型的可迭代
只要包含了‘双下iter’方法的数据类型就是可迭代的
数据类型和python解释器定下的协议
迭代器中有__next__和__iter__方法——迭代器协议
2.可迭代对象
可迭代协议:含有__iter__的方法。
from coollections import Iterable
print(isinstance(要检测的对象.Iterable))
迭代器:就是实现了能从其中一个一个的取出值来
迭代器协议:含有__iter__和__next__方法的对象
from coollections import Iterable
print(isinstance(要检测的对象.Iterable))
iterator 名词 迭代器
3.迭代器和可迭代对象之间的关系:
迭代器包含可迭代对象
迭代器=可迭代对象.__iter__()
4.(1)迭代器 它不关心值的索引状态
Lst_iterator = [1,2,3].__iter__() print(Lst_iterator.__next__()) print(Lst_iterator.__next__()) print(Lst_iterator.__next__())
print(Lst_iterator.__next__())
print(Lst_iterator.__next__())
这是一段会报错的代码,如果我们一直取next取到迭代器里已经没有元素了,就会抛出一个异常StopIteration,告诉我们,列表中已经没有有效的元素了。
这个时候,我们就要使用异常处理机制来把这个异常处理掉。
Lst_iterator = [1,2,3].__iter__() while True: try: print(Lst_iterator.__next__()) except StopIteration: break print(123)
(2)for 可以是一个可迭代的对象 也可以是一个迭代器
for [1,2,3].__iter__()
__next__()
StopIteration
为什么要有迭代器,迭代器的本质(好处)是什么?
[1,2,3],'123',(1,2,3)
{1,2,3,4,5,6} {'k':'v'}
for key in dect:pass
<1> 能够对Python中的基本数据类型进行的统一的遍历 不需要关心每一个值分别是什么
<2>他可以节省内存——惰性运算
f=open('file','w') 文件句柄就是一个迭代器
range(100).__iter__() range就是一个可迭代对象
5.迭代器:
(1)天生的,比如文件句柄
(2)后天的,可迭代对象.__iter__()
二、生成器
什么是生成器?
生成器就是迭代器, 我们自己写出来能够实现迭代器功能的就是生成器
生成器函数:常规函数定义,但是是使用yield语句不是return语句来返回结果,yield是一个一个返回结果,在每个结果的中间,挂起函数的状态,以便下次重他离开的地方继续执行。
生成器表达式:类似于列表推导式,但是 生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表
带yield关键字的函数,就是生成器函数
生成器函数在执行的时候只返回一个值,不执行生成器函数的内容
从生成器中取值:
1.__next__有几个yield就可以取几次
2.for 循环取值 正常取 for i in g:
3.其他数据类型进行强制转换.list(g) 返回一个列表,里面装着生成器中的所有内容
注意:调用生成器函数的时候,要先获取生成器,再进行next 取值
生成器中的内容只能取一次,且按顺序取值没有回头路,取完为止
总结:
可迭代对象:内部有__iter__
迭代器:内部有__iter__和__next__
生成器:就是迭代器
生成器函数: yield / yield from