【Python与AI基础】Python编程基础:模块和包

www.bilibili.com/video/BV1oe...

一、基本介绍

当函数或类等代码块保存于不同的源文件中(xxx.py这类源文件称之为模块),所有保存源文件的目录(包含init.py),称之为包。

1、包(目录)

2、模块(源文件)

3、函数、类或模块级变量

在同一个模块文件中,要调用该模块中的函数或类等,直接调用即可,不存在包或者模块的导入问题。 但是,如果要在别的模块文件中引用,则需要使用import进行导入。

二、构建源码

1、在basic包下创建源文件modulea.py
python 复制代码
def test_01():
    print("这是一个没有参数没有返回值的函数")
def test_02(a, b):
    result = a+b
    print(result)
def test_03(a, b):
    result = a+b
    return result
def test_04(func):
    print(func.__name__)
test_01()
2、在basic包下创建源文件moduleb.py
bash 复制代码
def test():
    print("Hello Module")
test()
# import function     # 当导入一个模块的时候,事实上是将该模块的源代码直接执行了一遍
# 导入到模块级,调用时,用 模块.函数 的方式进行调用
import modulea
modulea.test_01()

运行moduleb.py,结果如下:

复制代码
这是一个没有参数没有返回值的函数
这是一个没有参数没有返回值的函数

我们可以看到,test_01()被执行了两次,那是因为在moduela.py中,也存在调用test_01()函数的代码,在import时被执行了。

三、包与模块

1、改造moduela.py

ini 复制代码
# 为了防止别的模块在导入时重复执行以下代码,必须添加一个判断条件:
# 其本质就是判断当前代码是否在当前模块中直接运行,还是在其他模块中被导入时运行的
if __name__ == '__main__':
    test_01()
    test_04(test_02)

此时,再执行moduleb.py,test01()函数只会执行一次, 而modulea.py中的test 01()虽然也被调用,但是在 if name == '__main**': 的条件中进行的调用,所以不会被执行。此时发生了什么?

markdown 复制代码
# 当在当前模块中打印__name__魔术变量时,其值为 __main__ (字符串)
# 如果在其他模块中引用当前模块,则打印的__name__为当前模块的真实模块名称,而非 __main__
# print(__name__)

2、包与模块的导入

python 复制代码
# 导入到模块级,调用时,用 模块.函数 的方式进行调用
import modulea
modulea.test_01()
import random
random.choice([1,2,3,4])
# 通过from...import...导入到函数级,那么直接在代码中调用函数即可
from modulea import test_01
test_01()
from random import choice
print(choice([1,2,3,4,5]))
# 通常情况下,在同一个包下,可以不需要在 导入 时明确声明包名,但是,建议无论在何种情况下,把包名加上
# 直接使用 import 只能到 模块级,不能到函数或类级
import basic.modulea
basic.modulea.test_01()
from basic import modulea
modulea.test_01()
# 如果要直接导入到函数或类级,则必须使用 from ... import ...
from basic.modulea import test_01
test_01()

四、模块级变量

1、定义模块级变量

模块级变量是指在模块中与函数同级,可以被当前模块中的其他函数直接引用,在modulea.py中,添加两个模块级变量,并修改test_01()函数

ini 复制代码
# 定义模块级变量(直接隶属于当前模块,与函数或类同级,可以被其他函数直接引用)
source = "模块级变量"
list = [11,22,33,44,55]
def test_01():
    print("这是一个没有参数没有返回值的函数")
    global source   # 使用global声明为全局变量后,才可以正确引用到模块级的全局变量
    source = "Hello Module - Variable"
    # global list
    # list = [1,2,3]
    list.append(66)
2、在moduleb.py中调用
scss 复制代码
import modulea
modulea.test_01()    # 运行moduela.test_01()后,模块级变量source和list的值被修改
print(modulea.source)
print(modulea.list)

针对字符串或数值等模块级变量,在函数体中要对其值进行修改,则必须使用 global 关键字进行声明,而针对列表或字典类数据,如果不是全部修改,而是更新类操作,则可以不使用 global 声明。

相关推荐
u1301304 分钟前
AI 日报(2026年10月17日)
人工智能
Teable任意门互动4 分钟前
项目管理数字化落地案例|任意门互动科技(Teable 官方合作伙伴)以多维表格搭建项目管理平台
人工智能·开源·软件工程·飞书·开源软件·数据库开发
余槐i4 分钟前
transformers 升级后加载旧权重报错:三处不兼容如何逐一验证
python·大模型·transformers·模型量化·模型推理
这张生成的图像能检测吗10 分钟前
(论文速读)CurveNet:沿点云学习几何曲线,让局部特征看见长距离形状
人工智能·计算机视觉·点云·3d技术
AI模型调用笔记15 分钟前
OpenAI API 故障切换:超时容灾三大坑
人工智能·语言模型
TMT星球20 分钟前
2026阅文创作大会:首批AI精品动画亮相,推出OPC一站式平台与IP委员会模式
人工智能·网络协议·tcp/ip
YHHLAI28 分钟前
造一个“读过《天龙八部》“的 AI 助手 —— advance-rag
人工智能·rag
MobotStone33 分钟前
那些藏在AI应用工具里的「专家」,到底能帮我们干什么?
人工智能
项目題供诗36 分钟前
ai大模型(二)
人工智能
CCblandy41 分钟前
向量检索 ANN 参数实测:换一种数据分布,recall 掉了 51 个百分点
人工智能·python·算法·自然语言处理·性能优化