zoukankan      html  css  js  c++  java
  • 模块

    模块

    什么是模块

      模块:就是一系列功能的结合体   这么说呢,因为模块是将很多的工具放在一起,也就是说,将很多的函数放在一个大的箱子里面,组成的一个工具箱。

    模块的三种来源

      1 内置的      python解释器自带的       已经包装好的     

        ps:虽然是内置的模块,但是也不能不导入直接使用 ,换个方法吧       比如在吃饭的时候,你不自己使用筷子,筷子能把饭自己夹起来给你啊

      2 第三方的   就是其他人写的  但是大家觉得还不错    使用率较高的

           3 自定义的    自己写的    自己在自己的功能里需要用到的  自己进行包装

    模块的四种表现形式

      1 使用python写的py文件,就是一个模块,一个py文件就可以称为一个模块

      2 已经被编译为共享库或者DLL的C或C++扩展(我也不知道啥意思,知道怎么用就行)

      3 把一系列模块组织到一起的文件夹(文件夹下有一个__init__.py文件,该文件夹称之为包)

         包:一系列py文件的结合体

      4 使用C编写的并且连接到python解释器中的内置模块

    为什么要使用模块

      1 体现出调包的特点:python的特点还记得是什么吗?胶水语言和调包侠,使用模块  说白了就是用已经写好具有一定功能的函数被,那内置的可以用,其他人写好的不是也能用吗,这就提现出python的掉包的好处了,不管什么,先去搂个模版,拿来改吧改吧,(不管你之前写的多NB, 不过,现在是我的了)典型的拿来主义,废话,没个近路那还行,不过学习之路还是不能走捷径的,这样可以极大提高开发效率

      2 使用自定义模块,程序很大的时候,使用面向过程编程,固然可以,但是为什么要自己为难自己呢,所以,对自己的程序进行一个好的规划,再写之前就将功能分开,同样的功能放在同一个py文件下,自己也好找,改起来也方便。使用的时候还能直接调用。nice。否则每一个功能使用前都要登录的话,难道100个功能就写100次登陆吗。反正我不干。

    使用模块

      最重要的一点就是将执行文件和被导入文件区分开,自己都不知道自己的程序这么启动(在小姐姐面前多尴尬)。接下来就说说这么导入模块

    import导入模块

    使用import导入模块 访问模块名称空间中的名字统一句势:模块名.名字

    首先,我们先来创建几个文件试试怎么搞,

    import md1    #  这就是导入模块方式
    
    money = 9999
    
    def read1():
        print('from run read1')
    # 访问模块中的名字指向的值
    # print(md.money)  # 使用import导入模块 访问模块名称空间中的名字统一句势:模块名.名字
    
    
    
    
    # md.read1()
    # md.read2()
    # print(md.change)
    
    md1.change()
    print(money)
    print(md1.money)
    run.py(文件1)
    print('from the md1.py')   # 就是看看程序运行之后是不是成功导入了
    money = 1000
    def read1():
      print('md',money)
    def read2():
      print('md模块')
      read1()
    def change():
      global money
      money = 0
    md.py(文件2)

    文件创建好并且写好之后,在run.py运行之后发现居然运行的是md.py文件里面的代码,这说明你已经成功的将模块导入并且能成功的使用了。

      右键运行run.py文件首先会创建一个run.py的名称空间
        首次导入模块(md1.py)(******)
          1.执行md.py文件
          2.运行md.py文件中的代码将产生的名字与值存放到md.py名称空间中
          3.在执行文件中产生一个指向名称空间的名字(md)

    这不是骚操作   还有点low

    import
    os import os import os import os import os 有个传说是一行代码100块 但是这样子 你觉得行吗 行(因为不会报错啊) 但是 多次导入不会再执行模块文件,会沿用第一次导入的成果(******)

    还有注意,在程序运行的时候之前学的东西依旧是按照他自己的执行顺序

      1.只要你能拿到函数名 无论在哪都可以通过函数加括号来调用这个函数(会回到函数定义阶段 依次执行代码)

      2.函数在定义阶段 名字查找就已经固定死了 不会因为调用位置的变化而改变

    使用import导入模块 访问模块名称空间中的名字统一句势:模块名.名字

      1.指名道姓的访问模块中的名字 永远不会与执行文件中的名字冲突
      2.你如果想访问模块中名字 必须用模块名.名字的方式

    第一种  规范形式
    import os
    import time
    import md
    
    
    第二种    也可以这么写  但是不推荐
    import os time md
    
    前提是导入的时候写在文件的开头
    
    特殊情况或者只是在特定的情况下使用也可以在使用之前导入,节省内存
    模块导入

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

    会先创建run1.py的名称空间
      首次导入md1.py模块
        1.运行md1.py
        2.将产生的名字存放到md1.py名称空间中
        3.直接拿到指向模块md1.py名称空间中某个值的名字


    利用from...import...句式
      缺点:
        1.访问模块中的名字不需要加模块名前缀
        2.在访问模块中的名字可能会与当前执行文件中的名字冲突

    写法

      from 模块名 import 名字

      ps  这里的名字可以使用   *    代替   这样子就可以直接将模块中的所有名字全部加载过来,但是不推荐这么写,在使用一个陌生的模块时候,你会直接知道里面的内容吗,当然不会。所以这个技巧记住,但是尽量别使用 


    循环导入问题及解决思路

    from dir1.dir import m1
    
    m1.f1()
    run.py
    print('正在导入m1')
    from m2 import y  # 首次导入m2
    
    x = 'm1'
    m1.py
    print('正在导入m2')
    from m1 import x  # 第二次导m1
    
    y = 'm2'
    m2.py

    创建好之后运行run文件。发现了一个问题。是不是形成一个死循环了,因为在运行的时候,使用from导如之后 根本没有进行下面的代码,之后在m2文件同样,导入之后代码是没有走到的,所以就成了一个循环导入,怎么解决呢

      方式1   将导入模块的哪一行代码放在最后,两个文件都放在最后

    ##### m1.py 文件
    
    print('正在导入m1')
    x = 'm1'
    from m2 import y  # 首次导入m2
    
    
    ##### m2.py  文件
    
    
    print('正在导入m2')
    
    y = 'm2'
    from m1 import x  # 第二次导m1

    ##### run.py文件
    
    
    from dir1.dir import m1
    
    m1.f1()
    这样就能解除刚才的循环导入

      方式2 以函数的形式解决

    ######### m1.py
    
    print('正在导入m1')
    def f1():
      from dir1.dir.m2 import y,f2
      print('m1.f1>>>y:',y)
      f2()
    x = 'm1'
    
    
    ########## m2.py
    
    print('正在导入m2')
    def f2():
      from dir1.dir.m1 import x
      print('m2.f2>>>x:',x)
    y = 'm2'
    
    ########### run.py文件
    
    
    from dir1.dir import m1
    
    m1.f1()

    __name__的用法

    print(__name__)  #  __main__
    
    打印结果是__main__
    
    # print(__name__)
    # 当文件被当做执行文件执行的时候__name__打印的结果是__main__
    # 当文件被当做模块导入的时候__name__打印的结果是模块名(没有后缀)

    快捷方法
    main 按Tab键盘
    if __name__ == '__main__':
     

    模块的查找顺序

    模块的查找顺序

      1:先从内存中找

      2:内存中没有去内存里面找

      3:最后在环境变量里找     

        sys.path(环境变量)      

    相对导入和绝对导入

    相对导入:(相对路径)相对于目前所在的文件的目录路径,然后在哪里,与当前所在文件进行对比的

    绝对导入:(绝对路径)就是在计算机中,当前文件的绝对目录   D:Python项目day14dir1   这样的,从盘开始一个一个文件都有的,最后到这个文件

    ps:

      . :一个点是当前目录

      ..:两个是上一级目录

      ...:三个是上上一级目录

      以此类推,文件层数多的根据自己的层数点    (.)    

    软件开发目录规范

     这个就厉害了,感觉写了这么几天的代码,虽然还是low的不行,但是有了这个  软件开发目录规范  之后,自己的代码看起来又那么一点点高大上了!!!

     这里用ATM作为案例来写一下,首先新建一个新的项目      

                                                      开始文件就这么写,别问我为什么

  • 相关阅读:
    从例图中学习思维导图的基本概念
    名企面试官精讲典型编程题之C++篇
    PPT,要你好看(全彩)
    文字即艺术
    MindManager中读图工具的使用
    思维导图的三招十八式
    放之四海皆适用的设计原则(一)
    MindManager的例图资源
    内容营销11金规
    专业嵌入式软件开发——全面走向高质高效编程(含DVD光盘1张)
  • 原文地址:https://www.cnblogs.com/xuzhaolong/p/11197066.html
Copyright © 2011-2022 走看看