第五章
5.1 自定义模块
模块概念:
把一些常用的函数放在一个py文件中,这个文件就称之为模块。
模块的意义:
1.方便管理。让程序的解构更加清晰,实现功能的重复使用;
2.提升开发效率。俗话说的拿来主义,避免重复造轮子,使用别人写好的实现了某些功能的模块,可以大大提高开发效率。
模块的分类:
第一类:内置模块,也叫做标准库。python自带,200多个,每个模块又包含很多的功能,比如os,sys,time;
第二类:第三方模块,第三方库。需通过pip install指令安装的模块,比如Django,BeautfulSoup等,大约6000多种;
第三类:自定义模块。我们自己在项目中定义的模块。
5.1.1 import
1.使用
语法:import 模块名
模块可以包含可执行语句和函数的定义,这些语句的目的是初始化模块,他们只在模块名第一次遇到import导入语句时才执行。import的优化手段是可以在程序的任何位置使用,并且在第一次加载完成时执行模块里的执行语句,后边再调用时就不会重复执行模块里的语句。
2.第一次导入模块执行的三件事
- 在内存中创建一个以模块名命名的名称空间
- 执行这个名称空间里的代码
- 通过 模块名. 的方式引用该模块里面的内容
ps:重复导入会直接引用内u你中已经加载好的结果
3.被导入模块有独立的名称空间
每个模块都是一个独立的名称空间,定义在这个模块中的函数,把在这个模块的名称当作全局名称空间,这样在编写自定义的模块时,就不用担心自定义模块中的全局变量被导入后与使用者的全局变量冲突。
举例(小坑):
#自定义模块aries.py,当作脚本运行时,会看到的调用change函数后name已经被改变了
name = 'aries'
def change():
global name
name = 'allen'
change()
print(name) #输出 allen
#把aries.py当作模块在新的py文件中加载时
import aries #加载aries模块
name = 'Jack' #在本py文件下,创建全局变量name与aries模块里的name同名
aries.change() #调用aries下的change函数
print(name)
#### 输出
allen #第一次加载aries时,执行模块里的语句
Jack #chang函数并没有改变本地py文件中name的值
4.为模块起别名
语法:import 模块名 as 别名
优点:将很长的模块名简化,方便使用;有利于代码的扩展和优化
#mysql.py
def sqlparse():
print('from mysql sqlparse')
#oracle.py
def sqlparse():
print('from oracle sqlparse')
#test.py
db_type=input('>>: ')
if db_type == 'mysql':
import mysql as db
elif db_type == 'oracle':
import oracle as db
db.sqlparse()
5.导入多个模块
# 可以但是不推荐
import os,sys,json
#推荐写法
# 易于阅读 易于编辑 易于搜索 易于维护
import os
import sys
import json
5.1.2 from...import...
1.from...import...使用
语法:form 模块名 import 函数名1,函数名2...
也可以使用as起别名
2.from...import...与import的区别
使用from...import...则是将模块中的名字直接导入到当前的名称空间中,所以在当前名称空间中,直接使用名字就可以了、无需加前缀
from...import...的方式有好处也有坏处
好处:使用起来方便了
坏处:容易与当前执行文件中的名字冲突。
3. from ... import *
把模块里的所有的函数加载到本py文件中,不建议使用。
在模块中可以使用__all__
来控制哪些函数可以被调用
#在aries模块中,使用all可以把能被调用的函数写进去
__all__=['change','a_count']
5.1.3 py文件的两种功能
编写好的一个py文件有两种用途:
- 脚本,一个文件就是整个程序,用来被执行
- 模块,文件中存放着一堆功能,用来被导入使用
python内置了全局变量__name__
:
- 当文件被当做脚本执行时:name 等于
__main__
- 当文件被当做模块导入时:__name__等于模块名
可以在在模块中使用一下条件来限制条用函数
if __name__ == '__main__':
# 在模块文件中测试chang函数
# 此模块被导入时 __name__ == aries 所以不执行
change()
5.1.4 模块的搜索路径
查找顺序:
内存中已经加载的模块->内置模块->sys.path路径中包含的模块
【特别注意:】我们自定义的模块名不应该与系统内置模块重名
导入sys.path:
#首先制作归档文件:zip module.zip foo.py bar.py
import sys
sys.path.append('module.zip')
import foo,bar
#也可以使用zip中目录结构的具体位置
sys.path.append('module.zip/lib/python')
#windows下的路径不加r开头,会语法错误
sys.path.insert(0,r'C:UsersAdministratorPycharmProjectsa')