zoukankan      html  css  js  c++  java
  • 生成器表达式和面向过程编程

    # 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)

     

  • 相关阅读:
    支付宝校园一卡通充值服务体验
    商品筛选导航菜单亮点欣赏
    手机QQ v4.2 有感
    因所缺,而所需——互联网应用的开发方向
    浅谈 css3 box盒子模型以及box-flex的使用
    浅谈stylus与sass的对比
    css3 transfrom使用以及其martix(矩阵)属性与其它属性的关系
    js命名空间
    公用的stringUtil工具
    js 实现angylar.js view层和model层双绑定(改变view刷新 model,改变model自动刷新view)
  • 原文地址:https://www.cnblogs.com/z-x-y/p/7050028.html
Copyright © 2011-2022 走看看