python(18)- 协程函数及应用
协程
def init(func): def wrapper(*args,**kwargs): obj = func(*args,**kwargs) next(obj) return obj return wrapper @init def food(name): print("%s start to eat" % name) food_list = [] while True: food = yield food_list food_list.append(food) print("%s eat %s" % (name,food_list)) e = food("xyp") # xyp start to eat e.send("apple") # xyp eat ['apple'] e.send("apple") # xyp eat ['apple', 'apple'] e.send("apple") # xyp eat ['apple', 'apple', 'apple'] ......
1 #grep -rl 'python' C:\egon 2 import os,time 3 def init(func): 4 def wrapper(*args,**kwargs): 5 res=func(*args,**kwargs) 6 next(res) 7 return res 8 return wrapper 9 10 #找到一个绝对路径,往下一个阶段发一个 11 @init 12 def search(target): 13 '找到文件的绝对路径' 14 while True: 15 dir_name=yield #dir_name='C:\\egon' 16 print('车间search开始生产产品:文件的绝对路径') 17 time.sleep(2) 18 g = os.walk(dir_name) 19 for i in g: 20 # print(i) 21 for j in i[-1]: 22 file_path = '%s\\%s' % (i[0], j) 23 target.send(file_path) 24 25 @init 26 def opener(target): 27 '打开文件,获取文件句柄' 28 while True: 29 file_path=yield 30 print('车间opener开始生产产品:文件句柄') 31 time.sleep(2) 32 with open(file_path) as f: 33 target.send((file_path,f)) 34 35 @init 36 def cat(target): 37 '读取文件内容' 38 while True: 39 file_path,f=yield 40 print('车间cat开始生产产品:文件的一行内容') 41 time.sleep(2) 42 for line in f: 43 target.send((file_path,line)) 44 45 @init 46 def grep(pattern,target): 47 '过滤一行内容中有无python' 48 while True: 49 file_path,line=yield 50 print('车间grep开始生产产品:包含python这一行内容的文件路径') 51 time.sleep(0.2) 52 if pattern in line: 53 target.send(file_path) 54 55 @init 56 def printer(): 57 '打印文件路径' 58 while True: 59 file_path=yield 60 print('车间printer开始生产产品:得到最终的产品') 61 time.sleep(2) 62 print(file_path) 63 64 65 66 g=search(opener(cat(grep('python',printer())))) 67 g.send('C:\\egon') 68 g.send('D:\\dir1') 69 g.send('E:\\dir2')
1 import os 2 3 def init(func): 4 def wrapper(*args,**kwargs): 5 obj = func(*args,**kwargs) 6 next(obj) 7 return obj 8 return wrapper 9 10 @init 11 def search(target): 12 while True: 13 dir_name = yield 14 obj = os.walk(dir_name) 15 for file in obj: 16 for path in file[-1]: 17 file_path = "%s/%s" % (file[0],path) 18 target.send(file_path) 19 20 @init 21 def opener(target): 22 while True: 23 file_path = yield 24 with open(file_path) as f: 25 target.send((file_path,f)) 26 @init 27 def cat(target): 28 while True: 29 file_path,file = yield 30 for line in file: 31 target.send((file_path,line)) 32 @init 33 def grep(pattern,target): 34 while True: 35 file_path,line = yield 36 if pattern in line: 37 target.send(file_path) 38 @init 39 def print_file(): 40 while True: 41 file_path = yield 42 print(file_path) 43 44 45 g = search(opener(cat(grep("a",print_file())))) 46 g.send("/Users/centos/Desktop/example")
模拟grep -rl “python” F:\xuyaping这个命令
#查看xuyaping文件夹所有的绝对路径 import os g=os.walk("F:\\xuyaping") #g为迭代器 for i in g: # print(i) #i为文件路径 for j in i[-1]: file_path="%s\\%s" %(i[0],j) print(file_path)
程序输出结果:
F:\xuyaping\xuyaping.txt.txt F:\xuyaping\xuyaping1.txt.txt F:\xuyaping\a\a.txt.txt F:\xuyaping\a\a1\a1.txt.txt F:\xuyaping\a\a1\a2\a2.txt.txt F:\xuyaping\b\b.txt.txt
代码如下:
#模拟grep -rl “python” F:\xuyaping这个命令 import os,time #初始化被装饰的函数,使其运行到yield所在的行 def init(func): def wrapper(*args,**kwargs): res=func(*args,**kwargs) next(res) return res return wrapper #search函数用循环找到一个绝对路径,往下一个阶段opener函数传递一次,直至传递完。 # 所以opener函数循环的收,所以opener函数用while循环。 @init def search(target): #定义生成器target,用于传递路径file_path "找到文件的绝对路径" while True: dir_name=yield print("车间search开始生产产品:文件的绝对路径") time.sleep(1) g = os.walk(dir_name) for i in g: for j in i[-1]: file_path="%s\\%s" %(i[0],j) target.send(file_path) #传递路径file_path,给opener函数 @init def opener(target): "打开文件,获取文件句柄" while True: file_path=yield #opener函数接收search函数传递过来的路径file_path。opener函数将执行结果传递给search函数中的target print("车间opener开始生产产品:文件句柄") time.sleep(1) with open(file_path) as f: target.send((file_path,f)) #同样传递句柄f 和file_path给cat函数,所以此时用生成器target来传递,同上 @init def cat(target): "读取文件内容" while True: file_path,f=yield #cat函数接收opener函数传递过来的句柄f 和file_path。cat函数将执行结果传递给opener函数中的target print("车间cat开始生产产品:文件的一行内容") time.sleep(1) for line in f: target.send((file_path,line)) @init def grep(pattern,target): "过滤一行内容中有无python" while True: file_path,line=yield print("车间grep开始生产产品:包含python这一行内容的文件路径") time.sleep(1) if pattern in line: target.send(file_path) @init def printer(): "打印文件路径" while True: file_path=yield print("车间printer开始生产产品:得到最终的产品") time.sleep(1) print(file_path) #g=search("target")--->g=search(opener(target))--->g=search(opener(cat(target))) # --->g=search(opener(cat(grep(patteren,target))))--->g=search(opener(cat(grep("python",printer())))) g=search(opener(cat(grep("python",printer())))) g.send("F:\\xuyaping")
运行结果:
车间search开始生产产品:文件的绝对路径 车间opener开始生产产品:文件句柄 车间cat开始生产产品:文件的一行内容 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间printer开始生产产品:得到最终的产品 F:\xuyaping\xuyaping.txt.txt 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间opener开始生产产品:文件句柄 车间cat开始生产产品:文件的一行内容 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间printer开始生产产品:得到最终的产品 F:\xuyaping\xuyaping1.txt.txt 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间opener开始生产产品:文件句柄 车间cat开始生产产品:文件的一行内容 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间opener开始生产产品:文件句柄 车间cat开始生产产品:文件的一行内容 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间printer开始生产产品:得到最终的产品 F:\xuyaping\a\a1\a1.txt.txt 车间opener开始生产产品:文件句柄 车间cat开始生产产品:文件的一行内容 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间opener开始生产产品:文件句柄 车间cat开始生产产品:文件的一行内容 车间grep开始生产产品:包含python这一行内容的文件路径 车间printer开始生产产品:得到最终的产品 F:\xuyaping\b\b.txt.txt 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径 车间grep开始生产产品:包含python这一行内容的文件路径