Python学习笔记8:面向过程编程

面向过程编程

面向过程编程是一种很有效的编程思路,其主要思想是将一个庞大的项目按照执行程序的过程进行细分,分成好几部分,没一部分都是单独的函数,前面函数的运行结果再传给后面的函数进行当做参数进行细分,最后得到终极结果

面向过程编程的优点是思路清晰,参数修改方便,缺点是不利于函数后期的修改

下面是根据面向过程编程模拟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))))

做题过程中容易犯错的几个点

  1. 刚开始的装饰器和以前的装饰器不一样,需按照实际情况改变
  2. 写生成器时注意加上while循环
  3. 写完生成器后注意@装饰器
  4. 需要sent两个值是注意只能以元组的形式sent
  5. 合理利用yield后加tag返回值来进行函数判断,另外返回tag后注意前后函数的变化
  6. 熟练掌握walk内置函数的使用方法
posted @ 2017-06-19 23:27  戴维德  阅读(233)  评论(0编辑  收藏  举报