Python基础-面向过程编程实现Linux下cat -rl ‘dir’ |grep ‘keywords’ 功能

函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。

面向过程的编程思想:流水线式的编程思想,在设计程序时,需要把整个流程设计出来

优点:

  • 程序的体系结构更清晰
  • 简化程序的复杂度

缺点:

  • 可扩展性及其差,所以i一般应用于不需要经常变化的软件,如:Linux内核,httpd,git等软件

实例:

实现类似Linux下的如下命令功能:

cat -rl 'dir' |grep 'keywords'

即查找‘dir目录下所有文件及子目录下的子文件的内容,并将包含‘keywords’的文件的绝对路径返回

 #面向过程式编程实现类似Linux下的cat -rl 'dir' |grep 'keywords'功能
 1 import os
 2 
 3 
 4 def init(func):
 5     """装饰器函数,完成生成器的初始化操作(next())"""
 6     def wrapper(*args, **kwargs):
 7         res = func(*args, **kwargs)
 8         next(res)
 9         return res
10     return wrapper
11 
12 
13 @init
14 def serch(target):
15     """寻找文件的绝对路径"""
16     while True:
17         dir_name = yield
18         g = os.walk(dir_name)       #遍历该目录下所有的文件和文件夹
19         for i in g:
20             for j in i[-1]:
21                 file_path = '%s\%s' % (i[0], j)        #将文件的绝对路径赋给变量
22                 target.send(file_path)      #将文件路径传递给下个函数
23 
24 
25 @init
26 def opener(target):
27     """打开文件,获取文件句柄"""
28     while True:
29         file_path = yield       #接收上个函数的文件路径
30         with open(file_path, encoding='utf8') as f:
31             target.send((file_path, f))     #将文件路径和文件内容变量f传递给下个函数
32 
33 
34 @init
35 def cat(target):
36     """读取文件内容"""
37     while True:
38         file_path, f = yield        #接收文件路径和文件内容变量
39         for line in f:
40             target.send((file_path, line))      #将文件路径和文件行内容变量line传递给下个函数
41 
42 
43 @init
44 def grep(pattern, target):
45     """过滤文件行内容是否包含关键字"""
46     while True:
47         file_path, line = yield     #接收文件路径和文件行内容变量
48         if pattern in line:
49             target.send(file_path)      #如果关键字变量‘pattern’存在于文件的行内容,将文件路径传递给下个函数
50 
51 
52 @init
53 def printer():
54     """打印包含关键字的文件名"""
55     while True:
56         file_path = yield
57         print(file_path)        #打印包含关键字的文件路径
58 
59 
60 g = serch(opener(cat(grep('python', printer()))))   #调用函数,按定义的顺序层层调用
61 g.send('D:Documentspy_fullstack_S4')              #传递欲搜寻的目录,执行关键字搜索

 

原文地址:https://www.cnblogs.com/OldJack/p/6700330.html