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()