码迷,mamicode.com
首页 > 编程语言 > 详细

python协程函数的应用

时间:2017-04-13 00:44:23      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:yield   span   turn   opener   api   app   **kwargs   *args   查看   

模拟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这一行内容的文件路径
 

python协程函数的应用

标签:yield   span   turn   opener   api   app   **kwargs   *args   查看   

原文地址:http://www.cnblogs.com/xuyaping/p/6701094.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!