模块
模块的概念:模块就是一组功能的集合体,我们的程序可以导入模块来复用模块里的功能。
模块的定义:创建一个 py 文件就是一个模块,该 py 文件名就是模块名。
模块的使用:在要使用模块的文件中,通过 import 模块名 来导入模块。
模块的通用类别:
1 使用python编写的.py文件
2 已被编译为共享库或DLL的C或C++扩展
3 把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包)
4 使用C编写并链接到python解释器的内置模块
import module 导入模块后对应的操作:
编译执行模块所对应的 py 文件,形成对应的 pyc 文件
产生该模块自己的全局名称空间
在使用该模块的全局名称空间中产生一个名字(导入的模块名)
导入模块是要注意点:
1.每一个文件都会产生自己的全局名称空间,且相互不影响
2.多次导入,只会编译执行模块一次,将其加载到内存,之后的都是直接对名字的引用
使用模块的优点:
1.从文件级别组织代码,是同特性的功能能统一管理
2.可以使用系统或第三方模块(拿来主义),来提高开发效率
起别名
通过as关键字可以给模块起别名: 模块名一旦起别名,原模块名就不能再使用,为已经导入的模块起别名的方式对编写可扩展的代码很有用。
优点:
1.可以简化模块名字
2.可以统一功能
# 1.可以简化模块名字
import mmmmm3 as my_m3
print(my_m3.num)
# 2.可以统一功能
cmd = input('数据库选择 1:mysql | 2:oracle:')
if cmd == '1':
import mysql as db
# mysql.excuse()
else:
import oracle as db
# oracle.excuse()
db.excuse()
假设有两个模块xmlreader.py和csvreader.py,它们都定义了函数read_data(filename):用来从文件中读取一些数据,但采用不同的输入格式。可以编写代码来选择性地挑选读取模块
if file_format == 'xml':
import xmlreader as reader
elif file_format == 'csv':
import csvreader as reader
data=reader.read_date(filename)
from导入
from 模块名 import 名字1, 名字2, …, 名字n
利用from导入可以指名道姓导入模板中所有想导入的名字。
使用from导入与import导入的区别:
使用from…import…则是将spam中的名字直接导入到当前的名称空间中,所以在当前名称空间中,直接使用名字就可以了、无需加前缀:spam.
from...import...的方式有好处也有坏处
好处:使用起来方便了
坏处:容易与当前执行文件中的名字冲突
from 模块名 import *
导入的是模块中的__all__这个列表
1、系统默认该列表不会收录_开头的名字
2、可以自定义__all__列表来规定外界通过*可以导入的名字
大部分情况下我们的python程序不应该使用这种导入方式,因为*你不知道你导入什么名字,很有可能会覆盖掉你之前已经定义的名字。而且可读性极其的差。
例如模块中有变量名 a
from 模块名 import *
# 可以使用模块中的a
a = 20
# 模块中的a就被覆盖了,且在代码上还不能直接看出
利用from导入时起别名
from 模板名 import 名字1 as 别名1, ..., 名字n as 别名n
自执行与模块区别
编写好的一个python文件可以有两种用途:
一:脚本,一个文件就是整个程序,用来被执行
二:模块,文件中存放着一堆功能,用来被导入使用
python为我们内置了全局变量__ name __ ,
当文件被当做脚本执行时:__ name __ 等于’__ main __ ’
当文件被当做模块导入时:__ name __等于模块名
作用:用来控制.py文件在不同的应用场景下执行不同的逻辑
if __ name __ == ‘__ main __’:
__name__:
1.在py文件作为模块被使用时,__name__为模块名
2.在py文件自执行时,__name__为字符串 '__main__'
print("共有逻辑")
if __name__ == '__main__':
# 所有自执行的逻辑
print("m6: 我是自执行的")
a = 10 # 产生的是全局的名字
else:
# 所有模块的逻辑
print("m6: 我被导入执行的")
print(a) # 会报错:走else就不可能走if,所以a压根没产生