zoukankan      html  css  js  c++  java
  • 模块

    一、模块介绍 

    '''
    1、什么是模块
        模块是一系列功能的集合体
        
        模块分为三大类
            自定义模块
            内置模块:time os json sys等
            第三方模块
        模块的四种表现形式
            使用Python编写的.py文件
            已被编译为共享库或DLL的C或C++扩展
            把一系列模块组织到一起的文件夹(注:文件有一个__init__.py文件,该文件称之为包)
            使用C编写并链接到Python解释器的内置模块
    
    2、为何要用模块
        1、可以拿来内置的、第三方的模块,然后直接使用,极大的提高开发效率
        2、将程序中共用的一些功能组织到一个文件中,然后程序各部分可以重用该文件中的功能
            减少代码冗余,增强程序的组织结构性与可维护性
    
    3、如何使用模块
        一个py文件就是一个模块,文件名如果是spam.py,模块名则为spam
        模块的使用必须要搞清楚谁是执行文件,谁是被导入的模块'''

    二、使用模块

    1、import的使用

    '''
    模块可以包含可执行的语句和函数的定义,这些语句的目的就是初始化模块,他们在模块名第一次遇到导入import语句时,才会执行
    import语句可以在程序中的任意位置使用,且针对同一模块可以import多次,为了防止重复导入
    Python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载到内存中的模块对象增加了一次引用,不会重复执行模块内的语句
    '''
    import sys
    import spam
    import spam
    import spam
    
    '''
    执行结果结果
    from import spam     # 只有在第一次import时才会执行被导入模块中的代码
    '''
    # sys.modules可以查看当前已经加载的模块
    print(sys.modules)
    
    # 执行结果
    {'builtins': <module 'builtins' (built-in)>, 'sys': <module 'sys' (built-in)>,......'spam': <module 'spam' from 'D:\python_study_new\day6\spam.py'>
     
    使用模块:
    spam.name 

    第一次导入模块,做了三件事(重复导入会直接引用内存中已加载好的结果)

    ''''
    1)为被导入的模块文件(spam.py)创建新的名称空间
    2)执行模块文件的代码,将产生的名字放到模块对应的名称空间中
    3)在当前名称空间中拿到一个模块名,该模块名指向模块的名称空间
    '''
    '''
    import导入模块的方式,在引用模块名称空间中该名字时,必须要加上前缀:模块名.名字
        优点:指明道姓的访问模块名称空间中的名字,肯定不会与当前名称空间中的名字冲突
        缺点:每次引用模块名称空间的名字都需要加上前缀,在模块名过长时,前缀的显得非常臃肿
        
    模块用逗号分隔一次性导入多个模块
    import os,sys,json
    推荐多行导入
        import os
        import json
    '''

    2、from…..import

    '''
    from spam import name,info
    首次导入,from...import也会做三件事:
    1)产生一个模块的名称空间
    2)执行模块文件的代码,将产生的名字放到模块名称空间
    3)会在当前名称空间直接拿到import后的名字
    '''
    # 可以直接使用,不用加前缀
    print(name)
    info()
    '''
    优点:简洁,不用加前缀
    缺点:容易与当前名称空间中的名字冲突
    强调:来自于模块名称空间中的函数一定是以模块名称空间为准的(函数的作用域关系在定义的时候就已经固定死的,与调用位置无关)
    '''
    
    from spam import *  # 把spam中所有的不是以下划线开头的名字都导入到当前名称空间
    # 大部分情况下我们的Python程序不应该使用这种导入方式,因为*你不知道导入了什么名字,很有可能会覆盖掉之前已经定义的名字,而且可读性极差,在交互环境下导入没有问题
    
    '''
    可以使用__all__来控制*(用来发布新版本),在spam.py中新增一行
    __all__=['money','read1'] #这样在另外一个文件中用from spam import *就这能导入列表中规定的两个名字
    '''

    3、解决模块的循环导入问题

    1)导入语句放在最后
    2)导入语句放在函数中

    三、模块的搜索路径

    '''
    模块的搜索路径优先级
    内存———内置模块————sys.path
    1)在第一次导入某个模块时,会先检查该模块是否已被加载到内存中,如果有则直接引用
    2)如果没有,解释器会查找同名内置模块
    3)如果还没有就到sys.path给出的目录列表里依次寻找被导入文件
    '''
    import sys
    print(sys.path)
    ['D:\python_study_new\day6', 'D:\python_study_new', 'D:\Python36\python36.zip', 'D:\Python36\DLLs', 'D:\Python36\lib', 'D:\Python36', 'D:\Python36\lib\site-packages', 'D:\PyCharm\helpers\pycharm_matplotlib_backend']
    sys.path.append('')
    # 可以把指定路径加入到sys.path中

    四、Python文件的两种用途区分

    '''
    一个Python文件可以有两种用途:
        当做脚本执行:一个文件就是整个程序,用来被执行
        当做模块调用:文件存放着一堆功能,用来被导入使用
        
    python内置了全局变量__name__,
        当文件被当做脚本执行时:__name__ == __main__
        当文件被当做模块导入时:__name__ == '模块名'
        
    作用:用来控制.py文件在不同应用场景下执行不同的逻辑
        if __name__ == __main__:
    '''

    五、包

    '''
    1、什么是包
        包本质就是一个包含有__init__.py文件的文件,夹文件夹是用来组织文件
        强调,包以及包下所有的文件都是用来被导入使用,没有一个文件是用来被直接运行
        因为包其实是模块的一种形式而已
    
    2、import p1
    2.1 创建p1的名称空间
    2.2 执行p1下的__init__.py文件的代码,将执行过程中产生的名字都丢到名称空间中
    2.3 在当前执行文件中拿到一个名字p1,p1指向__init__.py的名称空间
    
    4、包内模块的:绝对导入与相对导入
        绝对导入:每次导入都是以最顶级包为起始开始查找的
        相对导入:相对于当前所在的文件,.代表当前所在的文件,..代表上一级,...
            强调:
                相对导入只能在被导入的模块中使用
                在执行文件里不能用.或者..的导入方式
    
    5、注意:
        但凡在导入时带点的,点的左边必须是一个包
    
    '''
  • 相关阅读:
    ubuntu 12.04 配置双屏幕教程
    window打开服务的dos命令
    ffmpeg 视频转换和截图 方法
    pycharm
    Django mptt介绍以及使用
    浅谈Python Web框架
    activity 的属性android:taskAffinity和android:allowTaskReparenting
    android TranslateAnimation动画详解
    Android中Activity启动模式详解
    android:descendantFocusability用法简析
  • 原文地址:https://www.cnblogs.com/lichunke/p/9412337.html
Copyright © 2011-2022 走看看