Python 模块

Python提供了强大的模块支持,主要体现为不仅在Python标准库中包含了大量的模块(称为标准模块),而且还有很多第三方模块,另外开发者自己也可以开发自定义模块。通过这些强大的模块支持将极大地提高我们的开发效率。

8.1 模块概述

在Python中,一个扩展名为“.py”的文件就称之为一个模块。

通常情况下,我们把能够实现某一特定功能的代码放置在一个文件中作为一个模块,从而方便其他程序和脚本导入并使用。另外,使用模块也可以避免函数名和变量名冲突。

8.2 自定义模块
在Python中,自定义模块有两个作用:一个是规范代码,让代码更易于阅读,另一个是方便其他程序使用已经编写好的代码,提高开发效率。
实现自定义模块主要分为两部分,一部分是创建模块,另一部分是导入模块。

8.2.1 创建模块
创建模块时,可以将模块中相关的代码(变量定义和函数定义等)编写在一个单独的文件中,并且将该文件命名为“模块名+.py”的形式。

注意:创建模块时,设置的模块名不能是Python自带的标准模块名称。

下面通过一个具体的实例演示如何创建模块。
实例01 创建计算BMI指数的模块
创建一个用于根据身高、体重计算BMI指数的模块,命名为bmi.py,其中bmi为模块名,.py为扩展名。关键代码如下:

01 def fun_bmi(person,height,weight):

02     '''功能:根据身高和体重计算BMI指数

03        person:姓名

04        height:身高,单位:米

05        weight:体重,单位:千克

06     '''

07     print(person + "的身高:" + str(height) + "米 \t 体重:" + str(weight) + "千克")

08     bmi=weight/(height*height) # 用于计算BMI指数,公式为:BMI=体重/身高的平方

09     print(person + "的BMI指数为:"+str(bmi)) # 输出BMI指数

10     # 此处省略了显示判断结果的代码

11 def fun_bmi_upgrade(*person):

12     '''功能:根据身高和体重计算BMI指数(升级版)

13        *person:可变参数该参数中需要传递带3个元素的列表,

14        分别为姓名、身高(单位:米)和体重(单位:千克)

15     '''

16     # 此处省略了函数主体代码

注意:模块文件的扩展名必须是“.py”。

8.2.2 使用import语句导入模块
创建模块后,就可以在其他程序中使用该模块了。要使用模块需要先以模块的形式加载模块中的代码,这可以使用import语句实现。import语句的基本语法格式如下:

import modulename [as alias]

其中,modulename为要导入模块的名称;[as alias]为给模块起的别名,通过该别名也可以使用模块。

在该文件中,导入模块bmi,并且执行该模块中的fun_bmi()函数,代码如下:

import bmi # 导入bmi模块

bmi.fun_bmi("尹一伊",1.75,120) # 执行模块中的fun_bmi()函数

说明:在调用模块中的变量、函数或者类时,需要在变量名、函数名或者类名前添加“模块名.”作为前缀。

例如,上面代码中的bmi.fun_bmi,表示调用bmi模块中的fun_bmi()函数。

多学两招:如果模块名比较长不容易记住,可以在导入模块时,使用as关键字为其设置一个别名,然后就可以通过这个别名来调用模块中的变量、函数和类等。

例如,将上面导入模块的代码修改为以下内容:import bmi as m # 导入bmi模块并设置别名为m

然后,在调用bmi模块中的fun_bmi()函数时,可以使用下面的代码:m.fun_bmi("尹一伊",1.75,120) # 执行模块中的fun_bmi()函数

使用import语句还可以一次导入多个模块,在导入多个模块时,模块名之间使用逗号“,”进行分隔。

import bmi,tips,differenttree

