模块与包
模块与包
在 Python 中,模块是一种组织代码的方式。
一、介绍
一个模块可以包含变量、函数等。通过将相关的代码放入模块中,可以更好地组织代码并实现代码的复用性。模块的文件名通常以 .py
为扩展名。
这里可以想一下,函数是对一些代码的组合,模块是对一些函数变量的组合。
特点
- 重用代码: 模块提供了代码重用的机制,可以在不同的地方调用相同的功能。
- 维护性好: 将功能相关的代码放在一个模块中,有助于代码的维护和管理。
二、使用
模块类型
- 标准模块,Python自带的模块,如
os
、math
等。 - 第三方模块,可以通过工具安装的第三方库,如
numpy
、pandas
等。 - 自定义的模块,开发者自己编写的模块,用于自己的项目中。
模块的调用
Import
要在Python中使用模块,可以使用 import
语句将模块导入到当前代码中。例如:
import module_name
之后就可以使用模块中定义的变量、函数:
module_name.function_name()
比如导入math
import math
print(math.pow(2,2))
4
可以使用 as 对导入的模块进行重命名
import module_name as my_module
后面的代码就可以通过 my_module 代替 mode_name
from ... import ...
使用 from ... import...
可以只导入模块中的部分函数或变量
比如只想使用 math 中的计算指数的函数
from math import pow
print(pow(2,2))
4
也可以 from ... import *
导入一个模块中的所有的函数,调用函数时就不用写模块的名称了
from math import *
print(pow(2, 2))
print(sin(pi / 6))
4
0.5
一般不推荐这样做,如果两个包中有相同的函数就会覆盖
主模块
主模块指的是直接被执行的模块,而非主模块则是被其他模块导入的模块。
当通过 import
导入一个模块时,编译器会执行模块中的每一行代码。有些代码可能只想在主模块的情况下执行,而在非主模块的情况下不执行。
比如有一个 my_math 的模块,提供了一个加法的函数。同时有一些测试代码。
# my_math.py
def add(a, b)
return a+b
add(1,2)
add(2,3)
当别人依赖这个模块的时候,本来只想使用 add 函数,却把 my_math 模块中的测试代码也执行了一遍。
# test.py
import my_math
print(my_math.add(1,2))
3
5
3
为了解决这个问题,在每个模块内部都有一个 __name__
的属性,用来判断当前这个模块是不是主模块。只有在主模块里面 __name__
的值为 __main__
,在其他模块中值为模块的名称。
my_math模块可以添加一个 if
判断。
# my_math.py
def add(a, b)
return a+b
if __name__ == '__main__':
add(1,2)
add(2,3)
三、模块的定位
当导入一个模块时,Python 会在 sys.path
中的路径查找,就像操作系统的环境变量一样,sys.path
是 Python 的环境变量。
可以尝试输出 sys.path
来查看有哪些目录在搜索范围内。
import sys
print(sys.path)
['', '/Library/Frameworks/Python.framework/Versions/3.11/lib/python311.zip', '/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11', '/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages']
四、包
使用模块可以避免函数、变量冲突,但是模块的名字还是可能会和别人的冲突,所以 Python 引入了包的概念。
包是一种将模块组织成文件夹结构的方式。一个包是一个包含了一个特殊的 __init__.py
文件的文件夹。
package_a/
__init__.py
math.py
file.py
package_b/
__init__.py
math.py
module1.py
__init__.py 作用
- init 的前后各有两个英文的下划线
- 将一个普通的文件夹变成一个包
- 导入包实际上是导入了
__init__.py
包的使用
要导入包中的模块,可以使用点号 .
语法。
import package.module
包的使用和模块的使用类似,也可以导入包中的部分模块,部分函数等。
五、标准模块
Python 标准库中包含了许多内置的模块,提供了各种功能,包括文件操作、日期时间处理、数学计算等。
os
os
模块提供了与操作系统交互的功能,可以用于文件和目录操作、进程管理等。它包含了许多方法,可以让你执行诸如文件路径操作、文件管理、进程管理等任务。
常用函数:
os.getcwd()
: 获取当前工作目录。os.chdir(path)
: 改变当前工作目录到指定路径。os.listdir(path)
: 返回指定目录下的所有文件和目录的列表。os.mkdir(path)
: 创建一个目录。os.makedirs(path)
: 递归创建多层目录。os.remove(path)
: 删除一个文件。os.rmdir(path)
: 删除指定目录(仅限空目录)。os.removedirs(path)
: 递归删除多层目录。os.path.exists(path)
: 判断指定路径(文件或目录)是否存在。os.path.isfile(path)
: 判断指定路径是否为文件。os.path.isdir(path)
: 判断指定路径是否为目录。
import os
# 获取当前工作目录
current_dir = os.getcwd()
print("当前工作目录:", current_dir)
# 创建目录
new_dir = os.path.join(current_dir, "new_directory")
os.mkdir(new_dir)
print("新目录已创建:", new_dir)
# 列出当前目录下的文件和目录
files_and_dirs = os.listdir(current_dir)
print("当前目录下的文件和目录:", files_and_dirs)
# 删除目录
os.rmdir(new_dir)
print("目录已删除:", new_dir)
# 判断文件是否存在
file_path = os.path.join(current_dir, "example.txt")
file_exists = os.path.exists(file_path)
print("文件是否存在:", file_exists)
os
模块提供了丰富的功能,可以方便地进行文件和目录操作,适用于文件管理、路径处理等各种场景。
time
time
模块提供了处理时间的功能,包括获取当前时间、时间格式化、时间延迟等操作。它是与操作系统时间相关的一个底层模块,可以用于执行时间相关的任务。
常用函数:
time.time()
: 返回当前时间的时间戳(自1970年1月1日午夜开始的秒数)。time.localtime([secs])
: 将一个时间戳转换为本地时间的 struct_time。如果没有给定时间戳,将会使用当前时间。time.strftime(format, [t])
: 格式化 struct_time(或表示UTC时间的时间元组)为指定格式的字符串。time.sleep(secs)
: 暂停程序执行指定秒数。time.process_time()
: 返回当前进程执行 CPU 时间的累计秒数。
示例用法:
import time
# 获取当前时间戳
timestamp = time.time()
print("当前时间戳:", timestamp)
# 将时间戳转换为本地时间
local_time = time.localtime(timestamp)
print("本地时间:", local_time)
# 格式化时间
formatted_time = time.strftime("%Y-%m-%d %H:%M:%S", local_time)
print("格式化时间:", formatted_time)
# 暂停程序执行 2 秒
print("开始暂停")
time.sleep(2)
print("暂停结束")
# 计算程序执行 CPU 时间
start_time = time.process_time()
for _ in range(1000000):
pass
end_time = time.process_time()
print("程序执行 CPU 时间:", end_time - start_time, "秒")
math
math
模块提供了一组数学函数,包括常用的数学运算、三角函数、指数函数、对数函数等。这些函数能够帮助你进行各种数学计算和操作。
常用函数:
math.sqrt(x)
: 返回 x 的平方根。math.pow(x, y)
: 返回 x 的 y 次幂。math.exp(x)
: 返回 e 的 x 次幂。math.log(x, base)
: 返回以 base 为底的 x 的对数。math.sin(x)
,math.cos(x)
,math.tan(x)
: 返回 x 的正弦、余弦、正切值。math.radians(x)
,math.degrees(x)
: 将角度 x 转换为弧度制或将弧度 x 转换为角度制。math.pi
,math.e
: 圆周率和自然对数的底。
示例用法:
import math
# 计算平方根
sqrt_value = math.sqrt(25)
print("25 的平方根:", sqrt_value)
# 计算指数
exp_value = math.exp(2)
print("e 的平方:", exp_value)
# 计算对数
log_value = math.log(8, 2)
print("以 2 为底 8 的对数:", log_value)
# 计算三角函数值
sin_value = math.sin(math.radians(30))
cos_value = math.cos(math.pi)
tan_value = math.tan(math.radians(45))
print("30 度的正弦值:", sin_value)
print("π 的余弦值:", cos_value)
print("45 度的正切值:", tan_value)