您的位置:首页 > 编程语言 > Python开发

15. Python开发--协程函数(yield表达式形式,装饰器)

2017-06-05 21:06 344 查看
#yield的语句形式: yield 1
#yield的表达式形式: x=yield

#协程函数

def deco(func):
    def wrapper(*args,**kwargs):
        res=func(*args,**kwargs)
        next(res)     #此处可以是res.send(None)
        return res
    return wrapper

@deco
def eater(name):
    print('%s ready to eat' %name)
    food_list=[]
    while True:
        food=yield food_list
        food_list.append(food)
        print('%s start to eat %s' %(name,food))

g=eater('alex')
# print(g)
# next(g) #等同于 g.send(None)

#

# g.send('手指头')
# g.send('脚指头')
# g.send('别人的手指头')
# g.send('别人的脚指头')

# print(g)
print(g.send('脚趾头1'))
print(g.send('脚趾头2'))
print(g.send('脚趾头3'))

#x=yield
#g.send('1111'),先把1111传给yield,由yield赋值给x
# 然后再往下执行,直到再次碰到yield,然后把yield后的返回值返回

表达式形式的yield应用实例,实现linux的命令
#grep -rl 'python' /root

import os

def init(func):
    def wrapper(*args,**kwargs):
        res=func(*args,**kwargs)
        next(res)
        return res
    return wrapper

@init
def search(target):
    while True:
        search_path=yield
        g=os.walk(search_path)
        for par_dir,_,files in g:
            for file in files:
                file_abs_path=r'%s\%s' %(par_dir,file)
                # print(file_abs_path)
                target.send(file_abs_path)

@init
def opener(target):
    while True:
        file_abs_path=yield
        # print('opener func==>',file_abs_path)
        with open(file_abs_path,encoding='utf-8') as f:
            target.send((file_abs_path,f))

@init
def cat(target):
    while True:
        file_abs_path,f=yield  #(file_abs_path,f)
        for line in f:
            tag=target.send((file_abs_path,line))
            if tag:
                break
@init
def grep(target,pattern):
    tag=False
    while True:
        file_abs_path,line=yield tag
        tag=False
        if pattern in line:
            tag=True
            target.send(file_abs_path)

@init
def printer():
    while True:
        file_abs_path=yield
        print(file_abs_path)

x=r'C:\Users\Administrator\PycharmProjects\python17期\day5\a'

g=search(opener(cat(grep(printer(),'python'))))
print(g)

g.send(x)

'''
面向过程的程序设计:是一种流水线式的编程思路,是机械式
优点:
    程序的结构清晰,可以把复杂的问题简单

缺点:
    1 扩展性差

应用场景:
    1 linux内核,git,httpd

'''
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: