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

相关推荐
用户5191495848452 小时前
Paytium WordPress插件存储型XSS漏洞深度分析
人工智能·aigc
weixin_433417672 小时前
PyTorch&TensorFlow
人工智能·pytorch·tensorflow
努力努力再努力wz2 小时前
【C++进阶系列】:万字详解智能指针(附模拟实现的源码)
java·linux·c语言·开发语言·数据结构·c++·python
XZSSWJS2 小时前
深度学习基础-Chapter 02-Softmax与交叉熵
人工智能·深度学习
牟同學3 小时前
从赌场到AI:期望值如何用C++改变世界?
c++·人工智能·概率论
听风吹等浪起3 小时前
分类算法-逻辑回归
人工智能·算法·机器学习
许泽宇的技术分享3 小时前
让AI说“人话“:TypeChat.NET如何用强类型驯服大语言模型的“野性“
人工智能
小蕾Java3 小时前
Python详细安装教程(附PyCharm使用)
开发语言·python·pycharm
IT_陈寒3 小时前
Python性能优化:用这5个鲜为人知的内置函数让你的代码提速50%
前端·人工智能·后端