zoukankan      html  css  js  c++  java
  • Day5_协程函数_面向过程

    def func(count):
            while True:
                yield count
                count +=1
    
    #这是一个生成器,需要利用next()来执行。
    func(10)
    

     #yield:

     #1.把函数的执行结果封装好_iter_ 和_next_,即得到一个迭代器。

     #2.与return功能类似,都可以返回值,但不同的是,return只能返回一次值,而yield可以返回多次值。

     #3.函数暂停与再继续运行的状态是由yield保存。

    #yield的表达式应用:

    #用法:
    def eater(name):
        print('%s 说:我开动啦' %name)
        food_list=[]
        while True:
            food=yield food_list
            food_list.append(food) #['骨头','菜汤']
            print('%s eat %s' %(name,food))
    #
    # alex_g=eater('alex')
    # #第一阶段:初始化
    # next(alex_g) #等同于alex_g.send(None)
    # print('===========>')
    #
    # #第二阶段:给yield传值
    # print(alex_g.send('骨头')) #1 先给当前暂停位置的yield传骨头 2 继续往下执行,直到再次碰到yield,然后暂停并且把yield后的返回值当做本次调用的返回值
    # # print('===========>')
    # print(alex_g.send('菜汤'))
    # print(alex_g.send('狗肉包子'))
    
    #将吃的部分定义成模块,实现模块交互
    def producer():
        alex_g=eater('alex')
        #初始化
        next(alex_g)
        #第二阶段:给yield传值
        while True:
            food=input('>>:').strip()
            if not food:continue
            print(alex_g.send(food))
    producer()
    

    面向过程:核心即过程二字,过程即解决问题的步骤,基于面向过程去设计程序,就是设计一条工业流水线,是一种机械式的思维方式。

    优点:程序结构清晰,可以把复杂的文件简单化,流程化。

    缺点:可扩展性差,一条流水线只是用来解决一个问题。

    应用场景:linux内核,git,httpd,shell脚本。

    实现一个小程序: tail -f access.log | grep 'error'

    第一阶段:找到所有文件的绝对路径

    第二阶段:打开文件

    第三阶段:循环读出每一行内容

    第四阶段:过滤

    第五阶段:打印该行属于的文件名

    #遍历检索目录下的文件,需要用到os这个模块。

    import os
    #装饰器
    def init(func):
      def wrapper(*args,**kwargs):
        g=func(*args,**kwargs)
        next(g)
        return g
      return wrapper

    #找到所有文件的绝对路径
    @init
    def search(target):
      while True:
      filepath=yield
      g=os.walk(filepath)   for pardir,_,files in g:    print(pardir,files)   for file in files:   abspath=r'%s\%s' %(pardir,file)   print(abspath)
          target.send(abspath)

    #第二阶段:打开文件
    @init
    def opener(target):
      while true:
      abspath=yield
      with open(abspath) as f:
        print(f)
      


    #第三阶段:循环读取文件的每一行内容
    @init
    def cat(target):
      while True:
        abspath,f=yield
        for line in f:
          target.send(abspath,line)
          if res:break

    #第四阶段,过滤
    @init
    def grep(pattern,target):
      tag=False
      while True:
      abspath,line=yield tag
      tag=False
      if pattern in line:
        target.send(abspath)
        tag=True
    #第五阶段,打印该行属于的文件名
    @init
    def print():
      while True:
        abspath=yield
        print(abspath)


    g=search(opener(cat(grep('error',print()))))
    g.send(r'路径')










  • 相关阅读:
    [USACO07JAN]平衡的阵容Balanced Lineup
    洛谷 P4389 付公主的背包 解题报告
    多项式Ⅱ
    半平面交 板子
    Problem C Dist 解题报告
    二维凸包的板子
    洛谷 P4841 城市规划 解题报告
    广二模拟赛 Problem A: 青春野狼不做理性小魔女的梦 解题报告
    CF 997E 解题报告
    洛谷 P4244 [SHOI2008]仙人掌图 II 解题报告
  • 原文地址:https://www.cnblogs.com/sexiaoshuai/p/7269172.html
Copyright © 2011-2022 走看看