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
    
    
  • 相关阅读:
    OpenCascade Ray Tracing Rendering
    Create New Commands in Tcl
    OpenCascade Modeling Algorithms Fillets and Chamfers
    OpenCascade Modeling Algorithms Boolean Operations
    Construction of Primitives in Open Cascade
    Open Cascade Data Exchange STL
    Tcl Tk Introduction
    Open Cascade DataExchange IGES
    Netgen mesh library : nglib
    Hello Netgen
  • 原文地址:https://www.cnblogs.com/fwzzz/p/11594441.html
Copyright © 2011-2022 走看看