生成器的本质就是迭代器
生成器函数
只要含有yeild关键字的函数都是生成器函数,且与return不能共用,且需要写在函数内部
每次调用函数之后函数不执行,返回一个生成器
每次调用next方法就会取到一个值
直到取完最后一个,在执行next将会报错
生成器函数的表现形式
生成器---自己写的函数
生成器表达式
从生成器取值的几个方法:
1.next
2.for循环
3.数据类型的强制转换(占用内存)
def fun(): for i in range(20):
yield "娃哈哈%s"%i
g = fun()
print(list(g))
结果:['娃哈哈0', '娃哈哈1', '娃哈哈2', '娃哈哈3', '娃哈哈4', '娃哈哈5', '娃哈哈6']
简单的生成器函数
只要包括__next__()函数和_iter__()的就是生成器
def genetator(): print(1) return 'a' ret = genetator() print(ret) 结果: 1 a
只要含有yeild关键字的函数都是生成器函数,且与return不能共用,且需要写在函数内部
def genetator(): print(1) yield 'a' # 生成器函数:执行之后会得到一个生成作为返回值 ret = genetator() print(ret)#结果:<generator object genetator at 0x0225DCC0> print(ret.__next__()) # 结果: # 1 # a ret.__iter__()
def wahaha(): for i in range(20): yield '娃哈哈%s'%i g=wahaha() #只拿前五个,用count计数 count = 0 for k in g: count += 1 print(k) if count > 5: break #随时可以再拿下一个值 print('ooooo',g.__next__())
每生成一个生成器,都互不相关,各个执行
监听文件输入的例子(生成器)
# 监听文件的输入
def tail(filename): f = open(filename,encoding='utf-8') while True: line = f.readline() if line.strip(): print('***',line.strip()) tail('info')
#监听文件的输入,并对内容进行过滤
def tail(filename): f = open(filename,encoding='utf-8') while True: line = f.readline() if line.strip(): yield line.strip() g = tail('info') for i in g: if 'python' in i: print('******',i,'~~~~') if 'www' in i: print('******',i,'!!!!')