目录
模块的概述
- 什么是模块:在python中模块就是python程序,一个模块就是一个*.py的文件,通常情况下把能够实现某一特定功能的代码放置在一个文件中作为一个模块,从而方便其他程序和脚本导入使用
- 模块的优势:
- 可以有效避免函数名和变量名冲突,因为每一个模块都有各自的作用域和变量名冲突
- 更容易查找代码,因为引入模块这个文件就会更小,并且分工明确
- 提高代码的可重用性,因为创建模块后可以被各种程序和代码重复调用
- 有选择的使用,可以使用不同的部分来组合完成不同的功能
自定义模块
自定义模块就是自己编写的python程序也就是python文件,一般情况下可以包含:函数、变量、类、可执行代码
创建模块
模块名:不能是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))
导入模块
(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:表示要导入类中的函数、变量等,如果需要导入全部可以用*表示
示例:
from bmi import fun_bmi #导入模块中的fun_bmi()函数
fun_bmi("李四"1.80,140,) #直接调用bmi中的函数
指定模块搜索目录
问题:如果要导入的自定义模块与要执行的文件不在同一个目录时执行代码会报错:找不到此文件
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
补充:dir()函数用法
dir()
是一个内置函数,它的主要作用是返回一个对象所拥有的属性和方法的名称列表,用法如下:
1. 不传入参数
在这个例子中,result
列表会包含 x
、func
以及 Python 内置的一些名称,如 __builtins__
、__name__
等。
x = 10
def func():
pass
# 调用 dir() 函数,不传入参数
result = dir()
print(result)
2. 传入对象参数
可以传入不同类型的对象,来查看它们的属性和方法。
# 传入列表对象
my_list = [1, 2, 3]
list_attributes = dir(my_list)
print(list_attributes)
这里调用 dir(my_list)
会返回列表对象所拥有的所有属性和方法的名称,例如 append
、extend
、pop
等。
3.传入自定义类的实例
对于自定义类的实例,dir()
会返回该实例的属性(如 my_attribute
)和方法(如 my_method
),以及从父类继承来的属性和方法,还有一些 Python 内置的特殊属性(如 __class__
、__dict__
等)。
class MyClass:
def __init__(self):
self.my_attribute = 42
def my_method(self):
pass
# 创建类的实例
obj = MyClass()
# 传入自定义类的实例
obj_attributes = dir(obj)
print(obj_attributes)
Python中的包
python中的包:必须包含一个名称为__init__.py文件的文件夹,其中__init__.py文件可以是空文件,也可以写一些初始化代码
在实际项目开发时通常情况下会创建多个包用来存放不同类的文件
作用:
模块的作用:避免函数和变量名重名引发的冲突
包的作用 :
避免模块名重名引发的冲突
规范代码
python程序的包结构
创建包:就是创建包含__init__.py文件的文件夹
以下图shop项目为例,创建了三个包:
使用包有三种方法:
(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()) # 输出高度
以主程序的形式执行
在 Python 中,if __name__ == '__main__':
是一个非常常用的代码结构,它有着重要的作用
__name__
特殊变量的含义
在 Python 里,每个模块都有一个内置的特殊变量 __name__
,这个变量的值会根据模块的使用方式而有所不同:
- 当一个 Python 文件作为脚本直接运行时,该文件的
__name__
变量会被自动设置为'__main__'
。 - 当一个 Python 文件作为模块被其他文件导入时,该文件的
__name__
变量会被设置为该模块的名称(即文件名去掉.py
后缀)。
if __name__ == '__main__':
的作用
-
区分脚本执行和模块导入。这个代码结构主要用于区分一个 Python 文件是作为脚本直接执行,还是作为模块被其他文件导入。通过判断
__name__
是否等于'__main__'
,可以决定哪些代码在脚本直接运行时执行,哪些代码在被导入时不执行。 -
测试代码的封装。在开发过程中,我们通常会在模块中编写一些测试代码来验证函数或类的功能。使用
if __name__ == '__main__':
可以将这些测试代码封装起来,当模块被其他文件导入时,测试代码不会被执行,只有在直接运行该模块时才会执行测试代码。
示例代码:
假设我们有一个名为 example.py
的文件,内容如下:
def add(a, b):
return a + b
print("模块开始执行")
if __name__ == '__main__':
result = add(3, 5)
print(f"直接运行脚本,3 + 5 的结果是: {result}")
print("模块执行结束")
直接运行脚本:当我们在命令行中直接运行
python example.py
时,__name__
的值为'__main__'
,if __name__ == '__main__':
条件成立,会执行其中的代码,输出结果如模块开始执行 直接运行脚本,3 + 5 的结果是: 8 模块执行结束
作为模块导入:当我们在另一个 Python 文件中导入
example.py
,此时example.py
中的__name__
变量的值为'example'
,if __name__ == '__main__':
条件不成立,其中的代码不会执行,输出结果如下:模块开始执行 模块执行结束
引用其他模块
导入和使用标准模块(又称标准库)
可以通过import直接导入
python一共提供了二百多个标准库可以从安装目录的doc目录查看帮助文件,在帮助文件的The Python Standard Library节点中查看所有标准库信息
第三方模块的下载与安装
需要先下载并安装到电脑上就可以像标准库那样调用了,有两种方法
推荐:在大型项目中需要导入很多模块建议导入顺序:
标准模块 → 第三方模块 → 自定义模块
(1)官方推出的第三方库下载地址 进行下载安装
(2)通过python提供的pip命令进行下载安装:
需要命令行窗口进行
语法:
pip <command> [modulename]
#command:常用命令
install #安装第三方模块
uninstall #卸载第三方模块
list #显示已安装的第三方模块
#modulename:当参数为install或uninstall时不可省略