生成器表达式和面向过程编程

# yield表达式形式的应用
def func():
    while True:
        x=yield 1
        print(x)
g=func()
next(g)#初始化操作,返回值为1
g.send(2)#功能一:将2传值给yield,由yield赋值给x  功能二:与next的功能一样

yield的表达式形式要做一个初始化的操作next(g)g.send(None)

下面用一个装饰器实现初始化操作

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

@init #foo=init(foo)
def foo():
    print('starting')
    while True:
        x=yield None
        print('value :   ',x)

g=foo() #wrapper()

g.send(2)

面向过程的程序设计思想:

核心是:过程,过程就是流程

优点:思路清晰,复杂的问题简单化,流程化

缺点:扩展性差

应用:linux内核,httpd,git

# 应用:grep -rl 'root' /etc
import os
# 用来初始化的装饰器
def init(func):
    def wrapper(*args,**kwargs):
        g=func(*args,**kwargs)
        next(g)
        return g
    return wrapper
#阶段一:递归的找文件的绝对路径,把路径发给阶段二
def search(target,start_path):#start_path 传入文件的绝对路径
    g=os.walk(start_path)#解析出文件路径
    for par_dir,_,files in g:
        # print(par_dir,files):#文件和路径拼接
        for file in files:
            file_path=r'%s\%s' %(par_dir,file)
            # print(file_path)
            target.send(file_path)#把值传给阶段二,得到目标文件路径file_path
# 阶段一的另一种写法,目的是为了方便传文件路径
# @init
# def search(target):
#     while True:
#         start_path=yield
#         g=os.walk(start_path)
#         for par_dir,_,files in g:
#             for file in files:
#                 file_path=r'%s\%s' %(par_dir,file)
#                 target.send(file_path)
# 阶段二:收到文件路径,打开文件获取获取对象,把文件路径发给阶段三
@init
def opener(target):
    while True:
        file_path=yield #接收阶段一发来的文件路径
        with open(file_path,encoding='utf-8')as f:
            target.send((file_path,f))
# 阶段三:收到文件对象,for循环读取文件的每一行内容,每一行内容传给阶段四
@init
def cat(target):
    while True:
        filepath,f=yield
        for line in f:
            res=target.send((filepath,line))
            if res:
                break
# 阶段四;判断root是否在这一行中,如果在,把文件名发送给阶段五
@init
def grep(target,pattern):#patter相当于root,(不让内容写死)
    tag = False
    while True:
        filepath,line=yield tag#yield会有一个返回值 返回给上一个阶段
        tag=False
        if pattern in line:
            target.send(filepath)
            tag=True
# 阶段五:收到文件名,打印结果
@init
def printer():
    while True:
        filename=yield
        print(filename)


start_path=r'D:py3.6保存代码py_fullstack_s5a'
search(opener(cat(grep(printer(),'root'))),start_path)

#对应第一种写法的另一种写法,文件路径的参数的传入
# start_path1=r'D:py3.6保存代码py_fullstack_s5a'
# start_path2=r'D:py3.6保存代码py_fullstack_s5a'
# g=search(opener(cat(grep(printer(),'root'))))#g是一个生成器
#
# g.send(start_path1)
# g.send(start_path2)

 生产者消费者模型

import time
import random
def init(func):
    def wrapper(*args,**kwargs):
        g=func(*args,**kwargs)
        next(g)
        return g
    return wrapper
def producer(target,count):
    for i in range(count):
        time.sleep(random.randrange(1,4))
        x='baozi%s' % i
        print('33[45m厨师造好的包子:%s33[0m' %x)
        target.send(x)
@init
def consumer(name):
    while True:
        food=yield
        time.sleep(random.randrange(1, 4))
        print('33[46m%s start to eat %s33[0m' %(name,food))
producer(consumer('alex'),10)

 

原文地址:https://www.cnblogs.com/z-x-y/p/7050028.html