面向过程的编程

以下是个人理解:

面向过程有点像知道了起因经过结果,我们主要研究经过,这样给出起因就会得到一个自然而然地结果,而且只能得出这么一种类型的结果,不会更改。

再举个例子:学生好比起因,学校好比结果,学生到学校中这个‘到’就是我们需要面向的过程,神转折吧 ,重点在‘到’上,这就是面向过程,我们需要做的的就是起床--洗漱---吃饭--坐车---下车   这么一个过程,如果中间一环出错就到不了学校,这就是面向过程的编程思想,这么做的好处是,能够拆分一个难得模块,将其一步步地实现。

下面做一个面向对象的变成

实现 centos下的 grep -rl 'root' /etc

的效果

import os
def zhuangshi(cent):
    def meiceng(*args,**kwargs):
        g=cent(*args,**kwargs)
        next(g)
        return g
    return meiceng
# 阶段一
@zhuangshi
def search(target,*args):
    '''#阶段一是为了遍历以下这个文件同时得出文件夹内没一个文件的绝对路径'''
    while True:
        start_path=yield #通过传入的方法传进需要遍历的地址
        g=os.walk(start_path)#递归的命令os.walk遍历一个文件夹,文件内的所有文件夹和文件以三个列表的方式排列[当前文件路径][文件夹][文件]
        for far_dir,_,son_dir in g:#循环迭代查询以下每一个路径取出[当前文件路径],_,[文件名]的格式取出
            for file in son_dir:#遍历子文件名
                file_path=r'%s\%s' %(far_dir,file)#重组文件目录
                target.send(file_path)#把每一次的绝对路径返给下一阶段的yeild
#阶段2
@zhuangshi
def opener(target,*args):
    '''阶段2是为了讲每一个绝对路径文件进行一个打开的流程'''
    while True:
        file_path=yield#通过yeild得到上面的file_path的绝对路径,目的是去扇面的觉都路径给下面用
        with open(file_path,encoding='utf-8') as f:#从上面取到了1阶段的函数中绝对路径,我们这里就可以直接进行一个觉都路径的打开流程
            target.send((file_path,f))#将打开的路径f,和绝对路径传给下面阶段,这里绝对路径只为了后期使用
#这里想传给yeild两个参数需要一元祖的形式这就是为什么我要添加两层括号

#阶段三
@zhuangshi
def cat(target,*args):
    '''阶段三是为了从上面特供的打开文件进行逐行读或者说逐行遍历的过程没有起的功能'''
    while True:
        file_path,f=yield#通过yeild接受上面穿过来的绝对路径,打开的文件f
        for line in f:#开始逐行遍历
            res=target.send((file_path,line))#每行遍历的内容给line,并且将得到的返回值复制给res使用,注意给两个值需要是元祖
            if res:  #如果res返回值为true那么我们停止循环这个文件,就可以循环下一个文件了
                break
# 阶段四
@zhuangshi
def grep(target,pattern):
    '''这里我们要做的是 将外部引来的条件进行对比如果在这一行我们就进行再传'''
    tag =False  #建立一个标志位 初始是false
    while True:
        tag = False #第一次进入while修改为false
        file_path,line=yield tag#从上面取出了文件的路径和每一行内容,将TAG作为返回值返回给send阶段四的哪个函数
        if pattern in line:#如果外部调用的内容在这一行说明我们要去取出的就是这个文件路径了
            target.send(file_path)#传给一下咯yield路径
            tag=True #如果确认筛选的在这一行证明这个文件已经可以输出了那么我们修改为True。
#阶段五
@zhuangshi
def printer():
    '''打印出结果'''
    while True:
        filename=yield#接手上面的结果发送给filename
        print(filename)#打印及最后一步完成
g=search(opener(cat(grep(printer(),'root'))))#做成一个函数
star_path=r'H:\py联系\第一颗\d6'#定义文件的路径
g.send(star_path)#将路径send进阶段一我们就可以将路径活用

总共分成了5步,每一步执行一种事情

posted @ 2017-06-19 17:21  一锅煮不下  阅读(223)  评论(0编辑  收藏  举报