python生成器
什么是生成器(就是自定义的迭代器)
只要在函数体代码出现yield关键字,那么再执行函数就不会执行函数体代码,会得到一个结果,该结果就是生成器。
def func(): print("====>1") yield 1 print("====>2") yield 2 print("====>3") yield 3 #生成器就是迭代器 g=func() # g.__iter__() # g.__next__() res=next(g) #会触发函数体代码的运行,然后遇到yield停下来,将yield后的值当做本次调用的结果返回 print(res) #执行结果 ====>1 1
yield功能:
#1、yield为我们提供了一种自定义迭代器的方法 #2、yield与return的区别: #1、yield可以返回多次值 #2、函数暂停与再继续的状态是由yield帮我们保存的
示例:自定义range功能
#代码 def my_range(start,end,step=1): while start < end:
yield start start+=step res=my_range(1,10) for i in res: print(i)
示例:tail -f access.log |grep "404"
import time def tail(file_path): with open(file_path,"rb") as f: f.seek(0,2) while True: line=f.readline() if line: # print(line.decode("utf-8"),end="") yield line else: time.sleep(0.05) def grep(lines,pattern): for line in lines: line=line.decode("utf-8") if pattern in line: print(line,end="") lines=tail("file.txt") grep(lines,"404")
了解:yield表达式形式的用法:
示例一:表达式形式
def eater(name): print("{} ready eat".format(name)) while True: food=yield print("{} start eat {}".format(name,food)) e=eater("alex") #首先要初始化一下 next(e) #第一次到yield暂停,等同于e.send(None) #然后e.send()传值:1、从暂停的位置将值传给yiled,2、与next一样 e.send("apple") e.send("鱼香肉丝")
e.close() #关闭
#e.send("米饭") #关闭后再send传值就报错了StopIteration //执行结果 alex ready eat alex start eat apple alex start eat 鱼香肉丝
示例二:表达式形式+返回值形式(yield返回多个值可以用逗号隔开,返回的是元组)
def eater(name): print("{} ready eat".format(name)) eat_list=[] while True: food=yield eat_list #先将send传的值给yield,再由yield传给food,当暂停的时候将eat_list返回 eat_list.append(food) print("{} start eat {}".format(name,food)) e=eater("alex") #首先要初始化一下 next(e) #第一次到yield暂停,等同于e.send(None) #然后e.send()传值:1、从暂停的位置将值传给yiled,2、与next一样 print(e.send("apple")) print(e.send("鱼香肉丝")) //执行结果 alex ready eat alex start eat apple ['apple'] alex start eat 鱼香肉丝 ['apple', '鱼香肉丝']