13.模块 包
【一】模块介绍
1)概念
- 在Python中,一个py文件就是一个模块
- 文件名xxx.py,其中xxx就是模块名
2)优点
- 极大的提高了开发速率
- 增加程序的健壮性和可读性
3)来源
- 内置的:python解释器自带的,可直接用
- 第三方:别人写的,需要下载在使用
- 自定义:自己写的
4)存在形式
1.单模块
自定义的功能所在py文件
2.包
一系列py文件的集合
必须有__init__.py 文件
【二】模块使用
新建文件 module.py
name = 'a'
# 打印
def name_():
print(name)
# 修改
def name_new():
global name
name = 'b'
print(name)
# 内嵌函数
def outer():
def inner():
print('***')
return inner
1)直接导入
import 文件名/模块名
import module
# 打印当前模块位置
print(module)
# <module 'module' from 'E:\\Python\\0\\pythonProject\\ST-day\\day18\\module.py'>
#打印
print(module.name) # a
# 调用函数修改的模块修改全局name
module.name_new() # b
print(module.name) # b
# 调用内嵌函数
func = module.outer()
func() # ***
2)导入多个模块
# 方法一
import module1
import module2
...
import moduleN
# 方法二
import module1,module2,...,moduleN
3)详细导入
1.导入指定内容
from 模块名 import 属性名
from 文件夹 import 模块名
from 文件夹.模块名 import 属性名
# 只使用module中的name_()
from module import name_
name_() #a
2.导入所有
- 把模块中所有的名字都导入到当前执行文件的名称空间中
- 在当前位置可直接可以使用这些名字
from 模块名 import *
- 只能在模块最顶层使用,在函数内非法
4)模块重命名
from 模块名 as 自定义名字
from 模块名 import 属性名 as 自定义名字
5)循环导入问题
- 两个文件相互调用
1.案例
- m1.py
print('正在导入m1')
from m2 import y
x='m1'
- m2.py
print('正在导入m2')
from m1 import x
y='m2'
- run.py
import m1
2.解决方法一
导入语句放到最后,保证在导入时,所有名字都已经加载过
- m1.py
print('正在导入m1')
x='m1'
from m2 import y
- m2.py
print('正在导入m2')
y='m2'
from m1 import x
- run.py
import m1
print(m1.x)
print(m1.y)
3.解决方法二
导入语句放到函数中,只有在调用函数时才会执行其内部代码
- m1.py
print('正在导入m1')
def f1():
from m2 import y
print(x,y)
x = 'm1'
- m2.py
print('正在导入m2')
def f2():
from m1 import x
print(x,y)
y = 'm2'
- run.py
import m1
m1.f1()
【三】模块加载和搜索顺序
1)模块分类
- 使用纯Python代码编写的py文件
- 包含一系列模块的包
- 使用C编写的底层代码
- 使用C或C++编译的扩展模块
2)加载顺序
- 先c 和 c++ 扩展出去的模块
- 使用c语言编写的底层代码
- 内置的一系列模块 (python解释器自带的和你安装 pip install )
- 纯python编写的自己定义的模块
3)查找顺序
# 先从自己的局部查
def func():
import time
# 再从全局查
import time
# 去内建查
python解释器自带的模块和你安装的模块中查,查出对应的模块再使用
# 去底层 c 语言查
有些功能你点进去看源码发现只要一个 pass
使用c语言写的,但是不想让你看到所有就省略掉了
【四】路径
1)相对路径
相对于当前目录或脚本文件所在目录的路径
-
默认就是当前目录下
-
./ 表示当前同级目录下
-
../ 表示当前目录的上一级目录
2)绝地路径
文件或目录在文件系统中的完整路径
# 在python内部查找的顺序都是绝对路径
import sys
print(sys.path)
# [
# 'E:\\Python\\0\\pythonProject\\ST-day\\day18',
# 'E:\\Python\\0\\pythonProject',
# 'E:\\Python\\PyCharm 2023.3.4\\plugins\\python\\helpers\\pycharm_display',
# 这里放的就是c语言源码编译后的扩展包
# 'E:\\Python\\Py3.11\\python311.zip', 'E:\\Python\\Py3.11\\DLLs',
# 放的是内置的模块或者安装的模块
# 'E:\\Python\\Py3.11\\Lib',
# 安装python解释器的路径
# 'E:\\Python\\Py3.11',
# 这里面也有部分安装的的包 ,默认安装到 site-packages
# 'E:\\Python\\Py3.11\\Lib\\site-packages',
# # 回到pycharm
# 'E:\\Python\\PyCharm 2023.3.4\\plugins\\python\\helpers\\pycharm_matplotlib_backend']
【五】包
1)介绍
-
是一个模块的集合,可将多个模块功能组合到一起
-
包是一个包含模块的目录,同时还可以包含其他子包
2)创建包
# 【1】创建一个文件夹
# 在文件夹内部创建 一个 __init__.py 文件
# 这个文件夹就叫包
# 【2】在pycharm右键文件新建 package
# 自动创建 __init__.py 文件
3)使用包
1.直接使用
2.制作包
【六】常用模块
1)json模块
1.导入模块
import json
2.序列化方法(loads)
- 字符串(str)—> 字典(dict)
import json
user = '{"name": "diva", "age": 18}'
user_json = json.loads(user)
print(user_json, type(user_json))
# {'name': 'diva', 'age': 18} <class 'dict'>
3.反序列化(dumps)
- 字典(dict)—> 字符串(str)
import json
user = {'name': 'diva', 'age': 18}
user_json = json.dumps(user)
print(user_json, type(user_json))
# {"name": "diva", "age": 18} <class 'str'>
4.保存与读取
保存进去是字典格式的字符串 读取出来是字典
import json
user = {'name': 'diva', 'age': 18}
# 写入
with open('data.json','w',encoding="utf-8") as fp:
json.dump(user,fp)
# 读取
with open('data.json','r',encoding="utf-8") as fp:
data = json.load(fp)
5.参数
# 保存中文数据(ensure_ascii=False)
import json
user = {'name': '晓雾', 'age': 18}
with open('data.json','w',encoding="utf-8") as fp:
json.dump(user,fp,,ensure_ascii=False)