模块

索引取值与迭代的差异

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

模块简介

1. 模块的本质
    内部具有一定的功能(代码)的py文件

2. python模块的历史
    python刚开始的时候所有搞其它编程语言的程序员都看不起 甚至给python起了个外号>>>:调包侠(贬义词)
    随着时间的发展项目的复杂度越来越高 上面那帮人也不得不用以下python 然后发现真相定律>>>:调包侠(褒义词)

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

模块的分类

1. 自定义模块
    我们自己写的模块文件

2. 内置模块
    python解释器提供的模块

3. 第三方模块
    别人写的模块文件(python背后真正的大佬)

导入模块的两种句式

"""
强调:
    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.在执行文件中直接使用名字就可以访问名称空间中对应的名字
"""

image

image

导入模块补充说明

1. importfrom...import...两者优缺点
   import句式
      由于使用模块名称空间中的名字都需要模块名点的方式才可以用
      所以不会轻易的被执行文件中的名字替换掉
      但是每次使用模块名称空间中的名字都必须使用模块名点才可以
      例如:import test
      print(test.name)

   from...import...句式
      指名道姓的导入模块名称空间中需要使用的名字 不需要模块名点
      但是容易跟执行文件中的名次冲突

2. 重复导入模块
   解释器只会导入一次 后续重复的导入语句并不会执行

3. 起别名
   import wuamening as wm
   from wuamening import zhonghongsd as zz
   from a import name as n,func1 as f1

4. 涉及到多个模块导入
   import a
   import wuamening
   如果模块功能相似度不高,推荐使用第一种 相识度高科园使用第二种
   import a, wuamening

循环导入问题

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

判断文件类型

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

if __name__ == '__main__':
    print('我是执行文件 可以运行这里的子代码')

上述脚本可以用来区分所在py文件内python代码的执行

使用场景
   1.模块开发阶段
   2.项目启动文件
"""
from test 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:\pythonProject\day1\test2.py')
   import ccc
   print(ccc.name)

绝对导入与相对导入

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

大白话:多个py文件的集合>>>:文件夹
专业: 内部含有__init__.py文件的文件夹(python2必须要求 python3无所谓)
posted @   悠悠-winter  阅读(85)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示