面向过程编程
面向过程编程是一种很有效的编程思路,其主要思想是将一个庞大的项目按照执行程序的过程进行细分,分成好几部分,没一部分都是单独的函数,前面函数的运行结果再传给后面的函数进行当做参数进行细分,最后得到终极结果
面向过程编程的优点是思路清晰,参数修改方便,缺点是不利于函数后期的修改
下面是根据面向过程编程模拟Linux系统的grep -rl 'root' /etc 命令,此函数的作用是递归查找文件夹中以及子文件夹中的所有含有root 的文件,我们把这条命令细化为五个功能,然后分别实现
# 应用:grep -rl 'root' /etc 递归查找etc 下的含有root字符的文件
import os
# 编写装饰器,实现每调用一次生成器先进行一次next()功能
def init(func):
def wapper(*args, **kwargs):
g = func(*args, **kwargs)
next(g)
return g
return wapper
# 1.递归查找文件路径,把路径发给2
def search_path(target):
all_path_file = os.walk('/Users/David/Desktop/oldboy/day5/yield表达式文件夹')
for dire, _, files in all_path_file:
for file in files:
file_path = '%s/%s' % (dire, file)
target.send(file_path)
# 2.收到文件路径打开文件,获取文件对象,将文件对象发给3
@init
def opener(target):
while True:
file_path = yield
with open(file_path, 'r', encoding='utf-8') as f:
target.send((file_path, f))
# 3.收到文件对象,for循环读取文件的每一行内容,把每一行内容发给4
@init
def reader(target):
while True:
file_path, file = yield
for line in file:
res = target.send((file_path, line))
if res:
break
# 4.收到一行内容,判断root是否在这一行中,如果在,把这一行内容发给阶段5
@init
def grep(target, seq):
res = False
while True:
file_path, line = yield res
res = False
if seq in line:
target.send(file_path)
res = True
# 5.收到文件名,打印结果
@init
def printer():
while True:
file_name = yield
print(file_name)
root = 'root'
search_path(opener(reader(grep(printer(), root))))
做题过程中容易犯错的几个点
- 刚开始的装饰器和以前的装饰器不一样,需按照实际情况改变
- 写生成器时注意加上while循环
- 写完生成器后注意@装饰器
- 需要sent两个值是注意只能以元组的形式sent
- 合理利用yield后加tag返回值来进行函数判断,另外返回tag后注意前后函数的变化
- 熟练掌握walk内置函数的使用方法