模块Ⅰ
-
定义与分类
-
定义
-
一个模块就是一个py文件,这个模块存储很多相似的功能,相似函数的集合体
通常一个项目不可能将所有代码全部写在一个文件中,这样会造成不易维护以及效率低的缺点。
此时需要分文件,比如分成10个文件,每个文件有50个函数,有一些相同功能或者相似功能的函数,整个文件看起来代码冗余,重复性很高。
我们应该将这10个函数提取出来,放在一个文件中,随拿随用
-
优点
- 节省代码
- 容易维护,组织解构更清晰
-
-
分类
- 内置模块,标准库。python解释器自带的time,os,sys等等200多种
- 第三方库(模块),各种大神写的一些模块,通过pip install...安装6000多种
- 自己写的模块,自定义模块
-
-
import
-
格式
import tbjx
执行文件:02 模块import
被引用文件(模块):tbjx.py
当引用tbjx模块时,实际上是将tbjx .py执行一遍,加载到内存
只是第一次引用时,将此模块加载到内存
-
第一次导入模块发生的三件事
- 将tbjx.py文件加载到内存。
- 在内存中创建一个以tbjx命名的名称空间。
- 通过tbjx名称空间的名字.等方式引用此模块的名字(变量,函数名,类名等等)。
import tbjx print(tbjx.name) tbjx.read1() tbjx.read2()
-
被导入模块有独立的名称空间
通过tbjx.的方式引用此模块的名字时,一定是从此模块中寻找的
通过import引用模块,有自己的独立空间,与当前执行文件没有关系
name = '王大锤' print(tbjx.name) def read1(): print('in 02 模块import') tbjx.read1()
-
为模块起别名
将一个比较长的模块名化简成简单的。
-
书写方便
import tbjx as tb print(tb.name) tb.read1()
-
简化代码
content = input('>>>').strip() if content == 'mysql': import mysql_ as db elif content == 'oracle': import oracle_ as db db.sqlprase() # 统一化接口
-
-
导入多个模块
-
import time,os,sys # 不推荐.
-
import time import os import sys
-
-
-
from...import...
-
用法
from tbjx import name from tbjx import read1
相当于从tbjx模块的全局空间中将name,read1变量与值的对应关系复制到当前执行文件的全局名称空间中。
-
优点:使用起来方便了
-
缺点:容易与当前执行文件产生覆盖效果
实例1:
from tbjx import name name = '王大锤' print(name) # 王大锤
实例2:
name = '王大锤' from tbjx import name from tbjx import read1 def read1(): print('在执行文件中') print(name) read1() # 太白金星 # 在执行文件中
实例3:
from tbjx import name from tbjx import change change() print(name) # 太白金星 并没有改变
特殊情况:极值情况,工作中不会出现。(了解)
因为如果你要是引用一些模块的变量,那么执行文件中就不应该出现同名变量。实例4:
from tbjx import change change() from tbjx import name print(name) # barry 变了
-
-
from...import *尽量别单独用
-
将模块中的所有名字复制过来
-
容易覆盖
-
与
__all__
配合使用(写在模块文件中),只会将例表里的名字复制过来__all__ = ['name', 'read1', 'read2']
-
-
-
py文件的两种功能
-
功能
-
py文件的第一个功能:执行文件(承载代码) 脚本.
直接打印
__name__
返回__main__
-
py文件的第二个功能: 模块(被执行文件).
直接打印
__name__
返回tbjx
模块名
-
-
作用
用来控制.py文件在不同的应用场景下执行不同的逻辑(或者在模块文件中测试代码)
-
-
模块的搜索路径
寻找模块的路径:内存 ----> 内置模块 ---> sys.path中找
只要这三个地方:内存 内置模块 sys.path可以找到这个引用的模块的路径,这个模块就可以直接引用到。import sys print(sys.path) sys.path.append(r'模块路径') # 可通过此方法可调用不在同一目录下的模块