zoukankan      html  css  js  c++  java
  • 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())))

  • 相关阅读:
    【HDOJ】2267 How Many People Can Survive
    【HDOJ】2268 How To Use The Car
    【HDOJ】2266 How Many Equations Can You Find
    【POJ】2278 DNA Sequence
    【ZOJ】3430 Detect the Virus
    【HDOJ】2896 病毒侵袭
    求奇数的乘积
    平方和与立方和
    求数列的和
    水仙花数
  • 原文地址:https://www.cnblogs.com/liuxiaowei/p/7262342.html
Copyright © 2011-2022 走看看