8.2.3 使用from…import语句导入模块
在使用import语句导入模块时,每执行一条import语句都会创建一个新的命名空间(namespace),并且在该命名空间中执行与.py文件相关的所有语句。在执行时,需在具体的变量、函数和类名前加上“模块名.”前缀。如果不想在每次导入模块时都创建一个新的命名空间,而是将具体的定义导入到当前的命名空间中,这时可以使用from…import语句。使用from…import语句导入模块后,不需要再添加前缀,直接通过具体的变量、函数和类名等访问即可。说明:命名空间可以理解为记录对象名字和对象之间对应关系的空间。目前Python的命名空间大部分都是通过字典(dict)来实现的。其中,key是标识符;value是具体的对象。例如,key是变量的名字,value则是变量的值。
from…import语句的语法格式如下:from modelname import member
参数说明:■ modelname:模块名称,区分字母大小写,需要和定义模块时设置的模块名称的大小写保持一致。■ member:用于指定要导入的变量、函数或者类等。可以同时导入多个定义,各个定义之间使用逗号“,”分隔。如果想导入全部定义,也可以使用通配符星号“*”代替。

多学两招:在导入模块时,如果使用通配符“*”导入全部定义后,想查看具体导入了哪些定义,可以通过显示dir()函数的值来查看。

from bmi import fun_bmi # 导入bmi模块的fun_bmi函数from bmi import fun_bmi,fun_bmi_upgrade # 导入bmi模块的fun_bmi和fun_bmi_upgrade函数from bmi import * # 导入bmi模块的全部定义(包括变量和函数)

注意:在使用from…import语句导入模块中的定义时,需要保证所导入的内容在当前的命名空间中是唯一的,否则将出现冲突,后导入的同名变量、函数或者类会覆盖先导入的。这时就需要使用import语句进行导入。

8.2.4 模块搜索目录
当使用import语句导入模块时,默认情况下,会按照以下顺序进行查找。
(1)在当前目录(即执行的Python脚本文件所在目录)下查找。
(2)到PYTHONPATH(环境变量)下的每个目录中查找。
(3)到Python的默认安装目录下查找。
以上各个目录的具体位置保存在标准模块sys的sys.path变量中。可以通过以下代码输出具体的目录。

import sys # 导入标准模块

sysprint(sys.path) # 输出具体目录

注意:使用import语句导入模块时,模块名是区分字母大小写的。

可以通过以下3种方式添加指定的目录到sys.path中。

1.临时添加
临时添加即在导入模块的Python文件中添加。例如,需要将“E:\program\Python\Code\demo”目录添加到sys.path中,可以使用下面的代码:import sys # 导入标准模块syssys.path.append('E:/program/Python/Code/demo')
执行上面的代码后,再输出sys.path的值,将得到以下结果:['E:\\program\\Python\\Code', 'G:\\Python\\Python38\\Python38.zip', 'G:\\Python\\Python38\\DLLs', 'G:\\Python\\Python38\\lib', 'G:\\Python\\Python38', 'G:\\Python\\Python38\\lib\\site-packages', 'E:/program/Python/Code/demo']
在上面的结果中,红字部分为新添加的目录。

说明:通过该方法添加的目录只在执行当前文件的窗口中有效,窗口关闭后即失效。

2.增加.pth文件(推荐)
在Python安装目录下的Lib\site-packages子目录中(例如,笔者的Python安装在G:\Python\Python38目录下,那么该路径为G:\Python\Python38\Lib\site-packages),创建一个扩展名为.pth的文件,文件名任意。这里创建一个mrpath.pth文件,在该文件中添加要导入模块所在的目录。例如,将模块目录“E:\program\Python\Code\demo”添加到mrpath.pth文件,添加后的代码如下:# .pth文件是创建的路径文件(这里为注释)E:\program\Python\Code\demo

注意:创建.pth文件后,需要重新打开要执行的导入模块的Python文件,否则新添加的目录不起作用。

说明:通过该方法添加的目录只在当前版本的Python中有效。

