模块 Module
什么是模块
模块是一个包含有一系列数据,函数,类等组成的程序组
模块是一个文件 ,模块文件名通常以.py结尾
作用:
让一些相关的数据,函数,类等有逻辑的组织在一起,使逻辑结构更新加清晰
模块中的数据,函数和类等可以提供给其它模块或程序使用
模块的分类:
1. 内置模块, 在解释执行器内部定义,可以直接使用
2. 标准库模块, 安装python时已安装且可以直接使用
3. 第三方模块(通常为开源), 需要自己安装
4. 用户自定义模块(可以作为其它人的第三方模块)
模块的导入 import
import 语句
语法:
import 模块名1 [as 模块新名1], 模块名2 [as 模块新名2], ...
作用:
将某模块整体导入到当前模块中
示例:
import math # 导入数学模块
print(math.factorial(5))
print(math.factorial(4))
print(math.cos(0)) # 1
用法:
模块名.属性名
如:
print(math.factorial(5))
print(math.cos(0))
函数:
dir(obj)函数,返回所有属性的字符串列表
help(obj)函数,可以查看模块的文档字符串
from import 语句
语法:
from 模块名 import 模块属性名1 [as 属性新名1], 模块属性名2 [as 属性新名2], .....
作用:
将某模块内的一个或多个属性导入到当前模块的作用域
示例:
from math import factorial as fac
from math import sqrt
from math import pi, e, sin, cos
print('5的阶乘是:', fac(5))
print('9的平方根是:', sqrt(9))
print('圆周率是:', pi)
from import * 语句
语法:
from 模块名 import *
作用:
将某模块的所有属性导入到当前模块
示例:
from math import *
print(sin(pi/2))
print(factorial(5)) # 可以直接使用math里的全部属性
dir 函数:
dir([对象]) 返回一个字符串列表
作用:
1.如果没有参数调用,则返回当前作用域内所有变量的列表
2.如果给定一个对象作为参数,则返回这个对象的所有变量的列表
1) 对于一个模块,返回这个模块的全部属性
2) 对于一个类对象,返回类对象的所有变量并递归基类对象的所有变量
3) 对于其它对象返回所有变量,类变量和基类变量
用户自定义模块
要求:
模块名以".py"结尾
模块名必须是标识符的命名规则
避免名称和内建模块冲突
导入方式:
import 语句
from import 语句
from import * 语句
示例:
# 此示例示意自义模块
def myfac(n):
print("正在计算%d的阶乘...." % n)
def mysum(n):
print("正在计算1+2+3+....+", n, '的和....')
name1 = "audi"
name2 = 'Tesla'
print('mymod模块被加载!')
print("我的模块名是:", __name__)
if __name__ == '__main__':
print("我正在以主模块方式运行")
mysum(10000)
import 语句的搜索路径顺序
1. 索引内建模块 builtin
2. 搜索程序的运行时路径(当前路径)
3. sys.path提供的路径
两种方法让用户自定义模块被导入:
1) 将模块安装(复制)到 sys.path提供的路径
2) 在运行程序时,在sys.path里添加自定义的路径
模块的加载过程:
在模块导入时,模块的所有语句都会执行
如果一个模块已经被导入,则再次导入时不会重新执行模块内的语句
模块的重新加载:
import mymod
import imp
imp.reload(mymod)
模块被导入和执行的过程
1. 先搜索相关路径找模块文件(.py文件)
2. 判断是否有此模块对应的.pyc,如果pyc文件存在且比.py文件新则直接加载.pyc文件
3.否则用模块名.py 文件生成.pyc 并加载执行
模块的编译
编译 解释执行
mymod.py ---> mymod.pyc ----> python3
模块的属性
模块的文档字符串
模块内的第一次没有赋值给任何变量的字符串为模块的文档字符串
模块内的文档字符串绑定在模块的__doc__属性上
__doc__ 属性 用来绑定文档字符串
__file__属性
__file__ 属性用于绑定此模块对应的文件路径
__name__属性
作用:
1. 用来记录模块自身的名字
2. 用来判断是否为主模块
(注: 主模块是指程序最先被python3执行的模块)
说明:
当此模块为主模块运行时,__name__的值为'__main__'
当此模块不是主模块时,__name__绑定模块的名字
模块的__all__ 列表:
模块中的__all__列表必须是一个字符串列表
作用:
当用from xxx import *导入时,只导入__all__列表内的属性
示例:
# 此例表限定当用from mymod2 import *时只导入f1和var1
__all__ = ['f1', 'var1']
def f1():
pass
def f2():
pass
def f3():
pass
var1 = 100
var2 = 200
模块的隐藏属性
模块中以'_' 开头的属性,在from xxx import *导入时将不 被导入,通常称这些属性为隐藏属性
包(模块包) Package
包的定义
包是将模块以文件夹的组织形式进行分组管理的方法
作用:
将一系列模块进行分类管理,有利于防止命名冲突
可以在需要时加载一个或部分模块而不是全部模块
包示例:
mypack/
__init__.py
menu.py
games/
__init__.py
contra.py
supermario.py
tanks.py
office/
__init__.py
word.py
excel.py
包内的 __init__.py 文件
__init__.py 是常规包内必须存在的文件
__init__.py 文件会在包加载时被自动调用
作用:
编写此包的内容
编写包的文档字符串
包的导入:
规则类似于模块的导入规则
import 包名 [as 包新名]
import 包名.模块名 [as 模块新名]
import 包名.子包名.模块名 [as 模块新名]
...
from 包名 import 模块名 [as 模块新名]
from 包名.子包名 import 模块名 [as 模块新名]
from 包名.子包名.模块名 import 属性名 [as 属性新名]
...
from 包名 import *
from 包名.模块名 import *
...
import 语句搜索引 包的路径顺序
1. 搜索程序运行时的路径(当前路径)
2. sys.path提供的路径
__init__.py 内的__all__列表
作用:
用来记录此包中有哪儿些子包或模块需要导入
当用from 包 import *语句导入模块时,只查找 __all__ 列表中所有的模块或子包
说明:
__all__列表只有在from xxx import *导入时起作用
包的相对导入
包的相对导入是指包内模块的相互导入
语法:
from 相对路径包或模块名 import 属性或模块名
或
from 相对路径包或模块名 import *
相对路径
在 from 和 import 间可以用相对路径:
. 代表当前目录
.. 代表上一级目录
... 代表上二级目录
.... 以此类推
注: 相对导入时不能超出包的外部
课后习题:
1. 模拟斗地主发牌,牌共 54张
黑桃('\u2660'), 梅花('\u2663'), 方块('\u2665'), 红桃('\u2666')
A2-10JQK
大王,小王
三个人,每个人发17张,底牌留三张
要求:
输入回车,打印第1个人的17张牌
输入回车,打印第2个人的17张牌
输入回车,打印第3个人的17张牌
输入回车,打印三张底牌
2. 打印 九九乘法表:
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
.....
1x9=9 ..............9x9=81
3. 将学生信息管理程序拆分为模块
要求:
1. 主事件循环放在main.py中
2. show_menu 函数放在menu.py中
3. 写学生操作相关的函数放在 student_info.py中
主模块为 main.py