迭代:
# 1 重复
# 2 下一次重复是基于上一次的结果
python为了提供一种不依赖于索引的迭代方式,
python会为一些对象内置__iter__方法
obj.__iter__称为可迭代的对象
obj.__iter__() 或者iter(obj)得到的结果就是迭代器
#得到的迭代器:既有__iter__又有一个__next__方法
next(obj)或者obj.__iter__()调用
#迭代器的优点
#1:提供了一种不依赖于索引的取值方式
#2:惰性计算。节省内存
#迭代器的缺点:
#1:取值不如按照索引取值方便
#2:一次性的。只能往后走不能往前退
#3:无法获取长度
迭代器的应用:
1。提供了一种不依赖索引的统一的迭代方法
2. 惰性计算,比如取文件的每一行
生成器函数:函数体内包含有yield关键字,该函数执行的结果是生成器
生成器本质是将函数变为可迭代的迭代器
yield的功能:
1.与return类似,都可以返回值,但不一样的地方在于yield返回多次值,而return只能返回一次值
2.为函数封装好了__iter__和__next__方法,把函数的执行结果做成了迭代器
3.遵循迭代器的取值方式obj.__next__(),触发的函数的执行,函数暂停与再继续的状态都是由yield保存的
求平均数的生成器
def aveage(): total = 0 day = 0 ave = 0 while 1: ave_num = yield ave total+=ave_num day+=1 ave = total/day g = aveage() next(g) print(g.send(30)) print(g.send(40)) print(g.send(20)) print(g.send(30))
导入模块测试迭代器
from collections import Iterable from collections import Iterator
l = [1,2,5,5,4,513,435,4] print(isinstance(l,Iterator)) print(isinstance(l,Iterable))