python协程函数的应用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python协程函数的应用相关的知识,希望对你有一定的参考价值。

模拟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协程函数的应用的主要内容,如果未能解决你的问题,请参考以下文章

函数5—协程函数的有应用

python 协程

Python函数进阶:闭包装饰器生成器协程

简述python进程,线程和协程的区别及应用场景

Python协程

Python协程 & 异步编程(asyncio) 入门介绍