3.在PYTHONPATH环境变量中添加
打开“环境变量”对话框(具体方法请参见1.4.1小节),如果没有PYTHONPATH系统环境变量,则需要先创建一个,否则直接选中PYTHONPATH变量,再单击“编辑”按钮,并且在弹出对话框的“变量值”文本框中添加新的模块目录,目录之前使用逗号进行分隔。例如,创建系统环境变量PYTHONPATH,并指定模块所在目录为“E:\program\Python\Code\demo;”

注意:在环境变量中添加模块目录后,需要重新打开要执行的导入模块的Python文件,否则新添加的目录不起作用。

说明:通过该方法添加的目录可以在不同版本的Python中共享。

8.3 以主程序的形式执行

首先定义一个全局变量,然后创建一个名称为fun_christmastree()的函数,最后再通过print()函数输出一些内容。代码如下:

pinetree = '我是一棵松树' # 定义一个全局变量(松树)

def fun_christmastree(): # 定义函数    '''功能:一个梦       无返回值    '''    

pinetree = '挂上彩灯、礼物……我变成一棵圣诞树 @^.^@ \n' # 定义局部变量    

print(pinetree) # 输出局部变量的值
# *****************************函数体外*********************************** #

print('\n下雪了……\n')

print('=============== 开始做梦…… =============\n')

fun_christmastree() # 调用函数

print('=============== 梦醒了…… ===============\n')

pinetree = '我身上落满雪花,' + pinetree + ' -_- ' # 为全局变量赋值

print(pinetree) # 输出全局变量的值
在与christmastree模块同级的目录下,创建一个名称为main.py的文件,在该文件中,导入christmastree模块,再通过print()语句输出模块中的全局变量pinetree的值,代码如下:

import christmastree # 导入christmastree模块

print("全局变量的值为:",christmastree.pinetree)
执行上面的代码,将显示如图结果

5c572e0bc0794ab6b9559de1de7bdab9.png

 导入模块后,不仅输出了全局变量的值,而且模块中原有的测试代码也被执行了。这个结果显然不是我们想要的。那么如何只输出全局变量的值呢?实际上,可以在模块中,将原本直接执行的测试代码放在一个if语句中。因此,可以将模块christmastree的代码修改为以下内容:

pinetree = '我是一棵松树' # 定义一个全局变量(松树)

