Python核心语法——模块
一、什么是模块有什么用模块module一个.py文件就是一个模块模块是 Python 程序的基本组织单位。在模块中可以定义变量、函数、类以及可执行的代码。作用提高代码复用性降低开发门槛避免命名冲突原课件核心表述模块就是一个 python 文件 (.py)其中就包含了变量、函数、类以及可执行的代码。作用提高代码复用性降低开发门槛二、导入模块的常用语法在使用模块中提供的功能之前必须得先导入再使用。导入模块的具体语法如下导入语句一般写在.py文件的开头导入形式代码样例调用方式调用方式import模块名import random, os模块名.功能名random.randint(10, 100)import模块名as别名import random as rd别名.功能名rd.randint(10, 100)from模块名import功能名from random import randint,choice功能名randint(10, 100)from模块名import功能名as别名from random import randint as rint别名rint(10, 100)from模块名import *from random import *功能名randint(10, 100)2.1 基础导入示例假设我们有一个自定义模块circle_fun.py其中定义与圆相关的常量和函数# circle_fun.py PI 3.14159 def circle_area(radius): 计算圆的面积 return PI * radius * radius def circle_perimeter(radius): 计算圆的周长 return 2 * PI * radius在main.py中我们可以使用不同的导入方式调用这些功能# main.py - 方式1import 模块名 import circle_fun print(circle_fun.PI) # 3.14159 print(circle_fun.circle_area(5)) # 78.53975# main.py - 方式2from 模块名 import 功能名 from circle_fun import PI, circle_area print(PI) # 3.14159 print(circle_area(5)) # 78.53975# main.py - 方式3from 模块名 import *谨慎使用 from circle_fun import * print(PI) # 3.14159 print(circle_perimeter(5)) # 31.4159三、自定义模块当开发一些复杂的项目为了让项目结构更清晰更便于项目的维护管理及代码的复用可能会把一个项目拆分为若干个模块。3.1 模块级特殊变量__all__与__name__3.1.1__all____all__是一个模块级别的特殊变量用于指定from 模块名 import *时会导入哪些功能*通配了哪些功能。示例在circle_fun.py中限制import *只导入circle_area和PI而不导入circle_perimeter。# circle_fun.py带 __all__ __all__ [PI, circle_area] # 仅这两个会通过 import * 被导入 PI 3.14159 def circle_area(radius): return PI * radius * radius def circle_perimeter(radius): return 2 * PI * radius然后在main.py中from circle_fun import * print(PI) # 正常 print(circle_area(5)) # 正常 # print(circle_perimeter(5)) # 报错NameError因为未导入3.1.2__name____name__是 Python 中非常重要的内置变量表示的是当前模块的名称当模块直接运行时__name__的值为__main__当模块被导入时__name__等于模块的文件名不含.py后缀典型用法在模块中添加测试代码仅在直接运行时执行。# circle_fun.py PI 3.14159 def circle_area(radius): return PI * radius * radius def circle_perimeter(radius): return 2 * PI * radius # 测试代码仅当直接运行此模块时执行 if __name__ __main__: print(测试半径5的圆面积 , circle_area(5)) print(测试半径5的圆周长 , circle_perimeter(5))当你直接运行python circle_fun.py时测试代码会执行当其他模块导入它时测试代码不会运行保证了模块的纯净性。四、软件包Package包本质就是一个文件夹该文件夹中可以包含若干 Python 模块.py文件文件夹下还包含了一个__init__.py。作用模块文件较多时用来管理多个模块。包的本质也是一个模块4.1 包的结构示例utils/ # 包名 __init__.py # 标识这是一个包 math_utils.py # 数学相关模块 string_utils.py # 字符串相关模块 __all__ [my_fun, my_var] # 可在 __init__.py 中控制 import *__init__.py的作用标识这是一个包而不是普通的文件夹控制在import *时导入的模块列表通过__all__变量4.2 导入包的方式导入形式代码样例调用方式调用方式import包名.模块名import utils.my_fun包名.模块名.功能名utils.my_fun.log_separator1()from包名import模块名from utils import my_fun模块名.功能名my_fun.log_separator1()from包名import *from utils import *模块名.功能名my_fun.log_separator1()from包名.模块名import功能名from utils.my_fun import log_separator1功能名log_separator1()from包名.模块名import *from utils.my_fun import *功能名log_separator1()代码示例假设utils/math_utils.py内容如下# utils/math_utils.py def add(a, b): return a b def sub(a, b): return a - butils/__init__.py中控制导入行为# utils/__init__.py __all__ [math_utils, string_utils] # 允许 from utils import * 导入这两个模块在main.py中使用# 方式1import 包名.模块名 import utils.math_utils print(utils.math_utils.add(3, 5)) # 8 # 方式2from 包名 import 模块名 from utils import math_utils print(math_utils.sub(10, 4)) # 6 # 方式3from 包名 import *需 __init__.py 中定义 __all__ from utils import * print(math_utils.add(2, 3)) # 5 # 方式4from 包名.模块名 import 功能名 from utils.math_utils import add print(add(100, 200)) # 300五、总结与最佳实践概念说明模块一个.py文件封装变量、函数、类包一个包含__init__.py的文件夹用于组织多个模块导入原则尽量使用import 模块或from 模块 import 具体功能避免使用import *除非明确用__all__控制__name__用于区分模块是直接运行还是被导入常用于测试代码的隔离__all__精细控制import *的可见范围提升接口清晰度通过合理划分模块和包我们可以构建出结构清晰、易于维护的大型 Python 项目。现在就动手创建你的第一个自定义模块吧