zoukankan      html  css  js  c++  java
  • 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内置函数的使用方法
  • 相关阅读:
    Sql Server 2008卸载后再次安装一直报错
    listbox 报错 Cannot have multiple items selected when the SelectionMode is Single.
    Sql Server 2008修改Sa密码
    学习正则表达式
    Sql Server 查询第30条数据到第40条记录数
    Sql Server 复制表
    Sql 常见面试题
    Sql Server 简单查询 异步服务器更新语句
    jQuery stop()用法以及案例展示
    CSS3打造不断旋转的CD封面
  • 原文地址:https://www.cnblogs.com/rendawei/p/7051145.html
Copyright © 2011-2022 走看看