迭代器
可迭代的:
- list
- dic
- str
- set
- tuple
- f = open()
- range()
- enumerate
# 显示列表所拥有的所有方法 print(dir([]))
只要是能被for循环的数据类型 就一定拥有__iter__方法
一个可迭代的对象加上__iter__之后就是一个迭代器
- 迭代器的三个方法:
'__setstate__'从某个位置取值
'__next__'一个一个取值
'__length_hint__'元素个数
Iterable 可迭代的 -- > __iter__ 只要含有__iter__方法的都是可迭代的
[].__iter__() 这就是迭代器 -- > __next__ 通过next就可以从迭代器中一个一个的取值
可迭代协议:只要含有__iter__方法的都是可迭代的
迭代器协议:内部含有__next__和__iter__方法的就是迭代器
#定义一个迭代器类型 class A: def __iter__(self):pass def __next__(self):pass a = A() print(isinstance(a,Iterator)) #迭代器 print(isinstance(a,Iterable)) #可迭代
- 迭代器协议和可迭代协议
可以被for循环的都是可迭代的
可迭代的内部都有__iter__方法
只要是迭代器 一定可迭代
可迭代的.__iter__()方法就可以得到一个迭代器
迭代器中的__next__()方法可以一个一个的获取值
- 判断是否是迭代器或可迭代对象:
for循环本质就是在使用迭代器
iterator
可迭代对象
直接给你内存地址
print([].__iter__())
print(range(10)) 也是迭代器
- for
只有 是可迭代对象的时候 才能用for
当我们遇到一个新的变量,不确定能不能for循环的时候,就判断它是否可迭代:# print(dir([]))
- 迭代器的好处:
从容器类型中一个一个的取值,会把所有的值都取到。
节省内存空间 ,迭代器并不会在内存中再占用一大块内存,而是随着循环 每次生成一个每次next每次给我一个
生成器
—— 本质是迭代器
生成器函数 —— 本质上就是我们自己写得函数
def generator(): # print(1) yield 'a'
只要含有yield关键字的函数都是生成器函数
yield不能和return共用 且需要写在函数内
生成器函数定义之后的执行:
ret = generator() # 只是一个生成器 print(ret.__next__()) #一次一次执行生成器
应用:
# 监视文件的输入 当输入的行中含有'python'时,打印出来: def tail(filename): f = open(filename,encoding='utf-8') while True: line = f.readline() if line.strip(): yield line.strip() g = tail('file') for i in g: if 'python' in i: print('***',i)
生成器表达式