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

相关推荐
哥本哈士奇(aspnetx)12 小时前
Streamlit + LangChain 1.0 简单实现智能问答前后端
python·大模型
我一定会有钱12 小时前
斐波纳契数列、end关键字
python
亚马逊云开发者12 小时前
Q CLI 助力合合信息实现 Aurora 的升级运营
人工智能
全栈胖叔叔-瓜州13 小时前
关于llamasharp 大模型多轮对话,模型对话无法终止,或者输出角色标识User:,或者System等角色标识问题。
前端·人工智能
小鸡吃米…13 小时前
Python 列表
开发语言·python
坚果派·白晓明14 小时前
AI驱动的命令行工具集x-cmd鸿蒙化适配后通过DevBox安装使用
人工智能·华为·harmonyos
GISer_Jing14 小时前
前端营销技术实战:数据+AI实战指南
前端·javascript·人工智能
Dekesas969514 小时前
【深度学习】基于Faster R-CNN的黄瓜幼苗智能识别与定位系统,农业AI新突破
人工智能·深度学习·r语言
星依网络14 小时前
yolov5实现游戏图像识别与后续辅助功能
python·开源·游戏程序·骨骼绑定
大佐不会说日语~15 小时前
Spring AI Alibaba 的 ChatClient 工具注册与 Function Calling 实践
人工智能·spring boot·python·spring·封装·spring ai