函数是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') #传递欲搜寻的目录,执行关键字搜索