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