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')
协程windows 查找文件
 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")
协程Linux查找文件

模拟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:xuyapingxuyaping.txt.txt
F:xuyapingxuyaping1.txt.txt
F:xuyapingaa.txt.txt
F:xuyapingaa1a1.txt.txt
F:xuyapingaa1a2a2.txt.txt
F:xuyaping.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:xuyapingxuyaping.txt.txt
车间grep开始生产产品:包含python这一行内容的文件路径
车间grep开始生产产品:包含python这一行内容的文件路径
车间grep开始生产产品:包含python这一行内容的文件路径
车间opener开始生产产品:文件句柄
车间cat开始生产产品:文件的一行内容
车间grep开始生产产品:包含python这一行内容的文件路径
车间grep开始生产产品:包含python这一行内容的文件路径
车间grep开始生产产品:包含python这一行内容的文件路径
车间grep开始生产产品:包含python这一行内容的文件路径
车间printer开始生产产品:得到最终的产品
F:xuyapingxuyaping1.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:xuyapingaa1a1.txt.txt
车间opener开始生产产品:文件句柄
车间cat开始生产产品:文件的一行内容
车间grep开始生产产品:包含python这一行内容的文件路径
车间grep开始生产产品:包含python这一行内容的文件路径
车间grep开始生产产品:包含python这一行内容的文件路径
车间grep开始生产产品:包含python这一行内容的文件路径
车间grep开始生产产品:包含python这一行内容的文件路径
车间grep开始生产产品:包含python这一行内容的文件路径
车间opener开始生产产品:文件句柄
车间cat开始生产产品:文件的一行内容
车间grep开始生产产品:包含python这一行内容的文件路径
车间printer开始生产产品:得到最终的产品
F:xuyaping.txt.txt
车间grep开始生产产品:包含python这一行内容的文件路径
车间grep开始生产产品:包含python这一行内容的文件路径
车间grep开始生产产品:包含python这一行内容的文件路径
车间grep开始生产产品:包含python这一行内容的文件路径
 
原文地址:https://www.cnblogs.com/xuyaping/p/6701094.html