可迭代协议:只要含有__iter__方法都是可迭代的
迭代器协议:内部含有__next__和__iter__方法的就是迭代器
从生成器中取值的几个方法:
for #如果没有break会一直取完
next
send #不能用在第一个,取下一个的时候给上个位置传一个新的值
数据类型强制转换 #一次性全读到内存,占内存
#优先类型按序
from collections import Iterable
from collections import Iterator
print(isinstance([],Iterator))
print(isinstance([],Iterable))
可迭代的调用.__iter__()方法就可以得到一个迭代器
迭代器的特点:
一个迭代器只能从头到尾取一次
可以依次取,都能取到
节约内存(依次取与一次性取)
#####################################################
生成器函数执行以后会得到一个生成器做返回值
生成器的本质就是迭代器
只要含有yield关键字的函数都是生成器函数
生成器函数特点:
调用之后函数不执行,返回生成器
每从生成器中取一个值就执行一段代码,遇到yield停止
yield不能和return共存,yield不会结束函数
def generator():
print(1)
yield'a'
print(2)
yield'b'
g = generator
ret = g.__netx__()
print(ret)
ret = g.__netx__()
print(ret)
#等于 for i in g
# print(i)
#############################################
def legend():
for i inrange(2000000):
yield '我是渣渣辉%s'%i
g = legend()
############################################
#监听文件输入
def tail(filename):
f = open(filename,encoding = 'utf-8')
if line.strip(): #回车会被当做一行
yield line.strip()
g = tail('file')
for i in g:
if '渣渣辉' in i: #判断关键字
print('***',i)
############################################