9月4日学习内容整理:迭代器,生成器

一、可迭代对象

1、可迭代协议:只要包含了_ _iter_ _方法的数据类型就是可迭代的

2、判断方法:

(1)是否有_ _iter_ _

(2)from collections import Iterable

    isinstance(变量名,iterable)      可迭代就会输出True

二、迭代器

1、迭代器协议:只要包含_ _iter_ _和_ _next_ _的方法就是迭代器

2、判断方法;

(1)是否有_ _iter_ _和_ _next_ _

(2)from collections import Iterator

    isinstance(变量名,iterator)      是迭代器就会输出True

3、特点:不关心值的索引状态

4、存在意义:

(1)能对基本数据类型进行统一的遍历,不关心每个值是什么

(2)节省内存,不会一次都读出来,而是需要的时候再读,每次只读一个,这种也叫惰性运算

5、分类

(1)本身就是,例如文件句柄,文件操作符obj

(2)可迭代对象._ _iter_ _

6、异常处理机制:

在死循环中,当迭代器取值完毕后会报错,为避免这一现象,引入异常处理机制

lst_iterator = [1,2,3].__iter__()
while True:
    try:
        print(lst_iterator.__next__())
    except StopIteration:
        break

 

三、可迭代和迭代器

1、关系:

(1)可迭代对象包含迭代器,所以迭代器都是可迭代的

(2)可迭代对象._ _iter_ _这样就会变成迭代器

2、可迭代对象不能直接用,要换成迭代器

3、所有能被for循环的数据类型都是可迭代的,但不是迭代器

4、range是可迭代对象,不会直接就写在内存中

四、生成器

1、概念:生成器就是迭代器,迭代器是python给我们提供的,生成器是我们可以自己写出来的迭代器

2、生成器函数

(1)结构:只要遇到yield,程序就会认为这个函数就是生成器函数

(2)执行过程:

a) 生成器函数被调用时,只会先返回一个生成器,函数内的代码不会被执行

b) 接受生成器函数返回的生成器,可以赋值给变量

c) 接受值._ _next_ _()这样写生成器函数内部的代码就会被执行

d) 第一次执行到yield时停止,返回yield后的第一个值

e) 要想再执行必须再输入接受值._ _next_ _(),这样就会返回yield后的第二个值。以此类推直至yield后的内容已经全部取完

注意:1)若生成器函数内有多个yield,则先把第一个yield循环完后才会再执行第二个yield

      2)d和e两步骤中yield可以当作return理解,每次只返回一个值,不会一次返回所有值,这就是return和yield最大的区别,本质上还是                    惰性运算

      3)不能每次执行yield时写成生成器函数名()._ _next_ _,因为这样每次都会返回一个生成器输出的还是第一次取出的值,所以只能是

      接受值._ _next_ _

(3)从生成器中取值的方法:

a) _ _next_ _,按yield取值,有几个值取几次

b) 利用for循环:for i in 生成器

c) 强转为其它数据类型,元素是生成器里的所有值

d) 生成器的内容只能取一次,按顺序取不能走回头路,取完为止

 

补充:

1、yield后没有值返回的就是None,但是必须要有yield

2、yield简化写法:yield  from  [1,2,3]

3、查看数据类型的所有方法(功能):dir()

 

posted @ 2017-09-04 15:46  九二零  阅读(102)  评论(0)    收藏  举报