【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 声明。

相关推荐
IT_陈寒8 分钟前
Python性能提升50%:这5个隐藏技巧让你的代码快如闪电⚡
前端·人工智能·后端
程序员三藏28 分钟前
软件测试之压力测试详解
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·压力测试
BINGCHN38 分钟前
流量分析进阶(一):RCTF2025-Shadows of Asgard
开发语言·python
GeekPMAlex1 小时前
Python SQLite多线程、上下文管理器与生成器全面解析
python
AI大模型学徒1 小时前
NLP基础(九)_N-gram模型
人工智能·自然语言处理·nlp·n-gram
顾安r1 小时前
11.22 脚本 手机termux项目分析(bash)
前端·python·stm32·flask·bash
极客BIM工作室1 小时前
理清 BERT 中 [CLS] 向量的核心逻辑:训练双向更新与推理作用不矛盾
人工智能·机器学习·bert
IT·小灰灰1 小时前
基于Python的机器学习/数据分析环境搭建完全指南
开发语言·人工智能·python·算法·机器学习·数据分析