• Python函数之面向过程编程


    一、解释

    面向过程:核心是过程二字,过程即解决问题的步骤,基于面向过程去设计程序就像是在设计,流水线式的编程思想,在设计程序时,需要把整个流程设计出来, 一条工业流水线,是一种机械式的思维方式

    二、优缺点

    优点:程序体系结构清晰,可以把复杂的问题简单化,流程化

    缺点:可扩展性差,一条流线只是用来解决一个问题,所以说面向过程的应用多为不需要经常变化的软件

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

    三、实例(利用协程函数进行面向过程编程)

    过滤一个文件下的子文件、字文件夹的内容中的相应的内容,在Linux中的命令就是 grep -rl 'python' /etc

    使用了Python的包os 里面的walk(),能够把参数中的路径下的文件夹打开并返回一个元组

    >>> import os
    >>> os.walk('D:	est')        
    generator object walk at 0x0000000002ADB3B8
    
    >>> os.walk('D:\test')        # 以后使用这种路径方式,win下
    >>> os.walk(r'D:	est')       # 使用r 是让字符串中的符号没有特殊意义,针对的是转义

    出现错误,是因为路径的原因,但是在不同的机器上有的是可以的

    >>> g=os.walk('D:	est')
    >>> next(g)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration

    以后推荐是用

    >>> g=os.walk('D:\test')
    >>> next(g)
    ('D:\test', ['a', 'b'], ['test.txt'])

    返回的是一个元组第一个元素是文件的路径,第二个是文件夹,第三个是该路径下的文件

    1.2.1 程序流程

    1. 找文件路径 --os.walk
    2. 然后打开文件 --open
    3. 读取文件的每一行内容 -- for line in f
    4. 过滤一行内容中是否有Python if 'python' in line
    5. 打印包含Python的文件路径

    程序是从上往下执行的,1产生的路径作为参数给2,2产生的给3...

    上面产生的结果是下面的输入参数

    1 找文件的路径

    g是一个生成器,就能够用next()执行,每次next就是运行一次,这里的运行结果是依次打开文件的路径

    >>> g=os.walk('D:\test')
    >>> next(g)
    ('D:\test', ['a', 'b'], ['test.txt'])
    >>> next(g)
    ('D:\test\a', ['a1'], ['a.txt'])
    >>> next(g)
    ('D:\test\a\a1', [], ['a1.txt'])
    >>> next(g)
    ('D:\test\b', ['b1'], ['b.txt'])
    >>> next(g)
    ('D:\test\b\b1', [], ['b1.txt'])

    我们在打开文件的时候需要找到文件的绝对路径,现在可以通过字符串拼接的方法把第一部分和第三部分进行拼接

    用循环打开:

    import os
    # def serach():
    g = os.walk('D:\test')
    for i in g:
        print(i)
    结果:
    ('D:	est', ['a', 'b'], ['test.txt'])
    ('D:	esta', ['a1'], ['a.txt'])
    ('D:	estaa1', [], ['a1.txt'])
    ('D:	est', ['b1'], ['b.txt'])
    ('D:	est1', [], ['b1.txt'])

    将查询出来的文件和路径进行拼接,拼接成绝对路径

    import os
    # def serach():
    g = os.walk('D:\test')
    for i in g:
        # print(i)
        for j in i[-1]: # 对最后一个元素进行遍历,这些都是文件
            file_path= '%s\%s' %(i[0],j)
            print(file_path)
    结果:
    D:	est	est.txt
    D:	estaa.txt
    D:	estaa1a1.txt
    D:	est.txt
    D:	est11.txt

    这样就把文件的所有的绝对路径找出来了

    用函数实现:

    def search():
        while True:
            file_name = yield   # 通过white循环能够循环接收
            g = os.walk(file_name)   # 这里就换成了参数
            for i in g:
                for j in i[-1]: # 对最后一个元素进行遍历,这些都是文件
                    file_path= '%s\%s' %(i[0],j)
                    print(file_path)
    
    g=search()  # g就是生成器函数
    next(g)   # 初始化
    g.send('D:\test') # 通过send传递的是路径

    2 然后打开文件

    写程序中,在这里遇到的问题是 with open(file_path) as f: AttributeError: enter,不明白是为什么,然后想到open可能是系统已经用了的,所以修改名字后执行成功。

    @init   # 初始化生成器
    def opener(target):
        "打开文件,操作句柄"
        while True:
            file_path=yield  #  接收search传递的路径
            with open(file_path) as f:
                target.send((file_path,f)) # send多个用元组的方式,为了把文件的路径传递下去

    3 读取文件的每一行内容

    @init
    def cat(target):
        while True:
            file_path,f=yield
            for line in f:
                target.send((file_path,line)) # 同时传递文件路径和每一行的内容

    4 过滤一行内容中是否有

    @init
    def grep(pattern,target):  # patter是过滤的参数
        while True:
            file_path,line=yield
            if pattern in line:
                target.send(file_path)   # 传递有相应内容的文件路径

    5 打印包含Python的文件路径

    @init
    def printer():
        while True:
            file_path=yield
            print(file_path)

    上面的是函数的定义阶段,下面是函数的执行阶段:

    g=search(opener(cat(grep('python',printer()))))
    g.send('D:\test')

    target这个生成器:
    opener(cat(grep('python',printer())))

     
     
     
  • 相关阅读:
    D:yyyUNetSegmentation_code_20180301data rain
    第六课cnn和迁移学习-七月在线-cv
    lecture7图像检索-七月在线-cv
    lecture4特征提取-七月在线-cv
    guling code细节
    resNet代码-小象/cv
    unet网络讲解,附代码
    数字三角形
    递归折半查找
    分治法寻找第k大的数
  • 原文地址:https://www.cnblogs.com/yinxin/p/8451835.html
Copyright © 2020-2023  润新知