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时被执行了。
三、包与模块
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 声明。