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.直接使用

image-20240418160408905

2.制作包

image-20240418160733074

【六】常用模块

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)
posted on 2024-04-23 12:22  晓雾-Mist  阅读(1)  评论(0编辑  收藏  举报