跳至主要內容

模块与包

blacklad大约 7 分钟PythonPython

模块与包

在 Python 中,模块是一种组织代码的方式。

一、介绍

一个模块可以包含变量、函数等。通过将相关的代码放入模块中,可以更好地组织代码并实现代码的复用性。模块的文件名通常以 .py 为扩展名。

这里可以想一下,函数是对一些代码的组合,模块是对一些函数变量的组合。

特点

  1. 重用代码: 模块提供了代码重用的机制,可以在不同的地方调用相同的功能。
  2. 维护性好: 将功能相关的代码放在一个模块中,有助于代码的维护和管理。

二、使用

模块类型

  1. 标准模块,Python自带的模块,如 osmath 等。
  2. 第三方模块,可以通过工具安装的第三方库,如 numpypandas 等。
  3. 自定义的模块,开发者自己编写的模块,用于自己的项目中。

模块的调用

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 作用

  1. init 的前后各有两个英文的下划线
  2. 将一个普通的文件夹变成一个包
  3. 导入包实际上是导入了 __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)
上次编辑于:
贡献者: blacklad