python之路——迭代器、生成器

一、迭代器

什么是迭代?

迭代就是可以将某个数据集内的数据‘一个挨着一个的取出来’

 

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

posted @ 2017-09-04 16:32  陌文欲  阅读(137)  评论(0编辑  收藏  举报