模块简介

模块理论

 

 

模块简介

  python语言
    最早起源于linux运维、胶水语言、调包侠(贬义词>>>褒义词)

  1.什么是模块?

    模块:一系列功能的结合体

  2.为什么要用模块?

    为了提升开发效率(站在巨人肩膀)

  3.模块三种来源

    1.内置的(python解释器自带能够直接导入使用)
    2.第三方的(别人写好的发布在网上的 需要先下载后使用)
    3.自定义的(自己写的)

  4.模块的四种表现形式

    1 使用python编写的代码(.py文件)
    2 已被编译为共享库或DLL的C或C++扩展
    3 包好一组模块的包(文件夹)
      包其实就是多个py文件(模块)的集合
      包里面通常会含有一个__init__.py文件
    4 使用C编写并链接到python解释器的内置模块
  """
  学习完模块之后 以后我在编写大型项目的时候
  遇到一些比较复杂的功能可以先考虑是否有相应的模块可以调用
  """

 

import句式

  在学习模块的时候 一定要区分谁是导入文件谁是模块文件
  import md # 导入py文件模块 文件后缀一定不要加


  """
  多次导入相同模块 只会执行一次

  首次导入md模块发生的事情
    1.运行导入文件(import句式.py)产生该文件的全局名称空间
    2.运行md.py文件
    3.产生md.py全局名称空间 运行md文件内代码 将产生的名字全部存档于md.py名称空间
    4.在导入文件名称空间产生一个md的名字指向md.py全局名称空间

  import句式导入模块之后
  通过模块名点的方式就可以使用到模块中所有的名字 并且肯定不会产生冲突(指名道姓)
  """

import md
money = 999 md.change() print(money) print(md.money)

 

from...import...句式

  """
  from...import...多次导入也只会导入一次
    1.先产生执行文件的全局名称空间
    2.执行模块文件 产生模块的全局名称空间
    3.将模块中执行之后产生的名字全部存档于模块名称空间中
    4.在执行文件中有一个money执行模块名称空间中money指向的值

  from...import...指名道姓的导入某个名字
    在使用的时候直接写名字即可 但是当当前名称空间有相同名字的时候
    就会产生冲突 使用的就变成了当前名称空间
  """

from md import money,read1,change

money = 999
print(money)

money = 999
def read1():
    print('董小姐')
read1()
change()
print(money)

 

导入模块扩展用法

  1.起别名

    既可以给模块名起别名也可以给模块中某个名字起别名

import mdddddddd as m
from mddddddd import name as n

 

  2.连续导入

    可以连续导入多个模块 但是只有当多个模块功能相似或者属于同一个系列
    如果功能不同并且不属于一个系列 那么推荐分行导入

import 模块名1,模块名2
     import 模块名1
     import 模块名2
from 模块名1 import 名字1,名字2,名字3

 

  3.通用导入

    将模块中所有的名字全部导入(*表示所有)

from md import *  # 将模块中所有的名字全部导入(*表示所有)
print(money)
print(read1)
print(read2)
print(change)
__all__ = ['money','read1']  # 在被导入的模块文件中可以使用__all__指定可以被导入使用的名字

 

判断文件类型

  判断py文件是作为模块文件还是执行文件
    __name__当文件是执行文件的时候会返回__main__
    如果文件是被当做模块导入则返回文件名(模块名)

if __name__ == '__main__':
  read1()
"""在pycharm中可以直接敲 main按tab键即可自动补全if判断"""

 

循环导入

  以后我们在导入模块的时候如果出现了循环导入的情况 说明你程序设计的不合理
  记住在以后的编程生涯中不允许出现循环导入的现象!!!

  一错再错

    1.调换顺序

      将彼此导入的句式放在代码的最后

    2.函数形式

      将导入的句式放入函数体代码 等待所有的名字加载完毕之后再调用

 

模块导入的顺序

  
  1.先从内存中查找
  2.再去内置模块中查找
  3.最后去sys.path系统路径查找(自定义模块)
  如果都没有查找到则报错

  以后在给py文件命名的时候尽量不要与内置模块名冲突

  import sys
  print(sys.path) # 结果中第一个元素永远是当前执行文件所在的路径


  当某个自定义模块查找不到的时候解决方案
    1.自己手动将该模块所在的路径添加到sys.path中
      import sys
      sys.path.append(r'D:\py20\day18\aaa')
    2.from...import...句式
      from 文件夹名称.文件夹名称 import 模块名
      from 文件夹名称.模块名称 import 名字

 

绝对导入与相对导入

  """在程序中涉及到多个文件之间导入模块的情况 一律按照执行文件所在的路径为准"""
  

  绝对导入

    始终按照执行文件所在的sys.path查找模块

  相对导入

    """
    句点符(.)
    .表示当前文件路径
    ..表示上一层文件路径
    """
  

  能够打破始终以执行文件为准的规则 只考虑两个文件之间的位置
  # 相对导入只能用在模块文件中 不能在执行文件中使用

 

  什么是包?什么是模块?
    一个py文件就是一个模块

    # 包就是多个模块功能的结合体

  如何创建包?
    包和文件夹的区别?包下有一个__init__.py文件
    而文件夹是没有的

  """
  模块首次被导入发生了3件事?
    1. 产生一个名称空间
    2. 执行被导入的py文件,然后把执行的数据都丢到名称空间
    3. 执行文件中产生一个变量指向这个名称空间

  包首次被导入发生了3件事?
    1. 产生一个包的名称空间
    2. 执行被导入包下的__init__.py文件,然后把执行的数据都丢到包的名称空间
    3. 执行文件中产生一个变量aaa指向这个包的名称空间

  """

 

END

 

posted @ 2021-11-23 15:41  Snails蜗牛  阅读(186)  评论(0编辑  收藏  举报