模块
什么是模块
- 模块是一个包含有一系列数据,函数,类等组成的程序组
- 模块是一个文件,模块文件名通常以
.py结尾
模块的作用
- 让一些相关的数据,函数,类等有逻辑的组织在一起,使逻辑结构更加清晰
- 模块中的数据,函数和类等可提供给其它模块或程序使用
模块的分类
- 内置模块(
builtins),在解析器的内部可以直接使用 - 标准库模块,安装Python时已安装且可直接使用
- 第三方模块(通常为开源),需要自己安装
- 用户自己完的模块(可以作为其它人的第三方模块)
模块的导入
import 语句
import 模块名1[as 模块新名1][,模块名2 [as 模块新名2]], ...
# 作用:将某模块整体导入到当前模块
# 用法:模块.属性名
# 导入数学模块
import math
# 导入系统模块 sys 和 os 模块
import sys, os
-
dir(obj)函数返回模块所有属性的字符串列表 -
help(obj)可以查看模块相关的文档字符串
from import 语句
from 模块名 import 模块属性名1 [as 属性新名1][,模块属性名2[as 属性新名2], ...]
# 作用:将某模块内的一个或多个属性导入到当前模块的作用域
from math import pi
from math import pow, sqrt
from math import factorial as fac
from import * 语句
from 模块名 import *
# 作用:将某模块的所有属性都导入到当前模块
from math import *
dir 函数
dir([对象]) 返回一个字符串列表
- 如果没有参数调用,则返回当前作用域内的所有变量的列表
- 如果给定一个对象作为参数,则返回这个对象的所有变量的列表
- 对于一个模块,返回这个模块的全部属性
- 对于一个类对象,返回类对象的所有变量,亲递归基类对象的所有变量
- 对于其它对象,返回所有的变量,类变量,基类变量
数学模块
变量
-
math.e自然对数的底e -
math.pi圆周率pi
函数
-
math.ceil(x)对x向上取整,比如x=1.2,返回2 -
math.floor(x)对x向下取整,比如x=1.2,返回1 -
math.sqrt(x)返回x的平方根 -
math.factorial(x)求x的阶乘 -
math.log(x[, base])返回以base为底x的对数, 默认以自然对数e为底 -
math.log10(x)求以10为底``x的对数 -
math.pow(x, y)返回x**y(x的y次方) -
math.fabs(x)返回浮点数x的绝对值 -
math.degree(x)将弧度x转换为角度 -
math.radians(x)将角度x转换为弧度 -
math.sin(x)返回x的正弦(x为弧度) -
math.cos(x)返回x的余弦(x为弧度) -
math.tan(x)返回x的正切(x为弧度) -
math.asin(x)返回x的反正弦(返回值为为弧度) -
math.acos(x)返回x的反余弦(返回值为为弧度) -
math.atan(x)返回x的反正切(返回值为为弧度)
时间模块
时间简介
- 公元纪年是从公元 0000年1月1日0时开始的
- 计算机元年是从1970年1月1日0时开始的,此时时间为0,之后每过一秒时间+1
- UTC 时间 (Coordinated Universal Time) 是从Greenwich时间开始计算的.
- UTC 时间不会因时区问题而产生错误
- DST 阳光节约时间(Daylight Saving Time),又称夏令时, 是一个经过日照时间修正后的时间
时间元组
时间元组是一个9个整型元素组成的,这九个元素自前至后依次为:
- 四位的年(如: 1993)
- 月 (1-12)
- 日 (1-31)
- 时 (0-23)
- 分 (0-59)
- 秒 (0-59)
- 星期几 (0-6, 周一是 0)
- 元旦开始日 (1-366)
- 夏令时修正时间 (-1, 0 or 1)
如果年份值小于100,则会自动转换为加上1900后的值
变量
-
time.altzone夏令时时间与UTC时间差(秒为单位) -
time.daylight夏令时校正时间 -
time.timezone本地区时间与UTC时间差(秒为单位) -
time.tzname时区名字的元组, 第一个名字为未经夏令时修正的时区名,第一个名字为经夏令时修正后的时区名
函数
-
time.time()返回从计算机元年至当前时间的秒数的浮点数(UTC时间为准) -
time.sleep(secs)让程序按给定秒数的浮点数睡眠一段时间 -
time.gmtime([secs])用给定秒数转换为用UTC表达的时间元组(缺省返回当前时间元组) -
time.asctime([tuple])将时间元组转换为日期时间字符串 -
time.mktime(tuple)将本地日期时间元组转换为新纪元秒数时间(UTC为准) -
time.localtime([secs])将UTC秒数时间转换为日期元组(以本地时间为准)
系统模块
系统模块全部是运行时系统相关的信息
变量
-
sys.path模块搜索路径path[0]是当前脚本程序的路径名,否则为 '' -
sys.modules已加载模块的字典 -
sys.version版本信息字符串 -
sys.version_info版本信息的命名元组 -
sys.platform操作系统平台名称信息 -
sys.argv命令行参数argv[0]代表当前脚本程序路径名 -
sys.copyright获得Python版权相关的信息 -
sys.builtin_module_names获得Python内建模块的名称(字符串元组)标准输入输出时会用到 -
sys.stdin标准输入文件对象,多用于input() -
sys.stdout标准输出文件对象,多用于print() -
sys.stderr标准错误输出文件对象, 用于输出错误信息
函数
-
sys.exit([arg])退出程序,正常退出时sys.exit(0) sys.getrecursionlimit()-
sys.getrecursionlimit()得到递归嵌套层次限制(栈的深度) -
sys.setrecursionlimit(n)得到和修改递归嵌套层次限制(栈的深度)
自定义模块
- 开发人员自定义的模块
- 自定义的模块的模块名必须符合"标识符"的命名规则(同变量名)
- 模块有各自独立的作用域,模块内的变量不会冲突
# mymod1.py
def myfun():
print('我是mymod1中myfun')
name= 'audi'
# mymod2.py
def myfun():
print('我是mymod2种的myfun')
name= 'tesla'
# test1.py
import mymod1
# from mymod1 import *
mymod1.myfun() # 我是mymod1中myfun
print(mymod1.name) # audi
# 以下演示模块内的变量不会冲突
# test2.py
import mymod1
import mymod2
mymod1.myfun() # 我是mymod1中myfun
mymod2.myfun() # 我是mymod2中myfun
print(mymod1.name) # audi
print(mymod2.name) # tesla
# 以下演示模块内的变量会冲突
# 后倒入的会覆盖前导入的
# test3.py
from mymod1 import *
from mymod2 import *
myfun() # 我是mymod2中myfun
print(name) # tesla
模块化编程的优点
- 有利于多人合作开发
- 使代码更易于维护
- 提高代码的复用率
- 有利于解决变量名冲突问题
模块的加载与导入
import 语句搜索模块的路径顺序
- 搜索程序运行时的路径(当前路径)
-
sys.path提供的路径 - 搜索内置模块
sys.path 是一个存储模块搜索路径的列表
- 可以把自定义的模块放在相应的路径下可以导入
- 可以把自己模块的路径添加在
sys.path列表中
模块的加载过程
- 在模块导入时,模块的所有语句会执行
- 如果一个模块已经以导入,则再次导入时不会重新执行模块内的语句
模块的重新加载
import mymod3
import imp
imp.reload(mymod3) # 重新加载 mymod3模块
模块导入和执行的过程
- 先搜索相关的路径找模块
.py - 判断是否有此模块对应的
.pyc文件,如果存在pyc文件且比.py文件新,则直接加载.pyc文件 - 否则用
.py文件生成.pyc后再进行加载
模块的属性
属性的实质是变量(是模块内的全局变量)
模块内预置的属性
-
__doc__用来绑定模块的文档字符串 -
__file__绑定模块对应的文档路径名- 对于内建模块,不绑定路径(没有
__file__属性) - 对于其它模块,绑定路径名的字符串
- 对于内建模块,不绑定路径(没有
-
__name__用来记录模块的自身名字- 记录模块名
- 用来判断是否为主模块(最先运行的模块)
- 当此模块为主模块时,
__name__绑定__main__ - 当此模块不是主模块时,此属性绑定模块名
-
__all__用来存放可导出属性的 字符串列表- 当用
from import *语句导入时,只导入__all__列表内的属性
- 当用
模块的隐藏属性
模块中以 _ 开头的属性,在 from import * 语句导入时,将不被导入,通常称这些属性为隐藏属性
随机模块
-
R.random()返回一个[0, 1)之间的随机实数 -
R.uniform(a,b)返回[a,b)区间内的随机实数 -
R.randrange([start,] stop[, step])返回range(start,stop,step)中的随机数 -
R.choice(seq)从序列中返回随意元素 -
R.shuffle(seq[, random])随机指定序列的顺序(乱序序列) -
R.sample(seq,n)从序列中选择n个随机且不重复的元素 -
R.getrandbits(nbit)以长整型的形式返回用nbit位来表示的随机数 -
R.seed(a=None)用给定的数a设置随机种子,不给参数a则用当前时间设置随机种子
包(模块包)
包是将模块以文件夹的组织形式进行分组管理的方法
包的作用
- 将一系列模块进行分类管理,有利于防止命名冲突
- 可以在需要时加载一个或部分模块而不是全部模块
- 一个包内可以有多个子包和模块
- 包可以当做模块来使用

包的示例
__init__.py 文件
常规包内必须存在的文件,__init__.py 会在包加载时被自动调用
- 编写此包的内容
- 在内部填写文档字符串
- 在
__init__.py内可以加载此包所依懒的一些其它模块 - 只有当存在
__init__.py时,文件夹才能被当做一个包 -
__init__.py内的__all__列表- 用来记录此包中有哪儿些子包或模块在用
from 包 import * - 语句导入时是否被调导入
-
__all__列表只对from import *语句起作用 - 可以选择性得加载一些子包和模块
- 用来记录此包中有哪儿些子包或模块在用
包的导入
用三条import语句可以导入包(同模块的导入规则)
import 包名 [as 包别名]
import 包名.模块名 [as 模块新名]
import 包名.子包名.模块名
from 包名 import 模块名 [as 模块新名]
from 包名.子包名 import 模块名 [as 模块新名]
from 包名.子包名.模块名 import 属性名 [as 属性新名]
from 包名 import *
from 包名.模块名 import *
# 示例
import mypack # 导入mypack包
import mypack.menu # 导入mypack下的menu模块
import mypack.games.tanks # 导入mypack下的games包下的tanks模块
from mypack import menu # 导入mypack下的menu模块
from mypack.office import excel # 导入mypack下的offie包下的excel模块
包的相对导入
包的相对导入是指包内模块的相互导入
from 相对路径包或模块 import 属性或模块名
from 相对路径包或模块 import *
相对路径
-
.代表当前目录 -
..代表上一级目录 -
...代表上二级目录 -
....以此类推
相对导入时不能超出包的外部
包的加载路径
- 当前文件夹
-
sys.path给出的路径