def fun_christmastree(): # 定义函数    '''功能:一个梦
       无返回值    '''    

pinetree = '挂上彩灯、礼物……我变成一棵圣诞树 @^.^@ \n' # 定义局部变量赋值    

print(pinetree) # 输出局部变量的值# *************************判断是否以主程序的形式运行************************* #if __name__ == '__main__':    

print('\n下雪了……\n')    

print('=============== 开始做梦…… =============\n')    

fun_christmastree() # 调用函数    

print('=============== 梦醒了…… ===============\n')    

pinetree = '我身上落满雪花,' + pinetree + ' -_- ' # 为全局变量赋值    

print(pinetree) # 输出全局变量的值
再次执行导入模块的main.py文件,将显示如图结果。从执行结果中可以看出测试代码并没有执行

2d9ccd1b5d264d44a594b145b2020695.png

 说明:在每个模块的定义中都包括一个记录模块名称的变量__name__,程序可以检查该变量,以确定它们在哪个模块中执行。如果一个模块不是被导入到其他程序中执行,那么它可能在解释器的顶级模块中执行。顶级模块的__name__变量的值为__main__。

8.4 Python中的包
使用模块可以避免函数名和变量名重名引发的冲突。那么,如果模块名重复应该怎么办呢?在Python中,提出了包(Package)的概念。包是一个分层次的目录结构,它将一组功能相近的模块组织在一个目录下。

说明:包简单理解就是“文件夹”,只不过在该文件夹下必须存在一个名称为“__init__.py”的文件。

8.4.1 Python程序的包结构
在实际项目开发时,通常情况下,会创建多个包用于存放不同类的文件。例如,开发一个网站时,可以创建如图所示的包结构。

529c1090143c48eea039f3b3da41f3ed.png

 

说明:在图中,先创建一个名称为shop的项目,然后在该包下又创建了admin、home和templates 3个包和一个manager.py的文件,最后在每个包中,又创建了相应的模块。

8.4.2 创建和使用包

1.创建包
创建包实际上就是创建一个文件夹,并且在该文件夹中创建一个名称为“__init__.py”的Python文件。在__init__.py文件中,可以不编写任何代码,也可以编写一些Python代码。在__init__.py文件中所编写的代码,在导入包时会自动执行。说明:__init__.py文件是一个模块文件,模块名为对应的包名。例如,在settings包中创建的__init__.py文件,对应的模块名为settings。
例如,在E盘根目录下,创建一个名称为settings的包,可以按照以下步骤进行:
(1)计算机的E盘根目录下,创建一个名称为settings的文件夹。
(2)在IDLE中,创建一个名称为“__init__.py”的文件,保存在E:\settings文件夹下,并且在该文件中不写任何内容,然后再返回到资源管理器中

至此,名称为settings的包创建完毕了,创建完毕之后便可以在该包中创建所需的模块了。

2.使用包
创建包以后,就可以在包中创建相应的模块,然后再使用import语句从包中加载模块。从包中加载模块通常有以下3种方式:

■ 通过“import + 完整包名 + 模块名”形式加载指定模块
“import + 完整包名 + 模块名”形式是指:假如有一个名称为settings的包,在该包下有一个名称为size的模块,那么要导入size模块,可以使用下面的代码:import settings.size
通过该方式导入模块后,在使用时需要使用完整的名称。例如,在已经创建的settings包中创建一个名称为size的模块,并且在该模块中定义两个变量,代码如下:width = 800 # 宽度height = 600 # 高度
这时,通过“import + 完整包名 + 模块名”形式导入size模块后,在调用width和height变量时,就需要在变量名前加入“settings.size.”前缀。对应的代码如下:import settings.size # 导入settings包下的size模块if __name__=='__main__':    print('宽度:',settings.size.width)    print('高度:',settings.size.height)
执行上面的代码后,将显示以下内容:宽度: 800高度: 600

■ 通过“from + 完整包名 + import + 模块名”形式加载指定模块
“from + 完整包名 + import + 模块名”形式是指:假如有一个名称为settings的包,在该包下有一个名称为size的模块,那么要导入size模块,可以使用下面的代码:from settings import size
通过该方式导入模块后,在使用时不需要带包前缀,但是需要带模块名。例如,想通过“from + 完整包名 + import + 模块名”形式导入上面已经创建的size模块,并且调用width和height变量,就可以通过下面的代码实现:from settings import size # 导入settings包下的size模块if __name__=='__main__':    print('宽度:',size.width)    print('高度:',size.height)
执行上面的代码后,将显示以下内容:宽度: 800高度: 600

■ 通过“from + 完整包名 + 模块名 + import + 定义名”形式加载指定模块
“from + 完整包名 + 模块名 + import + 定义名”形式是指:假如有一个名称为settings的包,在该包下有一个名称为size的模块,那么要导入size模块中的width和height变量,可以使用下面的代码:from settings.size import width,height
通过该方式导入模块的函数、变量或类后,在使用时直接使用函数、变量或类名即可。例如,想通过“from + 完整包名 + 模块名 + import + 定义名”形式导入上面已经创建的size模块的width和height变量,并输出,就可以通过下面的代码实现:# 导入settings包下size模块中的width和height变量from settings.size import width,heightif __name__=='__main__':    print('宽度:', width) # 输出宽度    print('高度:', height) # 输出高度
执行上面的代码后,将显示以下内容:宽度: 800高度: 600

说明:在通过“from + 完整包名 +模块名 + import + 定义名”形式加载指定模块时,可以使用星号“*”代替定义名,表示加载该模块下的全部定义。

实例 在指定包中创建通用的设置和获取尺寸的模块
创建一个名称为settings的包,在该包下创建一个名称为size的模块,通过该模块实现设置和获取尺寸的通用功能。具体步骤如下:
(1)在settings包中,创建一个名称为size的模块,在该模块中,定义两个保护类型的全局变量,分别代表宽度和高度,然后定义一个change()函数,用于修改两个全局变量的值,再定义两个函数,分别用于获取宽度和高度,具体代码如下:

01 _width = 800 # 定义保护类型的全局变量(宽度)

02 _height = 600 # 定义保护类型的全局变量(高度)

03 def change(w,h):

04     global _width # 全局变量(宽度)

05     _width = w # 重新给宽度赋值

06     global _height # 全局变量(高度)

07     _height = h # 重新给高度赋值

08 def getWidth(): # 获取宽度的函数

09     global _width

10     return _width

11 def getHeight(): # 获取高度的函数

12     global _height13     return _height
(2)在settings包的上一层目录中创建一个名称为main.py的文件,在该文件中导入settings包下的size模块的全部定义,并且调用change()函数重新设置宽度和高度,然后再分别调用getWidth()和getHeight()函数获取修改后的宽度和高度,具体代码如下:

01 from settings.size import * # 导入size模块下的全部定义

02 if __name__=='__main__':

03     change(1024,768) # 调用change()函数改变尺寸

04     print('宽度:',getWidth()) # 输出宽度

05     print('高度:',getHeight()) # 输出高度
执行本实例,将显示如图所示的结果。

ea21675d2ab545a68cbaaf4ab84cc382.png

8.5 引用其他模块
在Python中,除了可以自定义模块外,还可以引用其他模块,主要包括使用标准模块和第三方模块。下面分别进行介绍。

 8.5.1 导入和使用标准模块
在Python中,自带了很多实用的模块,称为标准模块(也可以称为标准库),对于标准模块,我们可以直接使用import语句导入到Python文件中使用。例如,导入标准模块random(用于生成随机数),可以使用下面的代码:import random # 导入标准模块random说明:在导入标准模块时,也可以使用as关键字为其指定别名。通常情况下,如果模块名比较长,则可以为其设置别名。
导入标准模块后,可以通过模块名调用其提供的函数。例如,导入random模块后,就可以调用randint()函数生成一个指定范围的随机整数。例如,生成一个0~10(包括0和10)的随机整数的代码如下:import random # 导入标准模块randomprint(random.randint(0,10)) # 输出0~10的随机数

除了random模块外,Python还提供了大约200多个内置的标准模块,涵盖了Python运行时服务、文字模式匹配、操作系统接口、数学运算、对象永久保存、网络/Internet脚本和GUI构建等方面。

cb1ada45eb73469493b265a0bb2c47b7.png

8.5.2 第三方模块的下载与安装
在进行Python程序开发时,除了可以使用Python内置的标准模块外,还有很多第三方模块可以被我们所使用。对于这些第三方模块,可以在Python官方推出的http://pypi.python.org/pypi中找到。
在使用第三方模块时,需要先下载并安装该模块,然后就可以像使用标准模块一样导入并使用了。

 下载和安装第三方模块可以使用Python提供的pip命令实现。pip命令的语法格式如下:pip <command> [modulename]
参数说明:

■ command:用于指定要执行的命令。常用的参数值有install(用于安装第三方模块)、uninstall(用于卸载已经安装的第三方模块)、list(用于显示已经安装的第三方模块)等。

■ modulename:可选参数,用于指定要安装或者卸载的模块名,当command为install或者uninstall时不能省略。

说明:在大型程序中可能需要导入很多模块,推荐先导入Python提供的标准模块,然后再导入第三方模块,最后导入自定义模块。

多学两招:如果想要查看Python中都有哪些模块(包括标准模块和第三方模块),可以在IDLE中输入以下命令:
help('modules')
如果只是想要查看已经安装的第三方模块,可以在命令行窗口中输入以下命令:
pip list

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小程序员.¥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值