Python之生成器
生成器与return有何区别?
return只能返回一次函数就彻底结束了,而yield能返回多次值
什么是生成器:
生成器就是一个函数,但是,这个函数有个特殊的特性,就是有个yield关键字。
生成器本身就是一个迭代器。
def test(): print("..........") yield 1
g=test()
print(next(g)) #与return很像
生成器执行next,才会执行函数,并在yield时,返回函数运行的一个结果。并返回yield的值。
生成器干啥子用:
生成器是将一个函数变成迭代器。
而迭代器是将一个数据类型,变成迭代。
yield一下,函数就拿一次的值,并将函数的运行停在yield的地方。在下一次yield的时,就接着上一次停的地方继续运行。
yield到底干了什么事情:
#1.yield把函数变成生成器-->迭代器
#用return返回值能返回一次,而yield返回多次
#函数在暂停以及继续下一次运行时的状态是由yield保存
什么情况下用生成器:
#取Linux的日志信息:将新增加的内容进行打印。 import time def tail(file_path): with open(file_path,'r') as f: f.seek(0,2) while True: line=f.readline() if not line: time.sleep(0.3) continue else: # print(line,) yield line
#定义阶段
def grep(pattern,lines):
for line in lines:
if pattern in line:
#print(' 33[45m%s 03[0m' %line)
yield line
#调用阶段,得到两个生成器对象
g1=tail('/tmp/a.txt')
g2=grep("error",g1)
#print(next(g2))
#next触发执行g2生成器函数
for line in g2:
try:
if "error" in line:
print(line)
else:
print("==",line)
except StopIteration:
break
生成器的优缺点:
优点:
1.迭代器提供了一种不依赖于索引的取值方法,这样就可以遍历那些没有索引的可迭代对象了(字典,集合)
2.迭代器与列表比较,迭代器是惰性计算,可以节省内存。
缺点:
1.无法获取迭代器的长度,使用不如列表索引取值灵活。
2.一次性的,只能往后取值,不能倒着取值。
总结:
yield的功能:
1.相当于把__iter__ 和 __next__ 方法封装到函数内部。
2.与return相比,return只能返回一次,而yield能返回多次。
3.函数暂停已经继续运行的状态是通过yield保存的。
可以用生成器做管道,将左边的数据流传给右边。
yield生成器表达式:
food = yield 就是一个生成器表达式。