迭代器和可迭代对象

迭代器和可迭代对象:
from colletions import Iterator迭代器
from colletions import Iterable可迭代对象
两个协议:
1,可迭代协议:对象内部实现__iter__方法。
2,迭代器协议:对象内部实现__iter__,__next__方法。
迭代器:
判断:
1,dir(obj)列出所有方法,看是否有__next__方法。(迭代器没有__len__方法,即迭代器没有长度)
2,bool = istance(obj,Iterator)看布尔值。
生成:
1,可以生成迭代器的前提必须是可迭代对象。
2,通过obj1 = iter(obj),obj = obj1__iter__()可获得迭代器。
取值:
1,值的获取是一个一个取值的
2, str = 'admin'
obj = iter(str)=obj1__iter__()获取迭代器
value = next(obj)=obj__next__()
优缺点:
1,惰性计算,延时计算,节省内存,取值不依赖于索引
2,不能返回取值,不能按照索引取值,只能基于上一次取值进行下一次取值
3,没有长度
可迭代对象(不针对函数,只针对容器类数据类型、文件等对象):
特点:重复、下一次重复基于上一次结果
判断:
1,dir(obj)列出所有方法,看是否有__iter__方法,或者是否有__len__方法。
2,bool = istance(obj,Iterator)看布尔值。
异同点:
可迭代对象有长度,迭代器无长度
都可以使用for遍历
组成迭代器的本质是,先判断是否为迭代器,如果是就无需生成,再判断是否为可迭代对象,如果是则生成迭代器。

生成器函数:
关键字yiled的使用:
1,yiled 参数 用于直接返回一个参数
2,yiled from obj(容器类数据类型) 用于返回一个容器类数据类型,可通过obj.__next__()进行解压取值
3,value = yiled 可用于对生成器内部变量的赋值,通过obj.send(value)进行传值
4,value = yiled 参数 。参照1和3,即可接受传值又可以进行值的返回
注意:3、4必须先激活(唤醒)yiled,才可以obj.__next__()取值
方法:next(obj),obj.__next__(),obj.send(value)
生成器函数的具体结构形式及调用:
def fun():
print('======')
a = 0
应用场景:
1,yiled 1
2,yiled from [1,2,3]
3,a = yiled
4,'''(外部传入的参数)value = yiled value1'''
x = fun()获取生成器
print(x.__next__())
...
print(next(x))
生成器表达式:
y = (x for i in [0,1,2,3])
print(y.__next__())

列表推导式:[x for i in rang(10)]
生成器推导式:(x for i in rang(10))

关键字return和关键字yiled区别:
1,关键字return用来结束函数,而yiled则不同
2,return只能用来返回值,而yiled不但可以用于返回值也可以用于接收值


原文地址:https://www.cnblogs.com/caoxing2017/p/7275703.html