8,函数模块

前提是你 提交于 2020-03-25 19:25:15

3 月,跳不动了?>>>

函数模块

定义 模块(Module)是一系列函数、变量、类的组成 Python程序是由一系列模块文件组成,一个.py文件就是一个模块

功能:

提高代码重用率
        需要用到某些函数,直接调用某个模块即可,无需重复编写
提高程序层次性
        不同功能模块放入不同的模块,逻辑性和层次性提高
方便协作防止冲突
        函数和变量在不同模块下可以有同样命名,但是不会冲突
        这样多人协作时,即便命名冲突,也不会干扰

原理

    模块创建
       用代码编辑器编写代码并保存为py文件
           sublime
           vim
       通过IDE编写模块
       #!/usr/bin/env python

# -*- coding:UTF-8 -*-

       x = 1
       def printx():
           'it is a module!'
           print x + 2
模块导入
       语法
           import Module
               
            导入整个模块到内存
                不覆盖本地命名空间
            采用点号调用函数
                Module.Func1
                Module.Func2
                Module.Func3
            不会覆盖本地命名(变量/函数等)
        from Module import Func
            
            导入模块某个函数到内存
            直接调用此函数
                Func1
            会覆盖本地某个命名(若本地有)
        from Module import *
            
            导入整个模块到内存
                覆盖本地命名空间
            直接调用此模块所有函数
                Func1
                Func2
                Func3
            会覆盖本地所有命名(若本地有)
        reload Module
            Python只会导入同一模块一次,若再次通过import或者from命令调用同一模块,也不会再次加载,而直接从内存寻找
            通过reload关键词可以重新载入该模块(另外一种方式便是重启Python)
            若脚本文件有变动,则需要通过reload重新载入
    流程
        搜索
            模块路径
        编译
            编译成字节码.pyc
                执行更快
        运行
            将模块定义的函数和类等导入运行
        说明
            一般导入一次之后,再import相同模块则不会再搜索、编译、运行
            需要通过reload来实现重新导入
    举例
        >>> import math
        >>> math.sin(10)
        -0.5440211108893699

 

模块路径
    搜索路径
        程序运行目录
            程序运行或安装目录
        环境变量PYTHONPATH
            PYTHONPATH是设置包含Python程序文件的目录的列表,这些目录可以是用户定义的或平台特定的目录名
        标准库模块目录
            标准库模块目录存储Python内置的模块文件
            Python会自动搜索标准库模块安装在此电脑上的那些目录
        .pth文件
    查看路径
        sys.path
            python会将模块搜索的路径统一存储在sys模块中的path变量中
            sys.path 包括程序运行路径、PYTHONPATH、标准库路径等,以列表方式存储
        >>> import sys
            导入sys模块
        >>> sys.path
            通过path函数查看标准库路径
            '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7','/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin',
            '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', 
            ['/Applications/PyCharm.app/Contents/helpers/pydev', '/Applications/PyCharm.app/Contents/helpers/pydev',
    配置路径
        通过函数sys.path增加模块搜索路径
            Windows
                >>> import sys
                >>> sys.path
                ['C:\\Program Files (x86)\\JetBrains\\PyCharm 4.5.3\\helpers\\pydev', 'C:\\Python35\\python35.zip', 'C:\\Python35\\DLLs', 'C:\\Python35\\lib', 'C:\\Python35', 'C:\\Python35\\lib\\site-packages', 'C:\\Users\\jaykingchen\\PycharmProjects\\PL']
                >>> sys.path.append("C:\\PATH")
                >>> sys.path
                ['C:\\Program Files (x86)\\JetBrains\\PyCharm 4.5.3\\helpers\\pydev', 'C:\\Python35\\python35.zip', 'C:\\Python35\\DLLs', 'C:\\Python35\\lib', 'C:\\Python35', 'C:\\Python35\\lib\\site-packages', 'C:\\Users\\jaykingchen\\PycharmProjects\\PL', 'C:\\PATH']
                >>> import MOD1
                    C盘路径下创建PATH文件夹并创建MOD1.py模块
                    print ('hello, world!')
                    print ('Welcome to PINGINGLAB')
                hello, world!
                Welcome to PINGINGLAB
            Linux/Unix/Mac
                >>> import sys
                    导入sys模块
                >>> sys.path
                    通过path函数查看标准库路径
                >>> sys.path.append('/user/pinginglab/')
                    添加自定义搜索路径
                >>> sys.path.append('/users/jaykingchen/MOD')
                ['/Applications/PyCharm.app/Contents/helpers/pydev', '/Applications/PyCharm.app/Contents/helpers/pydev',
                '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', 
                '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7','/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin',
        通过环境变量PYTHONPATH增加模块搜索路径
            Windows
                set PYTHONPATH=c:\python27\lib;
            Linux/Unix/Mac
                set PYTHONPATH=/usr/local/lib/python
        通过文件.pth增加模块搜索路径
            在site-packages添加一个路径文件,如sitepath.pth,文件中加入要增加模块所在的路径即可
            Windows
                C:\python27\site-packages
                C:\Python30\Lib\sitepackages
            Linux/Unix/Mac
                /usr/local/lib/python3.0/site-packages
                /usr/local/lib/site-python
                /usr/lib/python2.7/site-packages
                   /usr/local/lib/python2.7/dist-packages
模块互导
    概述
        
        模块和模块之间可以相互导入
    举例
        模块中导入内置模块
            #!/usr/bin/env python
            # -*- coding:UTF-8 -*-
            import math
            x = 1
            i = 10
            def printx():
                'it is a module!'
                print x + 2
            def printmsin():
            print math.sin(i)
        模块中导入自定义模块(已经有路径)
            #!/usr/bin/env python
            # -*- coding:UTF-8 -*-
            import M3
            y = M3.x + M3.i
            def printy():
                print y * y
        模块中导入自定义模块(还没有添加路径)
            import sys
            sys.path.append('/users/jaykingchen/MOD')
            import M3
            def printy():
                print y * y
            y = M3.x + M3.i
    拓展
        if __name__ == '__main__':
            原理
                模块直接执行时,这个模块的名字为 __main___
                模块被导入时,这个模块的名字便是模块本身
                所以,当模块直接执行时,这个判断条件成立,if语句后面的代码可以执行
                当模块被导入时,这个判断不成立,if语句后面的代码不被执行
                一般情况下,在模块里面的测试代码例如print等输出,我们可以放置在这个判断语句后面,这样其他人调用我们的模块时,则不会有额外的输出
            举例
                module3.py
                    #!/usr/bin/env python
                    # -*- coding:UTF-8 -*-
                    import math
                    x = 3
                    i = 10
                    
                    def printx():
                        'The Module3!'
                        print x + 2
                    
                    def printsin():
                    print math.sin(i)
                    
                    if __name__ == '__main__':
                        当其他模块调用此模块时,以下代码不执行
                        print printx()
                        print printsin()
                module4.py
                    #!/usr/bin/env python
                    # -*- coding:UTF-8 -*-
                    import module3
                    y = module3.x + module3.i
                    
                    def printy():
                        print y * y
                    
                    print printy()
                最终结果
                    169
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!