3.1 模块的定义与分类,import,from...import
什么是模块?一个模块就是一个py文件
模拟博客园系统作业,100000行代码. 不可能全部存在一个文件.
- 不易维护.
- 效率低.
分文件: 10个文件.每个文件有50个函数,有一写相同功能或者相似功能的函数.代码冗余,重复性.我们应该将这10个函数提取出来,放在一个文件中,随用随拿.
- 节省代码.
- 容易维护,组织结构更清晰.
一个模块就是一个py文件,这个模块存储很多相似的功能,相似的函数的集合体.
模块的分类:
- 内置模块,标准库,python解释器自带的,time,os,sys 等等 200多种.
- 第三方库(模块),人写的一些模块,通过pip install 安装 6000种
- 自己写的模块.自定义模块
2.import
import tbjx
当我引用tbjx模块的时候,实际上将tbjx.py执行一遍,加载到内存.
import tbjx
import tbjx
import tbjx
只能第一次引用时,将此模块加载到内存.
-
执行文件:02 模块import
-
被引用文件(模块): tbjx.py
-
第一次导入模块发生的三件事
import tbjx n = 1 引用模块发生三件事: 1. 将tbjx.py文件加载到内存(执行此模块). 2. 在内存中创建一个以tbjx命名的名称空间. 3. 通过tbjx名称空间的名字.等方式引用此模块的名字(变量,函数名,类名等等). print(tbjx.name) tbjx.read1() tbjx.read2()
-
被导入模块有独立的名称空间
坑:通过tbjx.的方式引用此模块的名字时,一定一定是从此模块中寻找. 通过import 引用模块 他有自己的独立名称空间,与当前执行文件没有关系. name = 'tr' print(tbjx.name)# 太白 def read1(): print('in 02 模块import') tbjx.read1()# tbjx模块: 太白金星,这个只能从模块中拿东西,永远不可能从此执行文件拿东西,若模块中没有read1(),就会报错.
-
为模块起别名
import contextlib as cb from tbjx import name as n 1 书写方便. import tbjx as tb print(tb.name) tb.read1() 2 简化代码 content = input('>>>').strip() if content == 'mysql': import mysql_ mysql_.sqlprase() elif content == 'oracle': import oracle_ oracle_.sqlprase() 简化代码写法: content = input('>>>').strip() if content == 'mysql': import mysql_ as db elif content == 'oracle': import oracle_ as db db.sqlprase() # 统一化接口
-
导入多个模块
import time,os,sys # 不推荐.
import timeimport os
import sys易于阅读 易于编辑 易于搜索 易于维护。
3.from... import *
-
from tbjx import *
from tbjx import name from tbjx import read1 print(globals())#获取当前文件的全局变量 相当于从tbjx模块的全局空间中将name,read1变量与值的对应关系 复制到当前执行文件的全局名称空间中. print(name) read1() 优点:使用起来方便了. 缺点:容易与当前执行文件产生覆盖效果. 示例1: from tbjx import name from tbjx import read1 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) read1() read2() 1,全部将tbjx的所有名字复制过来,无用功. 2,容易覆盖.
示例3:
-
from ... import * 与
__all__
配合使用(写在模块文件中)from tbjx import * read1() read2() 模块中: __all__ = ['read1','read2']#列表中的元素是执行文件在引用模块时可以执行的函数