zoukankan      html  css  js  c++  java
  • Python基础篇【第十二篇】:模块导入

    1.什么是模块

    模块支持从逻辑上组织Python代码,当代码量大的时候,就把代码分成一些有组织的代码段,但是要保证它们彼此交互。代码片段有一定的联系,可能是一个包含数据成员和方法的类,也可能是一组相关彼此独立的操作函数。这些代码段是共享的,所以Python允许“调入”一个模块,允许使用其他模块的属性来利用之前的工作成果,实现代码重用。这个把其他模块中属性附加到你的模块中的操作叫做导入(import),那些自我包含并且有组织的代码片段就是模块(module)。

    2.模块和文件

    如果模块说是按照逻辑来组织Python代码的方法,那么文件表示物理层上组织模块的方法。因此,一个文件被看作是一个独立的模块,一个模块也可以看作是一个文件。模块的文件名就是模块的名字加上扩展名.py。

    在Python中导入的是模块或模块的属性。

    3.模块的搜索路径和路径搜索

    模块导入的时候需要一个叫“路径搜索”的过程。即在文件系统“预定义区域”中查找mymodule.py文件(如果导入mymodule的话)。预定义区域是Python搜索路径的集合。路径搜索和搜素路径是两个不同的概念,前者是指查找某个文件的操作,后者是去查找一组目录。

    有时候导入模块会报错:

    >>> import django
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ImportError: No module named 'django'
    

     发生错误的时候解释去告诉你无法请求的模块,可能的原因是模块不在搜索路径里(没有安装所以找不到),导致的错误。

    默认的搜索路径是在编译或安装的时候指定的,他可以在一个或两个地方修改。

    一个是启动Python的shell或命令行的PYTHONPATH环境变量。该变量的内容是一组用冒号分割的目录路径。如果想让解释器使用这个变量,要确保再启动解释器或执行python脚本前设置或修改了该变量。

    解释器启动之后,也可以访问这个搜索路径,它会被保存在sys模块的sys,path变量里,不过它已经不是冒号分割的字符串,而是包含每个独立的列表:

    >>> sys.path
    ['', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python35.zip', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/plat-darwin', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages']
    

     这只是个列表,所以可以对其更改,只要这个列表中的某个目录包含这个文件,他就会被正确导入。如果想要在其他的目录正确的导入,可以追加列表的方式:

    >>> import djanjo
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ImportError: No module named 'djanjo'
    >>> sys.path
    ['', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python35.zip', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/plat-darwin', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages']
    >>> sys.path.append('/Users/zk')
    >>> sys.path
    ['', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python35.zip', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/plat-darwin', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages', '/Users/zk']
    >>> import djanjo
    test
    

     当有一个模块有很多拷贝,解释器会使用沿搜索路径顺序寻找到第一个模块。

    使用sys.modules可以找到当前导入了哪些模块和他们来自什么地方:

    sys.modules:

    >>> sys.modules
    {'__main__': <module '__main__' (built-in)>, '_osx_support': <module '_osx_support' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/_osx_support.py'>, 'zipimport': <module 'zipimport' (built-in)>, 'rlcompleter': <module 'rlcompleter' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/rlcompleter.py'>, 'errno': <module 'errno' (built-in)>, '_locale': <module '_locale' (built-in)>, '_frozen_importlib': <module '_frozen_importlib' (frozen)>, 'posixpath': <module 'posixpath' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/posixpath.py'>, 'genericpath': <module 'genericpath' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/genericpath.py'>, 're': <module 're' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/re.py'>, 'sre_compile': <module 'sre_compile' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/sre_compile.py'>, '_stat': <module '_stat' (built-in)>, 'codecs': <module 'codecs' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/codecs.py'>, '_sysconfigdata': <module '_sysconfigdata' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/_sysconfigdata.py'>, 'encodings.aliases': <module 'encodings.aliases' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/encodings/aliases.py'>, '_warnings': <module '_warnings' (built-in)>, '_signal': <module '_signal' (built-in)>, 'encodings': <module 'encodings' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/encodings/__init__.py'>, '_frozen_importlib_external': <module '_frozen_importlib_external' (frozen)>, '_bootlocale': <module '_bootlocale' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/_bootlocale.py'>, 'os': <module 'os' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/os.py'>, 'copyreg': <module 'copyreg' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/copyreg.py'>, 'sre_constants': <module 'sre_constants' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/sre_constants.py'>, 'site': <module 'site' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site.py'>, '_collections_abc': <module '_collections_abc' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/_collections_abc.py'>, 'keyword': <module 'keyword' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/keyword.py'>, 'sys': <module 'sys' (built-in)>, '_sre': <module '_sre' (built-in)>, '_codecs': <module '_codecs' (built-in)>, '_weakrefset': <module '_weakrefset' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/_weakrefset.py'>, 'sre_parse': <module 'sre_parse' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/sre_parse.py'>, 'encodings.utf_8': <module 'encodings.utf_8' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/encodings/utf_8.py'>, '_sitebuiltins': <module '_sitebuiltins' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/_sitebuiltins.py'>, 'io': <module 'io' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/io.py'>, 'builtins': <module 'builtins' (built-in)>, '_weakref': <module '_weakref' (built-in)>, 'posix': <module 'posix' (built-in)>, '_thread': <module '_thread' (built-in)>, '_io': <module 'io' (built-in)>, 'stat': <module 'stat' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/stat.py'>, 'atexit': <module 'atexit' (built-in)>, 'encodings.latin_1': <module 'encodings.latin_1' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/encodings/latin_1.py'>, 'marshal': <module 'marshal' (built-in)>, '_imp': <module '_imp' (built-in)>, 'os.path': <module 'posixpath' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/posixpath.py'>, 'abc': <module 'abc' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/abc.py'>, 'sysconfig': <module 'sysconfig' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/sysconfig.py'>, 'readline': <module 'readline' from '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/lib-dynload/readline.cpython-35m-darwin.so'>}
    

    4.名称空间

    名称空间是名称(标识符)到对象的映射。向名称空间添加名称的操作过程涉及绑定标识符到指定对象的操作(以及给该对象的引用计数加1)

    *改变一个名字的绑定叫做重新绑定,删除一个名字叫做解除绑定。

    在执行期间有两个或三个活动的名称空间。这三个名称空间分别是局部名称空间,全局名称空间和内建名称空间,但局部名称空间在执行期间是不断变化的,所以说“两个或三个”。从名称空间访问这些名字依赖他们的加载顺序,或是系统加载这些名称的顺序。

    Python解释器首先加载内建名称空间,它由__builtins__模块中的名字构成。随后加载执行模块的全局名称空间,它会在模块开始执行后变成活动名称空间。这样就有了两个活动名称空间。

    如果在执行期间调用了一个函数,那么将创建出第三个名称空间,即局部名称空间。

    ***

    __builtins__模块和__builtin__模块的区别:

    虽然这两个长得差不多,只是名字相似而已。

    __builtins__模块包含内建名称空间中内建名字的集合。其中大多数来自__builtin__模块,该模块包含内建函数,异常以及其他属性,在标准Python执行环境下,__builtins__包含__builtin__的所有名字

    5.导入模块

    import语句

    import导入模块语句:

    import module1
    
    import module2

    import语句的模块顺序

    Python标准库模块

    python第三方模块

    应用程序自定义模块

    然后使用一个空行分割这三类模块的导入语句。这样确保模块使用固定的习惯导入。有助于减少每个模块需要的import语句数目。

    from - import语句

    在模块里导入指定的模块。也就是把指定名称导入到当前的作用域。

    from module import name
    

     6.扩展的import语句(as)

    就是使用自己想要的名字替换模块的原始名称。一个普遍的解决方案就是把模块赋值给一个变量:

    import longlongmodulename
    mod = longlongmodulename
    del longlongmodulename
    

     用as:

    import longlongmodulename as mod
    
  • 相关阅读:
    查准率(precision)和查全率(recall)
    数据集大全:25个深度学习的开放数据集
    利用贝叶斯算法实现手写体识别(Python)
    KNN算法识别手写数字
    判断点在直线的左右哪一侧
    多节点bigchaindb集群部署
    java 多线程 3 synchronized 同步
    java 多线程 1 “常用的实现多线程的2种方式”:Thread 和 Runnable
    java 字符串
    java 关键字static
  • 原文地址:https://www.cnblogs.com/allan-king/p/5520967.html
Copyright © 2011-2022 走看看