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(r'D:\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 程序流程
- 找文件路径 --os.walk
- 然后打开文件 --open
- 读取文件的每一行内容 -- for line in f
- 过滤一行内容中是否有Python if 'python' in line
- 打印包含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())))