Python进阶(八)----模块,import , from import 和 __name__
的使用
一丶模块的初识
#### 什么是模块:
# 模块就是一个py文件(这个模块存放很多相似的功能,函数的集合体)
### 模块的分类:
# 内置模块: 标准库 ,python解释器自带的 ,200多种
# 第三方库: 通过pip install 安装第三方库 6000个
# 自己写的模块: 自己编写的特定功能的py文件
#### 自定义模块:
# 只是第一次引用时, 将此模块加载到内存,
# 执行文件: 被引用文件
二丶模块的导入 import
### 语法 : import 模块名 , 只加载一次(导入就不会再次加载)
### 调用格式 : 模块名 . XX功能
### 引用模块发送三件事:
#1. 把要引入模块加载到内存
#2. 在内存中创建一个以引入模块命名的名称空间
#3. 通过引入模块的名字,以.的方式引入此模块的(变量,函数,类名)
###注意:
# 通过import引入的模块,引入模块中的变量不会受到,当前模块相同名字的变量的影响
# 通过import 引入的模块, 他有自己的独立空间,与当前执行的文件没有关系.
### 起别名: import ...模块 as ...缩写名
# 将一个名字较长的模块名 简化成一个 简单名字
import tbjx as k
print(k.name)
### 同时调用多个模块 ,以,号分隔 (不建议使用, 会使代码清晰,不易维护)
import 模块1, 模块2 ,模块3
三丶from import
### 语法格式: from xxx模块 import 变量 , 只加载一次
from tbjx import func1
print(globals()) # 查看当前文件中的变量, 把需要用的具体变量,从引入模块拷贝一份.
### 特点:
# 优点: 使用起来方便 (更容易快速找到指定的要使用的 功能 )
# 缺点: 容易与当前执行文件产生覆盖效果(如果当前执行的文件中具有和导入的模块 相同名字的变量就会被覆盖.谁先加载,谁先被覆盖)
### 注意: (极端情况,一般没人这么折腾自己)
# 需求: 在引入一个模块的之后,去执行这个模块的中修改模块的某个变量的值. 不会对当前执行文件造成影响.
# 当前执行文件使用的是模块中同一个函数.(只有模块中的变量会被拷贝当前执行文件, 模块中的函数不会被拷贝)
# 引用模块中的函数,如果此模块用到一些变量,这些变量还是从此模块中寻找,不会改变当前执行文件的变量
### 起别名
from tbjx import name as n
##多个导入:
from tbjx import name as n
from tbjx import read1 as r
### * (尽量别用)
from xxx模块 import *
# 全部复制(模块中所有的都被全部加载到内存中), 效率低, 容易覆盖
# from .. import * 与__all__配合使用
# 在引入模块的文件中,创建一个列表 __all__=[变量1,变量2,函数名1,函数名2] 一般写在引入模块最上面
#####推荐:
# 当前执行的文件中 ,不要出现 与 引入模块相同的名字的变量.
四丶模块路径 和 "__name__"
的使用
### __name__ 的使用 ,判断当前文件是可执行的脚本,还是模块
# 1. py文件的第一个功能: 执行文件(承载代码)脚本(主动) ,直接打印(__name___)得到__main__
# 2. py文件的第二个功能: 模块(被执行) 直接打印(__name___)得到 模块名
# 补充:
#1.使用pycharm是,点击run 一个.py的文件,(文件包括👇下面的代码),就会打印True,此时的
# __name__==__main__ , so , 是一个主动执行脚本.
if __name__ == '__main__':
print(True)
#2. 而且下面的代码,还具有测试功能
def func1():
print('in func1')
def func2():
print('in func2')
return '执行 func2'
func1()
func2()
if __name__ == '__main__':
ret=func2()
print('测试func2:'+ret)
### 模块的搜索路径
# 寻找模块的路径: 内存--->内置模块--->sys.path
# 只要找到这三个地方: 内存中,内置中 ,sys.path可以找到这个引用的模块的路径,这个模块就直接引用
### 主动的将一个模块的路径添加到 当前工作sys.path环境
import sys
print(sys.path) # 打印当前工作目录
print(sys.modules) # 打印当前文件中所有的模块
sys.path.append(r'XXX文件') # xxx文件 和 你当前执行文件的父目录同级 ,xxx文件包含 tbjx.py文件
import tbjx1