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)

     

  • 相关阅读:
    第三讲:增长全局观
    搭建安卓环境
    ~~
    天气阴
    天气晴
    Spark性能优化指南——高级篇
    Ceph Jewel 10.2.3 环境部署
    《你只是看起来很努力》--读书笔记
    博客园基础环境配置
    Spark 1.3.0 单机安装
  • 原文地址:https://www.cnblogs.com/z-x-y/p/7050028.html
Copyright © 2011-2022 走看看