目录
模块的概述
自定义模块
Python中的包
以主程序的形式执行
引用其他模块
模块的概述
- 什么是模块:在python中模块就是python程序,一个模块就是一个*.py的文件,通常情况下把能够实现某一特定功能的代码放置在一个文件中作为一个模块,从而方便其他程序和脚本导入使用
- 模块的优势:
- 可以有效避免函数名和变量名冲突,因为每一个模块都有各自的作用域和变量名冲突
- 更容易查找代码,因为引入模块这个文件就会更小,并且分工明确
- 提高代码的可重用性,因为创建模块后可以被各种程序和代码重复调用
- 有选择的使用,可以使用不同的部分来组合完成不同的功能
自定义模块
1. 自定义模块:就是自己编写的python程序也就是python文件
2. 一般情况模块可以包含:函数、变量、类、可执行代码
3. 创建模块
模块名:不能是python自带的标准模块名
示例:
#编写模块文件add.py
def add(a,b):
return round(a + b,3)
#编写调用文件num.py
import add
print("a + b")
a = 0.213
b = 1.34
print(add.add(a,b))
4. 导入模块
(1)使用import导入模块
通过这种方法导入模块,我们必须使用模块名或者别名来引用对应的函数或者变量,这是因为在python中每执行一条import语句就会创建一个新的命名空间用来执行该模块相关的所有语句
命名空间:类似于边界,可以区分不同类的同名方法。不同类中的方法、变量等名字互不干涉
语法:
import modulename [as alias]
#as alias:设置模块的别名
示例:可以一次导入多个模块
import qwdqdqfd_bmi as bmi,tips,diffre
bmi.fun_bmi("张三",1.75,120) #调用bmi模块的方法
(2)使用from...import语句导入模块
通过这种方法导入模块,调用导入的变量、函数等可以把它们的类名前缀省略
注意:如果导入两个同名的定义,后导入的会覆盖之前导入的定义
语法:
from modename import member
#member:表示要导入类中的函数、变量等,如果需要导入全部可以用*表示
补充:可以使用dir()函数查看导入的定义
示例:
from bmi import fun_bmi #导入模块中的fun_bmi()函数
fun_bmi("李四"1.80,140,) #直接调用bmi中的函数
print(dir()) #查看已导入的定于
5. 指定模块搜索目录
问题:如果要导入的自定义模块与要执行的文件不在同一个目录时执行代码会报错:找不到此文件
python中搜索目录是由python的path变量决定的
查看path变量内容:(需要先导入python的标准模块)
import sys
print(sys.path)
如果path变量中不存在需要搜索的目录有三种方式可以设置:
(1)临时添加
只在执行当前文件的窗口当中有效
import sys
#在path变量中添加临时目录
sys.path.append('D:\\pty\\temp') #因为需要转义所以需要两个反斜杠
sys.path.append('D:/pty/temp') #或者一个斜杆
print(sys.path)
(2)增加.pth文件
只在当前的python版本中有效,需重新打开python文件
找到python的安装目录下的\Python36\Lib\site-packages\NAME.pth
#NAME.pth:对文件名没有要求后缀必须是.pth
内容:
E:/pty/temp
(3)在PYTHONPATH系统环境变量中添加
在此系统中都有效,在path值中会显示在行首部位,需重新打开python文件
找到:计算机→属性→高级系统设置→环境变量→系统变量→新建
变量名:PYTHONPATH
变量值:E:/pty/temp
Python中的包
python中的包:必须包含一个名称为__init__.py文件的文件夹,其中__init__.py文件可以是空文件,也可以写一些初始化代码
在实际项目开发时通常情况下会创建多个包用来存放不同类的文件
作用:
模块的作用:避免函数和变量名重名引发的冲突
包的作用 :
避免模块名重名引发的冲突
规范代码
python程序的包结构
以下图shop项目为例,创建了三个包:
创建包:就是创建包含__init__.py文件的文件夹
使用包有三种方法:
(1)import +完整包名 + 模块名
示例:调用同级目录中settings包中的模块
import settings.size #导入settings包中的size模块
print(settings.size.with)#调用size模块中的with变量
(2)from + 完整包名 + import + 模块名
#这个语法导入的模块,在使用模块中的定义时不需要指定包名
示例:
from settings import size #导入settings包中的size模块
print(size.with)#调用size模块中的with变量
(3)from + 完整包名 + . + 模块名 + import + 定义名
#通过这种方法可以导入指定模块下的某些定义
示例:
from settings.size import with,height
#导入settings包中size模块的with和height两个变量,如果要导入全部定义可以换成*号
print(with)#调用size模块中的with变量
示例2:
##settings包下的size.py文件
_width = 800 # 定义保护类型的全局变量(宽度)
_height = 600 # 定义保护类型的全局变量(高度)
def change(w,h):
global _width # 全局变量(宽度)
_width = w # 重新给宽度赋值
global _height # 全局变量(高度)
_height = h # 重新给高度赋值
def getWidth(): # 获取宽度的函数
global _width
return _width
def getHeight(): # 获取高度的函数
global _height
return _height
if __name__ == '__main__': # 测试代码
change(1024,768) # 调用change()函数
print("宽度:",getWidth()) # 输出宽度
print("高度:",getHeight()) # 输出高度
##与settings包同级目录的main.py文件
from settings.size import * # 导入size模块下的全部定义
if __name__=='__main__':
change(1024,768) # 调用change()函数改变尺寸
print('宽度:',getWidth()) # 输出宽度
print('高度:',getHeight()) # 输出高度
以主程序的形式执行
问题:在java或C#等大多数开发语言中程序都有一个入口,但python不同他是从脚本的第一行开始执行没有统一的入口,所以调用其他模块的变量时得到的结果可能是整个模块从上到下执行后的结果这显然不是我们想要的
示例:有出入的运行结果
##diff.py
pinetree = '我是一棵松树' # 定义一个全局变量(松树)
def fun_christmastree(): # 定义函数
'''功能:一个梦
无返回值
'''
pinetree = '挂上彩灯、礼物……我变成一棵圣诞树 @^.^@ \n' # 定义局部变量赋值
print(pinetree) # 输出局部变量的值
# *****************************函数体外***********************************#
print('\n下雪了……\n')
print('=============== 开始做梦…… =============\n')
fun_christmastree() # 调用函数
print('=============== 梦醒了…… ===============\n')
pinetree = '我身上落满雪花,' + pinetree + ' -_- ' # 为全局变量赋值
print(pinetree) # 输出全局变量的值
##main.py
import ddiff
print("输出变量:",ddiff.pinetree)
通过__name__判断要以主程序的形式才能执行
__name__:这是一个记录模块名称的变量,当模块在顶级程序当中运行时他的值就是__main__,如果是其他模块调用它的值就是当前模块的名字
示例:
##diff.py
pinetree = '我是一棵松树' # 定义一个全局变量(松树)
def fun_christmastree(): # 定义函数
'''功能:一个梦
无返回值
'''
pinetree = '挂上彩灯、礼物……我变成一棵圣诞树 @^.^@ \n' # 定义局部变量赋值
print(pinetree) # 输出局部变量的值
# *****************************函数体外***********************************#
print(__name__)
if __name__ == '__main__':
print('\n下雪了……\n')
print('=============== 开始做梦…… =============\n')
fun_christmastree() # 调用函数
print('=============== 梦醒了…… ===============\n')
pinetree = '我身上落满雪花,' + pinetree + ' -_- ' # 为全局变量赋值
print(pinetree) # 输出全局变量的值
##main.py
import ddiff
print("输出变量:",ddiff.pinetree)
引用其他模块
导入和使用标准模块(又称标准库)
可以通过import直接导入
python一共提供了二百多个标准库可以从安装目录的doc目录查看帮助文件,在帮助文件的The Python Standard Library节点中查看所有标准库信息
第三方模块的下载与安装
需要先下载并安装到电脑上就可以像标准库那样调用了,有两种方法
推荐:在大型项目中需要导入很多模块建议导入顺序:
标准模块 → 第三方模块 → 自定义模块
(1)官方推出的第三方库下载地址 进行下载安装
(2)通过python提供的pip命令进行下载安装:
需要命令行窗口进行
语法:
pip <command> [modulename]
#command:常用命令
install #安装第三方模块
uninstall #卸载第三方模块
list #显示已安装的第三方模块
#modulename:当参数为install或uninstall时不可省略