Python函数之面向过程编程

Posted 银鑫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python函数之面向过程编程相关的知识,希望对你有一定的参考价值。

一、解释

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

二、优缺点

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

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

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

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

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

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

>>> import os
>>> os.walk(D:\test)        
generator object walk at 0x0000000002ADB3B8

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

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

>>> g=os.walk(D:\test)
>>> 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:\test, [a, b], [test.txt])
(D:\test\a, [a1], [a.txt])
(D:\test\a\a1, [], [a1.txt])
(D:\test\b, [b1], [b.txt])
(D:\test\b\b1, [], [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:\test\test.txt
D:\test\a\a.txt
D:\test\a\a1\a1.txt
D:\test\b\b.txt
D:\test\b\b1\b1.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())))

 

以上是关于Python函数之面向过程编程的主要内容,如果未能解决你的问题,请参考以下文章

python之面向对象

Python学习系列之面向对象

Python函数之面向过程编程

Python之路第六篇python基础 之面向对象

python 之函数式编程

Python进阶之函数式编程