模块

今日内容概要

  • 索引取值与迭代取值的差异
  • 模块简介
  • 模块的分类
  • 导入模块的两种句式
  • 导入模块的句式补充
  • 循环导入问题
  • 判断文件类型
  • 模块的查找顺序
  • 绝对导入与相对导入

今日内容详情

索引取值与迭代取值的差异

l1 =[11, 22, 33, 44, 55]
1.索引取值
 可以任意位置任意次数取值
  不支持无序类型的数据取值
2.迭代取值
 只能从前往后依次取值无法后退
  支持所有类型的数据取值(无序有序)
  ps:两者的使用需要结合实际应用场景

模块简介

1.模块的本质
 内部具有一定的功能(代码)的py文件
2.python模块的表现形式
  1.py文件(py文件也可以称之为是模块文件)
  2.含有多个py文件的文件夹(按照模块功能的不同划分不同的文件夹存储)
  3.已被编译为共享库或DLL的c或c++扩展
  4.使用c编写并链接到python解释器的内置模块

模块的分类

1.自定义模块
  我们自己写的模块文件
2.内置模块
  python解释器提供的模块
3.第三方模块
  别人写的模块文件

导入模块的两种句式

"""
强调:
   1.一定要搞清楚谁是执行文件 谁是被导入文件
   2.以后开发项目的时候py文件的名称一般是纯英文
     不会含有中文甚至空格
      01 作业讲解.py  不会出现
      test.py views.py  出现
  3.导入模块文件不需要填写后缀名
"""


1.import句式
  以import  a为例底层原理
  """
  1.先产生执行文件的名称空间
  2.执行被导入文件的代码 将产生的名字放入被导入文件的名称空间中
  3.在执行文件的名称空间中产生一个模块的名字
  4.在执行文件中使用该模块名点的方式使用模块名称空间中所有的名字
  
  """
  
  2.from ... import...句式
  以 from a import name, func1 为例研究底层原理
 """
 1.先产生执行文件的名称空间
 2.执行被导入文件的代码将产生的名字放入被导入文件的名称空间中
 3.在执行文件的名称空间中产生对应的名字绑定模块名称空间中对应的名字
 4.在执行文件中直接使用名字就可以访问名称空间中对应的名字
 """

导入模块补充说明

1.import 与 from ... import...两者优缺点
  import句式
    由于使用模块名称空间中的名字都需要模块名点的方式才能使用
    所以不会轻易的被执行文件中的名字替换掉
    但是每次使用模块名称空间中的名字都必须使用模块名点才可以
  from ... import ...句式
    指名道姓的导入模块名称空间中需要使用的名字 不需要模块名点
    但是容易跟执行文件中名字冲突
2.重复导入模块
 解释器只会导入一次 后续重复的导入语句并不会执行
3.起别名
import wuyongerciyuan as wy  
from wuyongerciyuan import zhangzehonglovezhanghong as zz
from a import name as n,func1 as f1
 4.涉及到多个模块导入
  import  a
  import  wuyongerciyuan
  如果模块功能相似度不高 推荐使用第一种 相似度高可以使用第二种
  import a, wuyongerciyuan
5.通用导入
 from a import *   *默认是将模块名称空间中所有的名字导入
  

循环导入问题

1.循环导入
  两个文件之间彼此导入彼此并且相互使用各自名称空间中的名字   极容易报错
2.如何解决循环导入问题
  1.确保名字在使用之前就已经准备完毕
  2.我们以后在编写代码的过程中应该尽可能避免出现循环导入

判断文件类型

所有的py文件都可以直接打印__name__对应的值
   当py文件是执行文件的时候__name__对应的值是__main__
   当py文件是被导入文件的时候__name__对应的值是模块名


if __name__ ==   '__mian__'
   print('哈哈哈')
  
 上述脚本可以用来区分所在py文件内python代码的执行


使用场景
  1.模块开发阶段
  2.项目启动文件
 

'''
from a import *  *默认是将模块名称空间中所有的名字导入
__all__  = ['名字1', '名字2']  针对*可以限制拿的名字

'''

模块的查找顺序

1.内存
  import aaa
  import time 
  time.sleep(15)
  print(aaa.name)
  aaa.func1()
  
  
  2.内置
   import time
    print(time)
    print(time.name)
    """
    以后在自定义模块的时候尽量不要与内置模块名冲突
    """
    
    
  3.执行文件所在的sys.path(系统环境变量)
  一定要以执行文件为准
  我们可以将模块所在的路径也添加到执行文件sys.path中即可
  import sys
  print(sys.path) # 列表
  sys.path.append(r'D:\pythonProject03\day17\mymd')
  import ccc
  print(ccc.name)

绝对导入与相对导入

"""
再次强调:一定要分清楚谁是执行文件 谁是被导入文件
模块的导入全部以执行文件为准
"""
绝对导入
from mymd.aaa.bbb.ccc.ddd import name  # 可以精确到变量名
from mymd.aaa.bbb.ccc import ddd  # 也可以精确到模块名
 ps:套路就是按照项目根目录一层层往下查找
  
相对导入
.在路径中表示当前目录
..在路径中表示上一层目录
..\..在路径中表示上上一层目录
不在依据执行文件所在的sys.path 而是以模块自身路径为准
    from . import b
相对导入只能用于模块文件中 不能在执行文件中使用
  """
  相对导入使用频率较低 一般用绝对导入即可 结构更加清晰
  """

大白话:包就是多个py文件的集合 >>>>:文件夹
专业:内部含有__init__.py文件的文件夹(python2 必须要求  python3 无所得)
posted @ 2022-10-18 20:17  hugmi男孩  阅读(39)  评论(0)    收藏  举报