zoukankan      html  css  js  c++  java
  • 20190926 模块

    模块

    1.什么是模块

    模块是一系列功能的集合体,是一堆函数的集合体。一个.py文件也可以看成一个模块。

    2.模块的四种形式

    1. 内置模块:使用C编写并连接到python解释器的内置模块
    2. 第三方模块:已被编译为共享库或DLL的C或C++扩展,pip安装
    3. 自定义模块:自己写了一个.py文件,里面的函数就可以调用
    4. 包:把一系列模块组织到一起的文件夹

    3.模块的作用

    实现功能比代码更方便

    模块的导入

    1.import +模块名

    import + 模块名可以直接导入模块,在导入的同时发生了三件事

    1. 开辟内存空间,空间就命名就是为模块的名字
    2. 把模块中的所有代码读入名称空间,然后运行
    3. 通过模块.方法名使用模块中的方法
    import time
    time.sleep(0.01)
    

    2.form ... import...

    from + 模块名 + import + 方法名

    1. 开辟内存空间,内存名为模块名
    2. 把模块中的所有代码读入名称空间,然后运行
    3. 把方法读入文件代码中,因此可以直接使用方法名
    from time import sleep
    sleep(0.01)
    

    优点:不用加前缀,代码更加简洁

    缺点:容易与当前执行文件中名称空间中的名字冲突

    3.from ... import *

    from + 模块名 + * 导入所有的功能

    from time import *  
    time()
    localtime()
    gmtime()
    

    4.优缺点

    import +模块名 与 from...import 的

    相同点:

    1. 两者都会执行模块对应的文件,两者都会产生模块的名称空间
    2. 两者调用功能时,需要跑到定义时寻找作用域关系,与调用位置无关

    不同点

    1. import需要加前缀;from...import...不需要加前缀
    # import
    
    ## 优点: 永不冲突
    ## 缺点: 每次导入多输入几个字符,非常麻烦
    
    
    # from...import...
    
    ## 优点: 少输入几个字符
    ## 缺点: 容易发生冲突
    

    5.自定义模块

    分文件存储代码,函数与函数之间分开,让代码更清晰,不同模块不同事

    __all__方法

    可以使自定义模块内的变量指定打印,只会搜索__all__ []内的对象

    # run.py
    from spam import money
    money = 10
    print(money)  # 10
    ---------------------------------------------------
    # spam.py
    
    __all__ = ['money', 'read1']  # 只允许导入'money'和'read1'
    ----------------------------------------------------
    # run.py
    from spam import *  
    # 导入spam.py内的所有功能,但会受限制于__all__
    

    循环导入

    两个文件,各在文件中导入对方,

    # m1.py
    from m2 import x
    y = 'm1'
    print('from m1.py')
    
    # m2.py
    from m1 import y
    x = 'm2'
    print('from m2.py')
    

    会发生报错,不断地调用创建内存空间(每个内存空间只创建一次)

    首先执行 
    m1 ==》from m2 import x ==》 m2 ==》from m1 import y ==》print('from m1.py') ==》print('from m2.py') ==》print('from m1.py')
    

    解决方案

    我们可以使用函数定义阶段只识别语法的特性解决循环导入的问题,我们也可以从本质上解决循环导入的问题,但是最好的解决方法是不要出现循环导入。

    1. 打印结果在导入模块之上
    # m1.py
    print('from m1.py')
    y = 'm1'
    from m2 import x
    -------------------------------------------
    # m2.py
    print('from m2.py')
    x = 'm2'
    from m1 import y
    
    1. 利用函数定义阶段只时代语法不执行代码,最后执行函数
    # m1.py
    
    def f1():
        from m2 import y
        print('m1:', x, y)
    x = 10
    f1()
    ----------------------------------------------------------
    # m2.py
    
    def f2():
        from m1 import x
        print('m2:', x, y)
    y = 20
    f2()
    

    模块搜索路径的顺序

    模块其实就是一个文件,想要执行文件,先要找到模块的路径
    如果模块的文件路径和执行文件不在同一个文件目录下,我们就需要指定模块的路径。

    模块的搜索路径指的就是导入模块时需要检索的文件夹。

    导入模块时查找顺序是: 内存 - 内置 - 自定义

    1. 先从内存中已经导入的模块中查找
    2. 内置的模块
    3. 环境变量 sys.path 中查找

    python文件的两种用途

    python文件总共有两种用途,一种是执行文件,另一种是当做模块导入

    1. 脚本,文件是整个程序,用来被执行
    2. 模块,文件中存放功能,用来被导入

    __name__方法

    用于标识所在模块的模块名,当前运行的程序,其 _name_ 的值为 main,而导入到当前程序中的模块,其 _name_ 值为自己的模块名。

    # using_name.py
    if __name__ == '__main__':
       print('程序自身在运行')
    else:
       print('我来自另一模块')
    
    '''运行输出为:程序自身在运行'''
    
    # 同一文件夹下另一文件
    import using_name
    # 运行输出为:我来自另一模块
    
    
    

    当文件被执行是即当做执行文件的时候__name__ == '__main__'

    当文件作为模块文件 __name__ == 文件名

    pyinstaller 模块

    可以让py文件封装为.exe软件

    pyinstaller –i rose.ico –F rose.py

    # 使用这个模块压根不需要导入
    # http://www.bitbug.net/?tdsourcetag=s_pcqq_aiomsg
    
    # pyinstaller –i rose.ico(图片文件,百度转一个) –F rose.py(python文件)
    
    # pyinstaller –i rose.ico –F rose.py
    # 把.py文件转成.exe
    
    
  • 相关阅读:
    Apache Mahout
    ganglia安装
    编译出错 recompile with -fPIC
    centos6.4 基本安装nagios
    HDU1285 确定比赛名次
    HDU2888 Check Corners(二维RMQ)
    HDU3183 A Magic Lamp
    HDU1711 Number Sequence(KMP模版题)
    HDU3694 Fermat Point in Quadrangle(求四边形费马点)
    POJ2155 Matrix(二维树状数组)
  • 原文地址:https://www.cnblogs.com/fwzzz/p/11594441.html
Copyright © 2011-2022 走看看