美文网首页Python中文社区大数据,机器学习,人工智能
python3基础12详解模块、包(库)|构建|使用

python3基础12详解模块、包(库)|构建|使用

作者: pythonic生物人 | 来源:发表于2020-07-27 20:58 被阅读0次

    本篇详解python中模块(库)的构建及使用。
    首发于本人公众号:pythonic生物人

    更好的阅读体验请戳:

    python3基础12详解模块和包(库)|构建|使用

    本文您将学到什么?

    1.模块
    定义模块
    导入模块
    调用模块中函数
          方法1 模块名.函数名
          方法2 from 模块名 import 函数名1.函数名2,..
          方法3 from 模块名 import *
    给模块取个别名
    给模块中函数取个别名
    以脚本的方式执行模块
    __name__怎么理解
    查看模块中的属性:dir函数
    导入模块时sys.path怎么理解
    
    2.包
    建立一个包
    包中__init__.py文件作用
    从包中导入单个模块
          方法1
          方法2
    从包中导入所有模块
    

    1.模块

    python模块是一个包含Python定义和语句的文件(就是一个.py结尾的脚本文件);
    文件名为模块名,文件后缀为 .py;
    在一个模块内部,模块名可以通过 __name__方法获得。

    定义模块

    定义一个模块fibo,即创建一个fibo.py文件。#fibo.py

    # Fibonacci numbers module
    
    def fib(n):    # write Fibonacci series up to n
        a, b = 0, 1
        while a < n:
            print(a, end=' ')
            a, b = b, a+b
        print()
    
    def fib2(n):   # return Fibonacci series up to n
        result = []
        a, b = 0, 1
        while a < n:
            result.append(a)
            a, b = b, a+b
        return result
    

    导入模块

    python习惯上把所有 import 语句放在脚本的开头,全局调用。

    >>> import fibo#导入模块fibo
    >>> fibo.__name__#__name__方法获得模块fibo的模块名
    'fibo'
    

    调用模块中函数

    方法1 模块名.函数名

    >>> import fibo
    >>> fibo.fib2(100)
    [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
    

    方法2 from 模块名 import 函数名1.函数名2,..........

    >>> from fibo import fib,fib2#多个函数名之间使用逗号隔开
    >>> fib2(100)
    [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
    

    方法3 from 模块名 import *

    *表示该模块中所有的函数,会导致代码可读性差(不建议使用)。

    >>> from fibo import *
    >>> fibo.fib2(100)
    [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
    

    给模块取个别名

    import 模块名 as 别名

    >>> import fibo as fb
    >>> fb.fib2(100)
    [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
    

    给模块中函数取个别名

    from 模块名 import 函数名 as 函数别名

    >>> from fibo import fib2 as fb2
    >>> fb2(100)
    [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
    
    • 以脚本的方式执行模块

    fibo.py

    # Fibonacci numbers module
    def fib(n):    # write Fibonacci series up to n
        a, b = 0, 1
        while a < n:
            print(a, end=' ')
            a, b = b, a+b
        print()
    
    def fib2(n):   # return Fibonacci series up to n
        result = []
        a, b = 0, 1
        while a < n:
            result.append(a)
            a, b = b, a+b
        return result
    
    if __name__ == "__main__":
            print("现在该模块被当做脚本执行啦!")
            print(("此时__name__ == %s"%(__name__)))#此时模块的__name__为__main__
            import sys
            result = fib2(int(sys.argv[1]))
            print(result)
    

    > python fibo.py 100#if __name__ == "__main__":之后代码块执行了(常用于测试)
    现在该模块被当做脚本执行啦!
    此时__name__ == __main__
    [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

    __name__怎么理解

    __name__是个全局变量,存放模块的名字;
    当该模块被其它模块调用时,__name__=模块名,对于fibo.py,__name__="fibo";
    当该模块被当做执行脚本时,__name__为__main__( A module’s __name__ is set equal to '__main__' when read from standard input, a script, or from an interactive prompt)。
    对于fibo.py,如果终端执行 python fibo.py 100 ,if __name__ == "__main__":后面代码会执行;如果在别的模块中执行import fibo,,if __name__ == "__main__":后面代码不会执行。
    >>> import fibo#if __name__ == "__main__":之后代码块没执行
    >>>

    查看模块中的属性:dir函数

    >>> import fibo
    >>> dir(fibo)
    ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'fib', 'fib2']
    

    以__开头和结尾的属性为python的内置属性;
    'fib', 'fib2'为自定义属性。

    导入模块是sys.path怎么理解

    sys.path收集python模块的所有搜索路径,可以自己添加搜索路径(sys.path.append('yourpath'))举个栗子:

    #test.py
    #!/usr/bin/python
    import sys
    sys.path.append('~/biosoft/')
    print(sys.path)
    
    > python test.py
    ['/home/pylearning', 
     '/home/software/anaconda3/lib/python37.zip',
     '/home/software/anaconda3/lib/python3.7', 
     '/home/.local/lib/python3.7/site-packages', 
    '/home/software/anaconda3/lib/python3.7/site-packages',
    '~/biosoft/'
    ]
    

    任何一个python程序执行时,会搜索其导入模块的路径,先搜索内置模块路径;
    然后搜索sys.path收集的路径,sys.path中路径依次为:

    ['/home/pylearning', #被执行程序test.py所在路径'/home/software/anaconda3/lib/python37.zip','/home/software/anaconda3/lib/python3.7', #环境变量PYTHONPATH中路径'/home/.local/lib/python3.7/site-packages', #标准库路径'/home/software/anaconda3/lib/python3.7/site-packages',#标准库路径'~/biosoft/'#自己添加路径]


    2.包(库)

    建立一个包

    sound包包含formats,effects,filters三个子包。

    sound/                          #Top-level package(顶层包sound)
          __init__.py              #该文件可以为空,只有该文件存在时sound才会被当做包而不是目录
          formats/                  #Subpackage(子包)
                  __init__.py     #同上,该文件存在时,formats才会被当做包而不是目录
                  wavread.py
                  wavwrite.py
                  aiffread.py
                  aiffwrite.py
                  auread.py
                  auwrite.py
                  haha.py
                  ...
          effects/                  Subpackage for sound effects
                  __init__.py
                  echo.py
                  surround.py
                  reverse.py
                 haha.py
                  ...
          filters/                  Subpackage for filters
                  __init__.py
                  equalizer.py
                  vocoder.py
                  karaoke.py
                  ...
    

    包中__init__.py文件作用
    只有目录中添加__init__.py文件时,目录才会被当做包而不是目录;
    __init__.py 可以为空;
    __init__.py中可以设置 __all__ 变量,这个变量主要影响包的导入
    - 对于上文的sound包,sound/filters/__init__.py中输入__all__ == ["equalizer", "vocoder"]时,from sound.filters import *时不会导入karaoke模块。

    从包中导入单个模块

    导入sound包中子包effects中的echo模块

    方法1

    import sound.effects.echo引用它时必须使用它的全名,sound.effects.echo(xxx)。

    方法2

    from sound.effects import echo引用方法,echo(xxx)

    从包中导入所有模块

    from sound.effects import *引用方法,echo(xx)


    参考资料

    https://docs.python.org/zh-cn/3.8/library/__main__.html?highlight=__main__#module-__main__

    https://www.zhihu.com/question/49136398
    https://blog.konghy.cn/2017/04/24/python-entry-program/
    https://docs.python.org/zh-cn/3/tutorial/modules.html


    欢迎关注公众号:pythonic生物人


    干货,真香

    更好的阅读体验请戳:

    python3基础12详解模块和包(库)|构建|使用

    相关文章

      网友评论

        本文标题:python3基础12详解模块、包(库)|构建|使用

        本文链接:https://www.haomeiwen.com/subject/kdptrktx.html