zoukankan      html  css  js  c++  java
  • python基础-模块的使用

        一、模块的使用

          1.什么是模块

            模块就是一系列功能的集合体模块的表现形式为:

              a.使用python编写的py文件

              b.已被编译为共享库或DLL的C或C++扩展

              c.把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件)

              d.使用C编写并链接到python解释器的内置模块

            模块分为三大类:

              a.自定义模块

              b.内置模块

              c.第三方模块

          2.为什么要用模块

            a.可以下载别人的模块,然后直接使用。拿来主义。会极大的提高开发效率

            b.将程序公用的功能组织到一个文件中,便于使用和管理

          3.怎么用

            一个py文件就是一个模块,若文件名为spam.py,则模块名为spam

            import 导入

            首次import导入模块会发生三件事:

              a.创建一个模块spam.py的名称空间

              b.执行模块对应的文件spam.py,将产生的名字丢到模块的名称空间中

              c.在当前执行文件的名称空间中拿到一个名字spam,该名字就是指向模块spam.py的名称空间。

              

              在当前执行文件中引用模块中的名字:模块名 如:spam.名字

            

            ps:

              a.重复导入无效

              

                b.函数作用域关系在定义阶段就固定死了,与调用阶段无关

                 

                 

              

             from .... import :为什么要这个? 简化import代码量

              

              首次from...import导入模块会发生三件事:    

              a.创建一个模块spam.py的名称空间

              b.执行模块对应的文件spam.py,将产生的名字丢到模块的名称空间中

              c.将变量与spam名称空间的 变量地址绑定

              

               注意:1.run.py的同变量名会在当前名称空间查找。

                 

                 2.函数的作用域在定义阶段就固定死了

                 

     

              两种导入方式的对比:

                相同点:

                    a.函数的作用域关系在定义阶段就固定死了,与调用位置无关

                    b.都创建对应的模块名称空间,都会执行一次py文件、初始化名称空间

                 不同点:

                    from...import:

                      优点:from...import 可以不用加前缀而直接引用名字,更简洁              

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

                    import:

                      优点:指名道姓,肯定不会与当前执行文件的名字冲突

                      缺点:必须加前缀

              as 关键字改名:

              

              from ... import *:

                * 会检索被导入模块中的__all__指定的名字,如果没指定,默认导入所有变量

                

                        

        二、循环导入的问题

          

              模块循环/嵌套导入抛出异常的根本原因是由于在python中模块被导入一次之后,就不会重新导入,只会在第一次导入时执行模块内代码

              在我们的项目中应该尽量避免出现循环/嵌套导入,如果出现多个模块都需要共享的数据,可以将共享的数据集中存放到某一个地方

              在程序出现了循环/嵌套导入后的异常分析、解决方法如下

              示例:

                  m1.py文件

                      

                  m2.py文件

                  

                  run.py执行

                  

                  执行得到结果:

                    

                  出现原因:先执行run.py--->执行import m1,开始导入m1并运行其内部代码--->打印内容"正在导入m1"

                  --->执行from m2 import y 开始导入m2并运行其内部代码--->打印内容“正在导入m2”--->执行from m1 import x,由于m1已经被导入过了,
                  所以不会重新导入,所以直接去m1中拿x,然而x此时并没有存在于m1中,所以报错

                 解决方法1:

                   导入语句放到最后,把所有名字的定义放到前面

                    

                解决方法2:导入语句放到函数中

                   

        三、区分python文件的两种用途

               __name__:python内置变量。在满足某种条件自动触发使用。 

               1.可以直接执行运行

                  当做执行文件执行了:__name__ == '__main__'

                  

               2.可以被当做模块导入:

                  当做模块被导入时:__name__ == '模块名':

                  

           

        四、模块的搜索路径

             1.优先从内存中查找:

             a.导入模块spam

             b.sleep 20秒

               c.重新执行代码

               

              

          2.其次查找内置模块

           

              3.再次去 sys.path的环境变量里面依次查找

                ps:导入模块一定要搞清楚执行文件是谁和被导入模块是谁。

                  sys.path第一个元素是以当前执行文件的路径为准

                  

           a.导入文件可以向sys.path append或inert路径

           

                b.以执行文件路径为准,from...import模块

                

                   

  • 相关阅读:
    oracle expdp和impdp常用命令选项
    oracle expdp导出远程数据到本地
    oracle目录操作
    反射
    设置查询对话框的F7
    Uncaught TypeError: timeout.close is not a function. when try to use clearInterval
    timestamp to time 时间戳转日期
    react+antd 选项卡切换
    react antd Warning: must set key for <rc-animate> children
    微信企业号报Error: echostr校验失败,请您检查是否正确解密并输出明文
  • 原文地址:https://www.cnblogs.com/linbin7/p/10640271.html
Copyright © 2011-2022 走看看