作者:billy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
自定义模块
通过前面的学习,我们知道对于 Python 代码可以写在一个文件中。但是随着程序不但变大,为了便于维护,需要将其分为多个文件,这样可以提高代码的可维护性。在 Python 中,一个扩展名为 .py 的文件就称为一个模块。通常情况下,我们把能够实现某一特定功能的代码放置在一个文件中作为一个模块,从而方便其他程序和脚本导入并使用。
另外,使用模块可以提高代码的可重用性,即编写好一个模块后,只要是实现该功能的程序,都可以导入这个模块实现。使用模块还可以避免函数名和变量名冲突。
创建模块
创建模块可以将模块中相关的代码(变量定义和函数定义等)编写在一个单独的文件中,并且将改文件命名为 “模块名 + .py” 的形式
创建模块时,设置的模块名不能是 Python 自带的标准模块名称,且模块文件的扩展名必须是 .py。
创建一个用于根据身高体重计算 BMI 指数的模块,命名为 bmi.py。代码如下:
def fun_bmi(person, height, weight):
'''
功能: 根据身高和体重计算 BMI 指数
:param person: 姓名
:param height: 身高,单位:米
:param weight: 体重,单位:千克
:return: 无
'''
print(person + "的身高: " + str(height) + "米\t体重: " + str(weight) + "千克")
bmi = weight/(height*height)
print(person + "的 BMI 指数为: " + str(bmi))
导入模块
创建模块后,就可以在其他程序中使用该模块了。可以使用 import 语句实现导入,语法如下:
import moduleName [as alias]
其中,moduleName 为要导入模块的名称,[as alias] 为给模块起的别名,通过该别名也可以使用模块;
示例:
import bmi
bmi.fun_bmi("芽衣", 1.75, 60)
import bmi as m
m.fun_bmi("丝幂", 1.69, 50)
上述例子的运行结果为:
芽衣的身高: 1.75米 体重: 1.2千克
芽衣的 BMI 指数为: 0.39183673469387753
丝幂的身高: 1.69米 体重: 50千克
丝幂的 BMI 指数为: 17.506389832288786
在使用 import 语句导入模块时,每执行一条 import 语句都会创建一个新的命名空间(namespace),并且在该命名空间中执行与 .py 文件相关的所有语句。在执行时,需要在具体的变量、函数和类名前加上 “模块名.” 前缀。如果不想在每次导入模块时都创建一个新的命名空间,而是将具体的定义导入当前的命名空间中,这时可以使用 from…import 语句;
from bmi import fun_bmi# 导入 bmi 模块的 fun_bmi 函数
from bmi import *# 导入 bmi 模块的全部定义
fun_bmi("芽衣", 1.75, 60)# 可以直接调用,不再需要前缀
当导入两个模块中包含同名函数时,使用 from…import 会发生冲突,可以通过 import + 别名的方式来避免
示例:
# rectangle.py
def girth(width, height):
'''
功能:计算矩形周长
:param width: 宽度
:param height: 高度
:return: 矩形周长
'''
return (width + height) * 2
# circle.py
import math
PI = math.pi
def grith(r):
'''
功能: 计算圆的周长
:param r: 半径
:return: 圆的周长
'''
return round(2 * PI * r, 2)# 计算周长并保留两位小数
import rectangle as r
import circle as c
print("圆形的周长为:", c.girth(10))
print("矩形的周长为:", r.girth(20, 10))
模块搜索目录
当使用 import 语句导入模块时,默认情况下,会按照以下顺序进行查找:
1)在当前目录(即执行的 Python 脚本文件所在目录)下查找;
2)到 PYTHONPATH(环境变量)下的每个目录中查找;
3)到 Python 的默认安装目录下查找;
Python 中的包
使用模块可以避免函数名和变量名重名引起的冲突。那么,如果模块名重复应该怎么办呢?在 Python 中,提出了包(Package)的概念。包是一个分层次的目录结构,它将一组功能相近的模块组织在一个目录下。这样,既可以起到规范代码的作用,又能避免模块名重名引起的冲突。
包简单理解就是 “文件夹”,只不过在该文件夹下必须存在一个名称为 “__init__.py” 的文件。在 __init__.py 文件中,可以不编写任何代码,也可以编写一些 Python 代码。在 __init__.py 文件中所编写的代码,在导入包时会自动执行。
在每个模块的定义中都包括一个记录模块名的变量 __name__,程序可以检查该变量,以确定它们在哪个模块中执行。如果一个模块不是被导入其他程序中执行,那么它可能在解释器的顶级模块中执行。顶级模块的 __name__ 变量的值为 __main__;
引用其他模块
在 Python 红,自带了很多实用的模块,称为标准模块(也可以称为标准库),对于标准模块,我们可以直接使用 import 语句导入 Python 文件中使用。Python 提供了 200 多个内置的标准模块,涵盖了 Python 运行时服务、文字模式匹配、操作系统接口、数学运算、对象永久保存、网络和 Internet 脚本和 GUI 建构等方面。Python 常用的内置标准模块如下表所示:
模块名
描述
sys
与 Python 解释器及其环境操作相关的标准库
time
提供与时间相关的各种函数的标准库
os
提供了访问操作系统服务功能的标准库
calendar
提供与日期相关的各种函数的标准库
urllib
用于读取来自网上(服务器上)的数据的标准库
json
用于使用 JSON 序列化和反序列化对象
re
用于在字符串中执行正则表达式匹配和替换
math
提供标准算术运算函数的标准库
decimal
用于进行精确控制运算精度、有效数位和四舍五入操作的十进制运算
shutil
用于进行高级文件操作,如复制、移动和重命名等
logging
提供了灵活的记录事件、错误、警告和调试信息等日志信息的功能
tkinter
使用 Python 进行 GUI 编程的标准库
在进行 Python 程序开发时,除了可以使用 Python 内置的标准模块外,还有很多第三方模块可以使用。这些第三方模块可以在 Python 官方退出的 http://pypi.python.org/pypi 中找到。
在使用第三方模块前,需要先下载并安装该模块,然后就可以像使用标准模块一样导入并使用了。下载和安装第三方模块可以通过 pip 命令实现,语法如下:
pip [moduleName]
command 用于指定要执行的命令,常用的参数值有 install(用于安装第三方模块)、uninstall(用于卸载已经安装的第三方模块)、list(用于显示已经安装的第三方模块)等等。