模块
索引取值与迭代取值的差异
索引取值可以按照 任意索引位任意次数取值。不支持无序数据类型。
迭代取值只能从前往后依此取值无法返回,支持所有数据类型。
模块
模块简介
本质:
内部具有一定功能(代码)的py文件
模块就是已经封装好的功能体,可以直接使用。
模块就是一个工具包,要想使用这个工具包的工具,就需要导入这个模块
好处:
可以极大的提升开发效率
模块的四种表达形式:
1.使用python代码编写的文件。
2.多个py文件组成的文件夹(包)
3.已经被编译共享库或者dll的c或c++扩展
4.使用c编写并链接到python解释器的内置模块
模块的分类
1.内置的模块
解释器里自带,直接导入使用即可
2.自定义模块
自己动手写的代码,封装成模块,自己使用或者大家分享使用。
3.第三方模块
别人发到网上的,直接下载使用
导入模块的两种句式
1.import...句式
1.使用 import md md是被导入文件(模块)
print(md.name)
"""一定要分清楚哪个是执行文件,哪个是被导入文件(模块)"""
优点: 使用模块名.的方式,不会轻易的和被执行文件中相同的名称替换。
----------------------------------------------------------------------------
底层原理:
执行当前文件会产生一个当前文件的名称空间
执行import 句式,导入模块文件(此时就会产生一个 模块文件的名称空间)
在当前文件名称空间会产生一个模块的名字。 指向模块的名称空间
通过这个名字以 模块名.的方式就可以使用模块空间中的所有数据
语法:
import 模块名 eg : import time
通过time.time 的方式就可以使用该模块内的功能。
2.from...import...句式
from md import name,age
for 模块名 import 该模块中的名字
优点:指名道姓的导入模块名称空间中需要使用的名字。不需要md.
缺点: 容易跟执行文件中相同名字冲突
----------------------------------------------------------------------------
底层原理:
执行当前文件产生一个当前文件的名称空间。
执行导入语句 运行模块文件产生模块文件的名称空间。存放运行过程中所有名字
当前执行文件中直接使用名字就可以访问名称空间的对应名字。
from md import name,age # import 后面写什么名字就只能用什么名字
print(name)
print(age)
如果当前执行文件中有一个相同的名字就会产生名称冲突
在使用的时候要避免名称冲突
导入模块的句式补充
1.可以给模块名起别名:
在模块名特别长的情况下,我们使用import 时不太方便,我们可以使用如:
import 好长的模块名 as 简写 的形式
import zheigemingzizhenchang as zc
eg:
impory zheigemingzihaochang as zc
print(zc.模块中的名字)
------------------------------------------------------------------------------
from zheigemingzihaochang import name as n
print(n)
注意from...import 的方式 模块名不可以简写但是 该模块名称空间内的名字可以简写。
------------------------------------------------------------------------------
2.连续导入模块
解释器只会导入一次,后续在同样的执行文件内重复的导入语句并不会执行。
------------------------------------------------------------------------------
3.涉及到多个模块导入
1. import a # 单个模块
2. import a,b,c,d # 多个模块
如果导入的多个模块功能相似度高,推荐使用第二种,如果相似度不高推荐使用第一种
循环导入问题及解决策略
当两个文件彼此导入彼此时:
并且相互使用各自名称空间中的名字时,极容易出现报错
解决方法:
1. 编写代码的过程中尽可能避免出现循环导入。
2. 确保名字在使用前已经准备完毕。
如果无法避免循环导入:
方式一 : 把名字放在import句式上面。
方式二 : 将导入模块的句式写在函数体代码里面。
方式三 : 使用多个文件来避免 两个文件彼此导入彼此
判断文件类型
py文件分为两种:
1.执行文件。
2.被导入文件
所有的py文件都可以直接打印__name__对应的值。
当py文件时执行文件的时候 __name__ 对应的值是 __main__
当py文件时被导入文件时__name__ 对应的值是模块名
我们也可以使用__name__区分 被导入的代码和测试代码
if __name__ == '__main__':
print('如果我在被执行文件内(模块),这里的子代码就无法运行哦')
#如果 是在执行文件内,就会执行子代码,打印。如果是在被导入文件内,对应的值是模块名。则条件不成立。
简写 输入main + tab自动补全
------------------------------------------------------------------------------
补充:
from a import *
*默认是将模块名称中所有的名字导入
使用__all__ = ['name','age'] 只能使用输入在内的名字,其余的均不可使用
模块的查找顺序
"""
1.内存: 先从内存找
2.内置模块:再从内置模块中找
3.sys.path: 最后去sys.path查找"""
如果上述三个地方都找不到那么直接报错。
------------------------------------------------------------------------------
1. 先从内存找
我们在执行文件中使用time 方法,停顿15秒来测试:
可以看出我们把b.py删了他还是能调到数据 因为在导入模块时已经调用了b.py已经写到内存里,删除只是删掉硬盘内数据,如果删除后在来一次就不行了。因为程序结束后内存里的数据已经释放了。
2. 验证从内置模块查找
利用time模块查找
import time
print(time)
print(time.time())
"""
<module 'time' (built-in)>
1666082462.776438
"""
以后在自定义模块时,不要使名称与内置模块出现冲突。
3. 验证从sys.path查找
imoport sys
print(sys.path)
D:\Python38\python.exe D:/pythonProject/day16/time.py
['D:\\pythonProject\\day16', 'D:\\pythonProject\\day16', 'D:\\PyCharm 2021\\plugins\\python\\helpers\\pycharm_display', 'D:\\Python38\\python38.zip', 'D:\\Python38\\DLLs', 'D:\\Python38\\lib', 'D:\\Python38', 'D:\\Python38\\lib\\site-packages', 'D:\\PyCharm 2021\\plugins\\python\\helpers\\pycharm_matplotlib_backend']
结果是一个列表里面是一大串路径。
我们只需要查看第一个路径就可以。
------------------------------------------------------------------------------
如果我们的模块执行不了那么就要把模块的路径放到执行文件的sys.path里。
解决方法:
使用列表 append方法 把绝对路径加入进sys.path
import sys
sys.path.append(r'D:\pythonProject\day16\my')
print(sys.path)
import AAA
print(AAA)
第二种方法
from my.my1 import AAA # 将my文件夹中的子文件my1中导入模块AAA
print(AAA)
绝对导入与相对导入
在导入模块的时候一切查找模块的句式都是以执行文件为准
无论导入的句式是在执行文件中还是在被导入文件中!!!
------------------------------------------------------------------------------
绝对导入:
就是按照目录一层一层往下查找
from my.my1.my2.my3 import name # 可以精确到变量名
from my.my1.my2 import AAA # 也可以精确到模块名
------------------------------------------------------------------------------
相对导入:
只能在用在模块文件中,不能在执行文件中使用。
from . import b # 在当前目录下导入 b模块
"""
.表示当前目录
..表示上一层目录
../..表示上上一层目录
"""
包
本质就是一个含有__init__.py文件的文件夹
在python2中必须要求, python3中无所谓