跳至正文
View Categories

1 min read

主要内容 #

综合实战:能简单了解模块化编程的基本流程,掌握python大型程序实现的基本思路。本节课主要简单介绍python中模块的实现和测试

10.python模块的中的__name__和__all__变量 #

上节课中我们做好了模块的功能设计,接下来只需要一一实现这些功能即可,首先我们建立一个名为mydic的python包,使你的包中包括我们设计好的module即相应的.py源文件,其中desgin.py是用来设计模块的伪代码,内容的话可以按照上节课示例三写,也可自己设计。 在进行模块编写之前我们首先了解模块中两个比较常用的变量__name__和__all__:
  • pyhton的每个module都有__name__属性,主要用于模块的测试
  • __name__ 的值表示该模块是否是主程序的入口,你可以这样理解如果单独执行该模块__name__变量的值为’__main__’,作为模块导入时__name__的值为文件名
  • __all__是一个模块对象的列表,由自己定义,主要用于from module import *中,该模块导入哪些功能,下例有具体展示
  • 以下示例展示了test1模块,在当前模块执行以及在test2模块执行中,__name__属性的变化注意体会。
    #test1.py
    print('test1',__name__)
    #test2.py
    import test1 as t1
    print('test2',__name__)

    11.python模块的实现和测试: #

    事实上在93课当中,我们已经实现了模块mysearch的功能,我们把它进行简单的封装如下例所示,在检索单词之前,我们定义了myreadcheck()函数,作为myresearch()函数的补充
    # coding=gbk
    '''模块mysearch'''
    import re
    def myreadcheck(path='六级单词.txt'):
        ''' 根据指定的路径,检查该文件是否存在,返回处理文件的路径,以及该文件本身
         后续可根据需要对文件进行预处理,调用时需要对check的文件进行关闭'''
        try:
            file=open(path)
            return path,file#返回多个变量时,以tuple的形式返回
        except FileNotFoundError:
            print('路径{}有错,未找到文件!'.format(path))
            return None
    def mysearch(head='un',func=myreadcheck,path='六级单词.txt'):
        '''高阶函数,根据文件名和开头检索单词,返回由该单词组成的列表
        head单词开头部分,path文件路径包括后缀,func文件检测函数目前只检测路径'''
        if func(path)==None:#文件不存在直接返回
            return
        else:
            file=func(path)[1]#元组的访问,只需取文件即可
            pattern=re.compile(r'\b{}.*\b'.format(head))#正则表达式\b用于单词开头与结尾,找出以un开头的单词,.*匹配除换行符以外的字符串
            pattern2=re.compile(r' +')
            wordlist=[]#储存字典的列表
            for line in file:#逐行读取文件
                res2=pattern2.sub(' ',line)
                res1=pattern.search(res2)#考虑到每行只有一个单词,使用模式对象的search()逐行检索,返回匹配对象
                if res1!=None:#如果匹配对象不为空
                    wordlist.append(res1.group())#在列表中添加此单词
            file.close()
        return wordlist
    __all__=['mysearch']#保留模块中的myreadcheck函数,使它在from myresearch import *中不被导入
    if __name__ == '__main__':#模块测试
        print(mysearch(head='mis'))

    习题 #

    尝试在mysearch()函数中用不同的head参数,对模块mysearch进行测试 思考一下如果在模块测试的代码前,不加入if __name__ == ‘__main__’的条件判断,该模块能运行吗?有什么不好的地方?

    OJ训练题 #

    1、水下探测器 – ★★
    2、阿尔法乘积 – ★★
    3、近似值 – ★★
    4、分解质因数 – ★★★
    5、子串统计 – ★★★★