zoukankan      html  css  js  c++  java
  • 模块介绍

    模块基本概念:

             模块就是一系列功能的集合体,包括:内置模块、第三方模块、自定义模块。

              模块格式:1、使用Python编写的.py文件;2:、已被编译为共享库或DLL的C或c++扩展;3、把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,改文件夹称之为包);使用C编写的并连接到Python解释器的内置模块

             模块的使用价值:1.使用内置模块或者第三方模块就是拿来即用,可以极大地提高开发效率2.使用自定义模块可以减少代码冗余(抽取我们自己程序中要公用的一些功能定义成模块,然后程序的各个部分组件都去模块中调用这些共享的功能。)

              注意:模块的使用要分清楚哪个是执行文件,哪个是被导入文件。

    二,

    1.import导入模块:

    在执行文件中导入被执行文件的模块(比如一个文件名是spam.py,模块名就是spam),运行执行文件,会导致执行文件中模块的触发,执行被导入文件中的代码。首先在运行执行文件时,会在内存中造一个执行文件的名称空间(比如造一个run.py的名称空间), 如果文件中还有其他变量名,也统统在执行文件中的名称空间内部造出一个名称空间,存取变量名(名称)对应值的内存地址。执行被导入文件中的模块,在执行过程中产生的名字都放到模块的名称空间中去,存的都是名称对应值的内存地址;比如变量名、函数名等的名称,模块是在执行文件中定义的,所以模块的内存地址是在执行文件中的名称空间中 。如下图:

    首次导入模块的结果产生:

    1)会产生一个模块的名称空间;2)执行模块对应的那个文件,将执行过程中产生的名字都放到模块的名称空间中; 3)在当前执行文件的名称空间中拿到一个模块名,该名字指向模块的名称空间。

    导入模块后,都是直接引用第一次导入的成果,不会重新执行文件。

    执行文件中访问模块名称空间中名字的语法:模块名.名字

    总结:import导入模块在使用时是前缀+模块名

    优点:知指名道姓地向某一个名称空间要名字,不会与当前名称空间中地名字冲突

    缺点:但凡应用模块中的名字都要加前缀,不够简洁。

    import:

    除此之外还可以一行导入多个模块,但不推荐使用,这样写不够清晰。

    import spam,time,os

    还可以为模块起别名(Python中的模块名应该全为小写)

    import spam as sm 

    print(sm.money)

    print(sm.read1)

    2.from...import...导入模块

    首次导入模块发生3件事
     1). 创建一个模块的名称空间
     2). 执行文件spam.py,将执行过程中产生的名字都放到模块的名称空间中
     3). 在当前执行文件中直接拿到一个名字,该名字就是执行模块中相对应的名字的(与import导入模块名的不同之处,其直接导入只想的是一个变量名)

    当money=200在调用的money之上时返回的是模块中的值,当money=200,在调用的money之下时会覆盖掉模块中的值,返回执行文件run.py中的money的值。

    总结:    from...import...

    1)优点: 使用时,无需再加前缀,更简洁;2) 缺点: 容易与当前名称空间中的名字冲突。

     *代表从被导入模块中拿到所有名字(不推荐使用),这样如果执行文件中的名字如果与其冲突,就极易出错。所以要根据情况使用,如果模块中几乎大多数功能都使用了,那么推荐用*,这样简化了代码的臃肿,如果就使用了几个功能,那么建议明确地写上导入了什么。

    __all__在from...import中的使用(在模块的开头加上__all__指定的的元素,指定的元素可以用,其他的元素都被默认为没有定义)

    循环导入问题:

    解决方案一:将m1.py和 m2.py中的x=‘m1’、y=‘m2’都放到对应.py文件导入模块(循环语句)的下方;

    解决方案二:将名字放在函数体内部,利用函数在定义阶段不执行代码,只检测代码的特点,在调用的时候x,y的名字的名称空间都已经建立完毕

    两种方案其实都是将要导入的名字都提前在名称空间里获取到,在循环导入的时候就能获取到这个名字。

    区分Python文件的两种用途:

    如果测试者要测试.py里面的文件,如果直接用模块调用,就必须一次性把被导入文件跑完,耗时耗力,这里我们在.py文件中使用__name__方法判断,如果是右键运行.py 文件,if判断 __name__ == '__main__':,成立,程序能运行起来。在导入改文件的模块的文件中,右键运行,就会被if判断 __name__ == '__main__':阻断,从而让被导入文件停止运行。然后测试者可以在执行文件中根据模块名+ .  的方式调用自己想测试的代码。

    文件的查找路径的优先级

        

    模块搜索路径的优先级
         1. )内存中已经加载过的  2. 内置模块   3. sys.path(默认第一个值是当前执行文件所在的文件夹)

           

    模块的绝对导入:以执行文件的sys.path为起始点开始导入,称之为绝对导入。sys.path的查找顺序的环境变量是以当前执行文件为基准的,即所有被导入的模块参照环境变量sys.path都是以执行文件为准的。

    优点: 执行文件与被导入的模块中都可以使用(都可以以sys.path为起始点);  缺点: 所有导入都是以sys.path为起始点,导入麻烦

    相对导入:参照当前所在文件的文件夹为起始开始查找,称之为相对导入

     符号: .代表当前所在文件的文件夹,  ..代表上一级文件夹,  ...代表上一级的上一级文件夹

    优点: 导入更加简单;   缺点: 只能在导入包中的模块时才能使用,不能在执行文件中用 

  • 相关阅读:
    Codeforces Round #454 Div. 2 A B C (暂时)
    Codeforces Round #453 Div. 2 A B C D (暂时)
    EOJ Monthly 2017.12 A B C D
    C++调用Matlab引擎 图像读写与处理 (知识+代码篇)
    Codeforces Round #449 Div. 2 A B C (暂时)
    AtCoder Regular Contest 077 E
    hdu 6218 Bridge 线段树 set
    hdu 2243 考研路茫茫——单词情结 AC自动机 矩阵幂次求和
    php配置php-fpm启动参数及配置详解
    PHP连接MySQL数据库的三种方式(mysql、mysqli、pdo)
  • 原文地址:https://www.cnblogs.com/zhangchaocoming/p/11198544.html
Copyright © 2011-2022 走看看