模块
什么是模块
模块是一个包含有一系列数据,函数,类等组成的程序组
模块是一个文件,模块文件名通常以 .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 给出的路径