python包和模块
1、模块
模块
#模块是Python代码文件,包含Python定义和语句。模块可以被导入到另一个模块中,以便在当前模块中使用定义和语句。模块可以包含函数、类、变量和常量。
#模块的命名规则:模块名必须是文件名(不包含扩展名)或包名(包含一个或多个点)的有效标识符。
.py文件就是模块,模块名就是文件名。
1.1导入模块
建一个mk.py的python文件(定义模块mk):
def add(x, y):
return x + y
def my(x, y):
return x * y
建一个ch1.py的python文件(导入模块):
- from 模块名 import * 导入一个模块到当前程序
- import 模块名 导入一个模块内部的全部属性到当前程序
import mk #导入mk模块
a =mk.add(1, 2) #调用mk模块中的add函数
print(a) #3
b =mk.my(3, 4) #调用mk模块中的my函数
print(b) #12
只导入模块里的某个函数或变量:
from 模块1 import 变量1,变量2,变量3
导入用不到的函数或变量会占用内存,浪费内存。
from mk import add #导入mk模块里的add函数或变量
a =add(1, 2) #调用mk模块中的add函数,不用写成mk.add(1,2)
print(a) #3
y = my(5.6) #报错,因为没有导入my函数
print(y)
1.2内部属性
__file__ 绑定模块的路径
__name__ 绑定模块的名称
如果是主模块(首先启动的模块)则绑定 '__main__'
如果不是主模块则 绑定 xxx.py 中的 xxx 这个模块名
1.3模块分类
Python 的模块可以分为系统模块、自定义模块和第三方模块
1.3.1 系统模块
Pytho内置的模块,安装Python时已包含,提供基础功能,比如数学运算、文件操作、网络通信等。
特点
-
即用即导入:直接
import
即可使用。 -
性能高效:通常使用 C 语言实现。
1.3.1.1 常见模块
模块 | 功能 | 官方文档 |
---|---|---|
math | 数学运算 | https://docs.python.org/zh-cn/3.12/library/math.html |
os | 操作系统接口 | https://docs.python.org/zh-cn/3.13/library/os.html |
os.path | 路径相关 | https://docs.python.org/zh-cn/3.13/library/os.path.html |
datetime | 日期和时间 | https://docs.python.org/zh-cn/3.13/library/datetime.html |
random | 随机数生成 | https://docs.python.org/zh-cn/3.13/library/random.html |
time | 时间 | https://docs.python.org/zh-cn/3.13/library/time.html |
1.3.1.2 方法示例
import random
a = random.randint(1, 100) #调用random模块中的randint函数
print(a)
random.random() # random.random 生成包含0 但不包含1 的浮点数
random.choice("ABCD") # 从一个序列中,随机返回一个元素
random.choice("ABCD")
L = [1, 2, 3, 6, 9]
random.choice(L)
random.shuffle(L) # random.shuffer(x) # 把列表X 打乱
print(L)
import time
time.time() # 返回当前时间的时间戳
time.ctime() #返回当前的UTC 时间的字符串
t1 = time.localtime() # 返回当前的本地时间元组
time.sleep(3) # 让程序睡眠 n 秒
time.strftime("%Y-%m-%d", t1) # 格式化时间
time.strftime("%y-%m-%d", t1)
time.strftime('%Y-%m-%d %H:%M:%S', t1)
# 1. os.getcwd(): 获取当前工作目录
import os
current_directory = os.getcwd()
print("当前工作目录:", current_directory)
# 2. os.chdir(path): 改变当前工作目录
new_directory = "F:\\01.AI07.深度学习框架\\00.上课课件"
os.chdir(new_directory)
print("工作目录已更改为:", os.getcwd())
# 3. os.listdir(path='.'): 返回指定目录下的所有文件和目录列表
directory_path = "."
files_and_dirs = os.listdir(directory_path)
print("指定目录下的文件和目录列表:", files_and_dirs)
# 4. os.mkdir(path): 创建目录
new_directory = "new_folder"
os.mkdir(new_directory)
print(f"目录 '{new_directory}' 已创建")
# 5. os.rmdir(path): 删除目录
directory_to_remove = "new_folder"
os.rmdir(directory_to_remove)
print(f"目录 '{directory_to_remove}' 已删除")
# 6. os.remove(path): 删除文件
file_to_remove = "example.txt"
os.remove(file_to_remove)
print(f"文件 '{file_to_remove}' 已删除")
1.3.2 自定义模块
-
用户自己编写的模块,用于复用代码。
-
文件名以 .py 结尾,存放自定义的函数、类等。
建一个mk.py的python文件(定义模块mk):
def add(x, y):
return x + y
def my(x, y):
return x * y
建一个ch1.py的python文件(导入模块):
- from 模块名 import * 导入一个模块到当前程序
- import 模块名 导入一个模块内部的全部属性到当前程序
import mk #导入mk模块
a =mk.add(1, 2) #调用mk模块中的add函数
print(a) #3
b =mk.my(3, 4) #调用mk模块中的my函数
print(b) #12
跨文件夹使用
假设目录结构如下:
project/
utils/
__init__.py
math_utils.py
main.py
在main.py
中:
from utils.math_utils import add
1.3.3 第三方模块
由社区或公司开发,通过包管理工具(如pip
)安装,用于实现更高级或更具体的功能,如数据科学、图像处理、网络爬虫等。
1.3.3.1 常见模块
那这可就太多了~这里随便举的例子
模块 | 功能 | 示例 |
---|---|---|
numpy | 数值计算 | 科学运算、矩阵操作 |
pandas | 数据分析 | 数据清洗与处理 |
matplotlib | 数据可视化 | 绘制图表 |
requests | HTTP请求处理 | 爬取网页内容,调用API |
flask | Web应用框架 | 快速搭建Web服务 |
1.3.3.2 使用示例
1.安装模块:pip install numpy pandas requests
numpy=1.25.0 :指定模块numpy版本是1.25.0版,没有就默认最新版
2.使用
# numpy 模块
import numpy as np
array = np.array([1, 2, 3])
print(array.mean()) # 输出: 平均值 2.0
# pandas 模块
import pandas as pd
df = pd.DataFrame({"Name": ["Alice", "Bob"], "Age": [25, 30]})
print(df)
# requests 模块
import requests
response = requests.get("https://jsonplaceholder.typicode.com/posts/1")
print(response.json())
1.3.3总结对比
分类 | 获取方式 | 使用场景 | 示例 |
---|---|---|---|
系统模块 | 随Python自带 | 常用功能,性能高效 | math , os , random |
第三方模块 | pip 安装 | 高级功能,特定领域 | numpy , requests |
自定义模块 | 自己编写 | 项目特定需求,灵活控制 | utils.py |
2、包
2.1概念
包是包含多个模块的目录。包可以包含模块、子包、子目录等。
包就是包含多个模块的文件夹。
包的目录结构:
包的目录结构必须包含一个__init__.py文件,该文件可以为空。
包的目录结构可以包含模块、子包、子目录等。
my_package/
__init__.py
module1.py
module2.py
subpackage/
__init__.py
module3.py
包的命名规则:包名必须是文件名(不包含扩展名)或包名(包含一个或多个点)的有效标识符。
包的作用:
1. 包可以避免命名冲突。
2. 包可以隐藏模块内部的复杂实现。
3. 包可以提供一个接口,使得模块可以被其他程序使用。
2.2导入包
使用`import`关键字可以导入包和子包,以访问其中的模块和内容。
# 同模块的导入规则
import 包名 [as 包别名]
import 包名.模块名 [as 模块新名]
import 包名.子包名.模块名 [as 模块新名]
from 包名 import 模块名 [as 模块新名]
from 包名.子包名 import 模块名 [as 模块新名]
from 包名.子包名.模块名 import 属性名 [as 属性新名]
# 导入包内的所有子包和模块
from 包名 import *
from 包名.模块名 import *
2.3__init__.py
在Python中,__init__.py
文件用于将一个目录标识为Python包。即使目录为空,只要其中包含__init__.py
文件,Python就会认为这个目录是一个包。这个文件可以为空,但通常会包含包的初始化代码,比如导入模块或者设置包的变量。通过__init__.py
,可以控制包的导入行为,比如初始化时执行某些操作或者定义包的公共接口。
作用
-
标识包目录: 告诉Python解释器当前目录应被视为一个包。
-
执行初始化代码: 可以包含任何代码,通常用于包的初始化操作,如变量初始化、导入模块等。这些代码在包被导入时执行。
-
控制包的导入行为: 通过
__all__
变量明确指定从包中可以导入哪些模块,从而限制包的公开接口。 -
提供包级别的命名空间:
__init__.py
中定义的变量和函数可以在包的模块中共享。 -
批量导入模块: 可以在
__init__.py
文件中批量导入模块,这些模块可以更方便地使用。
# __init__.py 文件示例
# 1. 批量导入系统模块
import os
import sys
import datetime
# 2. 定义包级别的变量
package_variable = "This is a package variable"
# 3. 控制包的导入行为
__all__ = ['module1', 'module2']
# 4. 执行初始化代码
print("Initializing mypackage")
# 注意:这个代码会在包被导入时执行
# 5. 导入包内的模块
from . import module1
from . import module2
3、模块与包的区别
模块 | 包 |
---|---|
一个Python文件 | 一个包含__init__.py 的文件夹 |
提供基本功能单元 | 用于组织多个模块 |
文件名为.py | 目录名 |