模块
模块是Python架构的一个核心概念
- 模块就好比工具包,要想使用这个工具包中的工具,就需要导入import这个模块
- 每一个以拓展名py结尾的python原代码文件都是一个模块
- 在模块中定义的全局变量、函数、类都是模块能够提供给外界直接使用的工具
-
-
注释:文件顶部或init文件中。
-
在文件顶部导入
-
# 先内置模块 # 再第三方模块 # 最后自定义模块
-
1.1第一个模块体验
- 第一个模块:
1 # -*- coding: gbk -*- 2 # 找最大值 3 def max_1(a,b,c): 4 if a>b: 5 if a>c: 6 print("最大值为:",a) 7 else: 8 print("最大值为:",c) 9 else: 10 if b>c: 11 print("最大值为:",b) 12 else: 13 print("最大值为:",c) 14 15 # 找最小值 16 def min_1(a,b,c): 17 if a<b: 18 if a<c: 19 print("最小值为:",a) 20 else: 21 print("最小值为:",c) 22 else: 23 if b<c: 24 print("最小值为:",b) 25 else: 26 print("最小值为:",c) 27 28 name_1 = "某人飞"
- 第二个模块:
1 import test1 2 test1.max_1(10,60,30) 3 test1.min_1(10,60,30) 4 print(test1.name_1)
- 体验小结:
- 可以在一个Python文件中定义变量或者函数
- 然后在另一个文件中使用import导入这个模块
- 导入之后,就可以使用 模块名.变量 / 模块名.函数 方式,使用这个模块中定义的变量或者函数
- 模块可以让曾经写过的代码方便被 复用!
1.2模块名也是一个标识符
- 标识符可以由 字母、数字 和 下划线 组成
- 不能以数字开头
- 不能与关键字重名
注意:如果在给Python文件起名时,以数字开头是无法在 PyCharm 中导入这个模块的
1.3导入模块的两种方式
- import 导入:
import 模块名1, 模块名2 #不推荐使用
提示:在导入模块时,每个导入应该独占一行:
import 模块名1 import 模块名2
-
- 导入之后
- 通过 模块名. 使用 模块提供的工具 —— 全局变量、函数、类
- 导入之后
- 使用 as 指定模块的别名
- 如果模块的名字太长,可以使用as指定模块的名称,以方便在代码中的使用:
import 模块名1 as 模块别名
注意:模块别名应该符合 大驼峰 命名法
- 演示:
1 # -*- coding: gbk -*- 2 # 找最大值 3 def max_1(a,b,c): 4 if a>b: 5 if a>c: 6 print("最大值为:",a) 7 else: 8 print("最大值为:",c) 9 else: 10 if b>c: 11 print("最大值为:",b) 12 else: 13 print("最大值为:",c) 14 15 # 找最小值 16 def min_1(a,b,c): 17 if a<b: 18 if a<c: 19 print("最小值为:",a) 20 else: 21 print("最小值为:",c) 22 else: 23 if b<c: 24 print("最小值为:",b) 25 else: 26 print("最小值为:",c) 27 28 name_1 = "某人飞"
1 import test_1_wohaofuzaa as tes 2 tes.max_1(10,60,30) 3 tes.min_1(10,60,30) 4 print(tes.name_1)
注意:当导入模块时,给模块起了别名,那么就只能使用别名去调用模块中的工具
- 如果模块的名字太长,可以使用as指定模块的名称,以方便在代码中的使用:
- from...improt导入
- 如果希望 从 某一个模块 中,导入 部分工具,就可以使用 for...import的方式
- import 模块名 是一次性把模块中 所有的工具全部导入,并且通过 模块名/别名 访问
#从模块导入某一个工具 from...模块名1 import 工具名
-
导入之后
- 不需要通过 模块名.
- 可以直接使用 模块提供的工具——全局变量、函数、类
1 # -*- coding: gbk -*- 2 # 找最大值 3 def max_1(a,b,c): 4 if a>b: 5 if a>c: 6 print("最大值为:",a) 7 else: 8 print("最大值为:",c) 9 else: 10 if b>c: 11 print("最大值为:",b) 12 else: 13 print("最大值为:",c) 14 15 # 找最小值 16 def min_1(a,b,c): 17 if a<b: 18 if a<c: 19 print("最小值为:",a) 20 else: 21 print("最小值为:",c) 22 else: 23 if b<c: 24 print("最小值为:",b) 25 else: 26 print("最小值为:",c) 27 28 name_1 = "某人飞"
1 # -*- coding: gbk -*- 2 from test_1_wohaofuzaa import max_1 3 from test_1_wohaofuzaa import name_1 4 max_1(10,60,30) 5 #min_1(10,60,30) #报错,并没有导入这个函数 6 print(name_1)
注意:如果两个模块,存在同名的函数名,那么后导入的模块的函数,会覆盖掉先导入的函数
-
- 开发时 import 代码应该统一写在 代码的顶部,更容易及时发现冲突
- 一旦发现冲突,可以使用as关键字给其中一个工具起别名
1 # -*- coding: gbk -*- 2 from test_1_wohaofuzaa import max_1 as ma 3 from test_1_wohaofuzaa import name_1 as name 4 ma(10,60,80) 5 #min_1(10,60,30) #报错,并没有导入这个函数 6 print(name)
- from...import *
- 一次性导入模块的所有工具
- 不推荐使用这种方式,因为函数重名并没有任何提示,出现问题不好排查(会被后导入的模块函数覆盖)
# -*- coding: gbk -*- from test_1_wohaofuzaa import * max_1(10,60,80) min_1(10,60,30) print(name_1)
使用场景:
- import:项目根目录的包、模块级别的导入
- from:成员、嵌套的包、木块导入
- 两种都可以使用as别名,处理重名情况
2.1模块的搜索顺序
Python解释器在导入模块时,会:
- 搜索 当前目录 指定模块名的文件,如果有就会直接导入
- 如果没有,再搜索 系统目录
[ '当前执行脚本所在的目录', /Users/wupeiqi/PycharmProjects/luffyCourse/day14/bin /Users/wupeiqi/PycharmProjects/luffyCourse/day14 '/Applications/PyCharm.app/Contents/plugins/python/helpers/pycharm_display', '/Library/Frameworks/Python.framework/Versions/3.9/lib/python39.zip', '/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9', '/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages', #这个是第三方模块存放的包 '/Applications/PyCharm.app/Contents/plugins/python/helpers/pycharm_matplotlib_backend' ]
- 想要在系统目录中添加自己需要的目录,可以使用sys模块中的sys.path.append(路径)
import sys import os """ 举例子:如果当前脚本不在项目的根目录,又想将项目的跟目录添加进搜索目录的列表 """ # 获取当前脚本的路径,然后找到根目录 path = os.path.dirname(os.path.abspath(__file__)) # 将路径添加到搜索目录的列表 sys.path.append(path) import xxxxx # 导入路径A下的一个xxxxx.py文件
注意:在开发时,给文件起名,不要和 系统的模块文件 重名
Python中每一个模块都有一个内置属性 __file__ 可以 查看模块 的完整路径
import random rand = random.randint(1,3) print(rand)
此时代码可以正常执行,但是如果我再当前目录下,新建了一个空白的random模块,那么就会报错
import random # 查看导入的模块的路径 print(random.__file__) #D:\python_DM\venv\jiaoxue\模块\random.py
2.1原则——每一个文件都应该是被导入的
- 一个独立的python文件就是一个模块
- 在导入文件时,文件中所有没有任何缩进的代码 都会被执行一遍
1 # -*- coding: gbk -*- 2 # 找最大值 3 def max_1(a,b,c): 4 if a>b: 5 if a>c: 6 print("最大值为:",a) 7 else: 8 print("最大值为:",c) 9 else: 10 if b>c: 11 print("最大值为:",b) 12 else: 13 print("最大值为:",c) 14 15 # 找最小值 16 def min_1(a,b,c): 17 if a<b: 18 if a<c: 19 print("最小值为:",a) 20 else: 21 print("最小值为:",c) 22 else: 23 if b<c: 24 print("最小值为:",b) 25 else: 26 print("最小值为:",c) 27 28 name_1 = "某人飞" 29 print("我是test1")
1 # -*- coding:gbk -*- 2 import test_1 3 print("我是text2") 4 ''' 5 运行效果: 6 我是text2 7 我是test1 8 '''
- 文件被导入时:
- 提供的工具:全局变量、函数、类
- 直接被执行的代码不是向外界提供的工具
- 文件被导入时,能够直接执行的代码不需要被执行
__name__属性:
- __name__属性可以做到,测试模块的代码只在测试情况下被运行,而在被导入时不会被执行!
- __name__是python的一个内置属性,记录着一个字符串
- 如果被其他文件的导入,__name__就是模块名
- 如果是当前执行程序,__name__就是__main__
-
#这个是模块test1 # 如果直接执行模块test1,得到的结果永远是__main__ print(__name__)
#这个是模块test2 import test_1 ''' 运行结果: test_1 '''
-
在很对Python文件中都会看到以下格式的代码
#如果是测试模块,那么就会执行测试语句块内容 #如果是导入该模块,那么就不会执行测试语句块内容 if __name__ == "__main__": 测试语句块