1.什么是迭代器
迭代器是用来迭代取值的工具,而迭代的意思是一个重复的过程,每一次的重复都是基于上一次的结果继续的,单纯的重复并不是迭代
回到顶部
2.为何要有迭代器
在python中涉及到需要把多个值循环取出来的类型有:字符串、列表、元组、字典、集合、打开文件等,我们可以考虑使用while循环的方式来循环取出多个值,例如:
list=['egon','lin',11]
i=0
while i<len(list):
print(l[i])
i+=1
但是使用while方式迭代取值的方式只适合于有索引的数据类型,比如字符串、元组、列表。
因此python必须提供一种不依赖索引的取值方式!这就是迭代器!
可迭代对象:但凡内置有__iter__方法的都称之为可迭代对象,字符串、字典、列表、元组、集合、文件都是可迭代对象,内部都封装了__iner__方法!
迭代器对象:内置有__next__()和__iter__()方法的对象
可迭代对象调用__iter__方法返回的是一个迭代器对象,迭代器对象下有一个__next__()方法就可以取到可迭代对象的值,没有值可取就会报stopiteration错。
d={'a':1,'b':2,'c':3}
d_iterator=d.__iter__() #调用__iter__()把字典转换为迭代器对象
d_iterator.__next__() #依次取出字典d中的key,每次取一个,取完继续取则报错
回到顶部
3.如何用迭代器
for循环的工作原理:
for k in d:
print(k)
1.调用对象的__iter__()方法得到一个迭代器对象
2.调用迭代器对象的__next__()方法拿到一个返回值,然后将返回值赋值给k
3.循环第二步,直到抛出stopiteration异常,for循环补捉到异常break结束循环
回到顶部
4.迭代器的优缺点
优点:
1)可以迭代没有索引的可迭代对象
2)迭代的时候是每迭代一次,读取一次,不会把内容全部一次读取出来,这样会损耗内存
缺点:
1)不可以像索引那样针对性的取值,总是一次性的迭代完!
回到顶部
5,自定义迭代器(生成器)
5.1 如何得到自定义迭代器
在函数体内存在yield,在调用函数时并不会执行函数体代码,而是会返回一个生成器,即自定义的迭代器!
def func():
print('第一次')
yield 1
print('第二次')
yield 2
print('第三次')
d = func()
res1=next(d)
print(res1)
res2=d.__next__()
print(res2)
# __next__()就等于next(),调用了next方法会触发函数体代码运行,然后遇见yield停下来,将yield后面的值返回,如果在调用了next方法之后没有返回值了就会报错!
5.2 yield的表达式
def dog(name):
print('%s正在吃东西'%name)
while True:
x = yield 1111
print('%s正在吃%s'%(name,x))
g=dog() # 函数里遇见yield说明不在是一个函数,而是返回了一个生成器
# 需要用send方法需要先初始化一下,即:seng里面传一个none等同于调用了next(g)方法
g.send(None) # 此时函数停在了yield的地方
res=g.send('一根骨头') # 把send里面的值传给yield(只能传一个值,可以是列表等),yield在传给x
# 如果yield后面有值,则g.send()有返回值,没有则返回none
print(res)
## 扩展:其实返回值可以后面放个列表,字典等,每次操作就往列表里加一个值