模块
今日内容
-
索引取值与迭代取值差异
-
模块简介
-
模块的分类
-
导入模块的两种句式
-
导入模块补充说明
-
循环导入问题
-
判断文件类型
-
模块的查找顺序
-
绝对导入与相对导入
-
包
索引取值与迭代取值差异
-
索引取值
可以任意位置任意次数取值
不支持无序类型的数据值
-
迭代取值
只能从前往后依次取值无法后退
支持所有类型的数据值(无序有序)
ps:两者的使用需要结合实际应用场景
模块简介
-
模块的本质
内部具有一定功能(代码)的py文件
-
python模块的历史
python刚开始的时候所有搞其他编程语言的程序员都看不起 甚至给python起个了外号>>>: 调包侠(贬义词)
随着时间的发展项目的复杂度越来越高 商面那帮人也不得不用一下python 然后发现真相定律>>>:调包侠(褒义词)
-
python模块的表现形式
- py文件(py文件也可以称之为式模块文件)
- 含有多个py文件的文件夹(按照模块模块功能的不同划分不同的文件夹存储)
- 已被编译为共享库或DLL的C或C++扩展(了解)
- 使用C编写并链接到python解释器的内置模块(了解)
模块的分类
-
自定义模块
我们自己写的模块文件
-
内置模块
python解释器提供的模块
-
第三方模块
别人写的模块文件(python背后真正的大牛)
导入模块的两种句式
"""
强调:
1.一定要搞清楚谁是执行文件 谁是被导入文件
2.以后开发项目的时候py文件的名称一般是纯英文不会含有中文甚至空格
01 哈哈哈.py 不会出现
test.py views.py 出现
3.导入模块文件不需要填写后缀
"""
1.import句式
以import b 为例研究底层原理
"""
1.先产生执行文件的名称空间
2.执行被导入文件的代码将产生的名字放入的名称空间中
3.在执行文件的名称空间中产生一个模块的名字
4.在执行文件中使用该模块名点的方式使用模块名称空间中所有名字
"""


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

相当于指名道姓的调用
导入模块补充说明
1.import 与from...import...两者优缺点
import句式
由于使用模块名称空间中的名字都需要模块名点的方式才可以调用
所以不会轻易的被执行文件中的名字替换掉
但是每次使用模块名称空间中的名字都必须使用模块名点才可以
from...import...句式
指名道姓的导入模块名称空间中使用需要使用的名字不需要模块名点
但是容易跟执行文件中名字冲突
2.重复导入模块
解释器只会导入一次后续重复的导入语句并不会执行
3.起别名
import aaaaaaaaaaaaaaa as a
from aaaaaaaaaaaaaaaaaaa import dededededed as d
from a import name as n, age as a
4.涉及到多个模块导入
import a
import aaaaaaaaaaaaaaa
如果模块功能相似度不高 推荐使用第一种 相似度高可以使用第二种
import aaaaaaaaaaaaaaa, b


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

会提示你可能 循环导入了
解决方式一

判断文件类型
所有的py文件都可以直接打印__name__对应的值
当py文件是执行文件的时候__name__对应的值是__main__
当py文件是被导入文件的时候__name__对应的值是模块名
if __name__ == "main":
print("我是执行文件 我可以运行这里的子代码")
上述脚本可以用来区分所在py文件内python代码的执行
使用场景
1.模块开发阶段
2.项目启动文件
"""
from a import * *默认是将模块名称空间中所用的名字导入
__all__ = ["名字1", "名字2"] 针对*可以限制的名字
"""
模块的查找顺序
-
内存
import aaa import time time.sleep(15) print(aaa.name) aaa.func1()
导入的时候就已经把bb.py加载到内存了所以如果再把bb.py文件删除还是可以引用到的,但是当文件运行结束后再去引用那么就会报错了
-
内置
import time print(time) print(time)
如果自定义的模块名与内置的模块名冲突
则调用的方法还是内置模块的方法,虽然还有自定义模块的方法但是引用不了
-
执行文件所在的sys.path(文件环境变量)
一切以执行文件为准!!!
我们可以将模块所在的路径也添加到执行文件的sys.path中即可
import sys # print(sys.path) """ 打印出来的列表 如果想要引用到 aaa 下的 ccc.py 里的name """ # 方式一 sys.path.append(r"F:\pythonProject1\day17模块\04 模块的查找顺序\aaa") import ccc print(ccc.name) # 方式二 from aaa.ccc import name print(name)

绝对导入与相对导入
"""
一定要分清谁是执行文件!!
模块的导入全部以执行文件为准
"""
绝对导入
from aaa.bbb.ccc.www.qqq import name
print(name)
就是一层一层的往下找

相对路径
.在路径中表示当前目录
..在路径中表示上一层目录
..\..在路径中表示上一层目录
不在依据执行文件所在的sys.path 而是以模块自身路径为准

报一个没有找到的错
因为 导入模块一直以 执行文件稳准 在执行文件同级的里找找不到rrr 所以报 没有找到的错

让qqq按路径去找就可以了
包
就是多个py文件的集合》》》文件夹
在python2中
只有文件夹里存在__init__.py文件的才叫包
在pytho3中
只要文件夹里只要有py文件就可以算包

浙公网安备 33010602011771号