一、迭代器
什么是迭代?
迭代:更新换代的过程,每次的迭代都必须基于上一次的结果
迭代器:迭代取值的工具
为什么要用?
迭代器给你提供了一种不依赖索引取值的方法
ps:需要迭代取值的数据类型:str、list、tuple、dict、set。
二、什么是可迭代对象
只有内置有__iter__方法的都叫做可迭代对象
可迭代对象有:str、list、tuple、set、dict
文件对象(执行内置__iter__之后还是本身,没有任何变化),因为文件对象本身就是迭代器对象
三、什么是迭代器对象 (迭代器对象:既内置有__iter__也内置有__next__方法)
1、可迭代对象执行内置的__iter__方法后,得到的就是该对象的迭代器对象
内置__next__方法的
内置__iter__方法
ps:迭代器对象一定是可迭代对象,而迭代对象不一定是迭代器对象
2、生成一个迭代器对象用.__iter__()
迭代器取值调用.__next__() # 如果迭代器值取完了,直接报错 StopIteration
防止取值报错的方法:用 trt 和 except StopIteration,当无值可取吗,反馈输出条件
try:
print(iter_d.__next__())
except StopIteration
print('无值可取')
break
3、迭代器对象无论执行多少次__iter__方法,得到的还是迭代器对象本身
4、迭代取值:
__next__
优点:1、不依赖于索引取值
2、内存永远只占了一份空间,不会导致内存溢出
缺点:1、不能获取指定的元素
2、去完之后会报StopIteration错
四、for循环内部原理:
1、将in后面的对象调用__iter__转换成可迭代器对象
2、调用__next__迭代取值
3、内部有异常捕获StopIteration,当__next__报错,自动循环结束
五、生成器及表达式
定义:用户自定义的迭代器,本质是生成器(生成器表达式和列表生成式类似,通常被误认为元组生成式。)
5.1、把函数变迭代器要点:
def func():
yield 123,234
g = func #生成器初始化
1、如果函数内有yild关键字,那么括号加执行函数的时候不会出发函数代码的执行
2、yield后面跟的值就是调用迭代器__next__方法得到的值,可返回多个值,并且是按元组的形式返回
ps:
yield
1.帮你提供了一种自定义生成器方式
2.会帮你将函数的运行状态暂停住
3.可以返回值
# yield支持外界为其传参 def dog(name): print('%s 准备开吃'%name) while True: food = yield print('%s 吃了 %s'%(name,food)) # def index(): # pass # 当函数内有yield关键字的时候,调用该函数不会执行函数体代码 # 而是将函数变成生成器 # g = dog('egon') # g.__next__() # 必须先将代码运行至yield 才能够为其传值 # g.send('狗不理包子') # 给yield左边的变量传参 触发了__next__方法 # g.send('饺子')
5.2、列表生成式特点:
res = ( i for i in range(1,1000) if i !=4) # 生成器表达式
生成器不会主动执行任何一行代码
必须通过__next__出发代码的运行