- 模块Module
模块是一个包含有一系列数据,函数,类等组成的程序组
模块是一个文件,模块文件名通常以.py结尾
作用:让一些相关的数据,函数,类等有逻辑的组织在一起,使逻辑结构更加清晰
模块中的数据,函数和类等可提供给其他模块或程序使用
模块的分类:
(1)内置模块(builtins),在解析器的内部可以直接使用
(2)标准库模块,安装python时已安装且可直接使用
(3)第三方模块(通常为开源),需要自己安装
(4)用户自己完成的模块(可以作为其他人的第三方模块)
- import语句
语法:
import 模块名1 [as 模块新名1][,模块名2 as 模块新名2],…
示例:
#导入数学模块
import math
#将math取别名
#import math as m 之后的sqrt等函数要用m.sqrt()
#导入系统模块sys和os模块
import sys,os
作用:将某模块整体导入到当前模块
函数用法:模块.属性名
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
#这样导入的模块内的函数可以不加模块使用
pow(2,2)
sqrt(4)
fac(5) #5!=120
from import * 语句
语法:from 模块名 import *
说明:将某模块的所有属性都导入到当前模块
不推荐使用,容易出现名称冲突
dir函数:
dir([对象]) 返回一个当前模块内所有变量名称的字符串列表
作用:
一、如果没有参数调用,则返回当前作用域内的所有变量的列表
二、如果给定一个对象作为参数,则返回这个对象的所有变量的列表
(1)对于一个模块,返回这个模块的全部属性
(2)对于一个类对象,返回类对象的所有变量的属性
time模块
时间元组使一个9个整形元素组成的,这9个元组自前至后依次为:
- 四位的年(如:1993)
- 月(1-12)
- 日(1-31)
- 时(0-23)
- 分(0-59)
- 秒(0-59)
- 星期几(0-6,周一是0)
- 元旦开始日(1-366)
- 夏令时修正时间(-1,0 or 1)
注意如果年份值小于100,则会自动转换为加上1900后的值
math中的常用函数
math.e #自然对数的底数
math.ceil(x) #对x向上取整
math.floor(x) #对x向下取整
math.factorial(x) #求x的阶乘
math.fabs(x) #返回浮点数x的绝对值
math.log(x[,base]) #以base为底的x的对数,默认为e为低
math.degree(x) #弧度x转换为度数
math.radiants(x) #度数x转换为弧度
时间模块time
UTC时间为Greenwich时间,是全时间的公认时间
time中常用函数
time.time #返回当前时间距离UTC的秒数
time.sleep(x) #使程序暂停x秒
time.gmtime(x) #用给定秒数转换为用UTC表达的时间元组
#缺省返回当前时间元组
time.asctime([tuple]) #将时间元组转换为日期时间字符串
time.mktime([tuple]) #将本地日期时间元组转换为新纪元秒数时间(UTC为准)
time.localtime([secs]) #将UTC秒数时间转换为日期元组(以本地时间为准)
系统sys模块
sys常用函数
#变量
sys.path #导出模块搜索时的路径
sys.modules #输出已导入模块的字典
sys.version #python解释器版本的字符串
sys.version.info #返回版本号的命名元组
sys.platform #返回当前运行的操作系统的字符串linux、win
sys.argv #绑定用户启动程序时命令行参数的列表
sys.builtin_module_names #返回所有内建模块名称的元组
#方法
sys.exit(arg) #程序在该条代码程序直接退出(完全退出,不论多少层函数)
#正常退出是sys.exit(0)
sys.getrecursionlimit() #得到递归嵌套层次限制(栈的深度)
sys.getrecursionlimit(arg) #设置递归嵌套的层次
- 自定义模块
自定义模块的模块名必须符合"标识符"的命名规则(同变量名,不能以中文、数字开头)
模块有各自独立的作用域,同时导入两个整体模块不会冲突
但以下使用会出现冲突:
#方法1:
from mymod1 import *
from mymod2 import *
#方法2
from mymod1 import name1
from mymod2 import name1
模块化编程优点:
(1)有利于多人合作开发
(2)使代码更易于维护
(3)提高代码的复用率
(4)有利于解决变量名冲突问题
import语句搜索模块的路径顺序
(1)搜索程序运行时的路径(当前路径)
(2)sys.path提供的路径
(3)搜索内置模块
导入方法:
(1)可以将模块文件mv到sys.path的文件夹中,可以不再当前路径下import
在终端下 mv mymod.py [sys.path打印的路径之一]
然后就可以import mymod
(2)在sys.path中追加模块的文件路径
import sys
sys.path.append('home/pinkman/modules/')
import mymod
模块的加载过程:
(1)在模块导入时,模块的所有语句会执行
(2)如果一个模块已经导入,则再次导入时不会重新执行模块的语句
示例:
#mymod模块中有print语句
import mymod
#这里打印:mymod模块被加载
import mymod
#语句执行过一次后再次加载不会执行
#因为python解释器已经把mymod加载到内部了,此时修改mymod文件
#则新加入的mymod语句不会被执行
#可以sys.modules['mymod'] 查询mymod的搜索路径
模块的重新加载:
import mymod
import imp #imp模块专门用来管理导入模块
imp.reload(mymod)
模块导入和执行的过程:
(1)先搜索相关路径找模块(.py)
(2)判断是否有此模块对应的.pyc文件,如果存在pyc文件且比.py文件新,则直接加载.pyc文件
(3)否则用.py
模块的属性
属性的实质是变量(是模块内的全局变量)
模块内预置的属性:
__doc__属性:用来绑定模块的文档字符串
模块内第一个没有赋值给任何变量的字符串为模块的文档字符串
'''这是模块的文档字符串的标题
#书写文档字符串空行上面为标题
这是文档字符串的内容 #空行下面为描述
此模块包含两个函数和两个变量
'''
__file__属性:绑定模块对应的文件路径名
(1)对于内建模块,不绑定路径(没有__file__属性)
(2)对于其他模块,绑定路径名的字符串
__name__属性:此属性用来记录模块的自身名字
作用:
(1)记录模块名
(2)用来判断是否为主模块(最先运行的模块)
说明:
#当此模块为主模块时,__name__绑定 '__main__'
#档次模块不是主模块时,此属性绑定模块名
#验证是否是主模块
def f1():
print('f1被调用')
if __name__ == '__main':
print('mymod.py正在当作主模块运行')
else:
print('mymod.py正在被其他模块导入')
print('模块名为:',__name__)
模块的__all__列表
模块中的__all__列表是一个用来存放可导出属性(import *)的字符串列表
作用:当用from import *语句导入时,只导入__all__列表内的属性
'''此模块示意__all__列表的作用和用法
'''
#限制用from mymod import *时导入的变量数
__all__ = ['f1','var1']
def f1()::
pass
def f2():
pass
def f3():
pass
var1 = 'hello'
var2 = 'world'
#此模块被import *导入时,只导入f1和var1
模块的隐藏属性
模块内以’_’(单下划线)开头的属性,在from import *语句导入时,将不被导入,通常称这些属性为隐藏属性
- random随机模块
random函数:
import random as R
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个随机且不同的元素
- 包(模块包)package
包是将模块以文件夹的组织形式进行分组管理的方法
作用:
将一系列模块进行分类管理,有利于防止命名冲突
可以在需要时加载一个或部分模块而不是全部模块
包示例:
mypack/
__init__.py #可以为空,但必须要有才表示是个包
menu.py
games/
__init__.py
contra.py
supermario.py
tanks.py
office/
__init__.py
excel.py
word.py
init.py文件
常规包内必须存在的文件
init.py会在包加载时被自动调用
作用:
编写此包的内容
在内部编写此包的文档字符串
例如:
#mypack/__init__.py
'''这是mypack包的标题
此包含有一个menu模块
此包还含有两个自包:
games
office
'''
print('mypack包被加载')
import mypack #检查内部是否有__init__.py,若有则是包
#可以当作.py文件的模块加载
包的导入:
用三条import语句可以导入包(同模块的导入的规则)
import 包名 [as 包别名]
import 包名.模块名 [as 模块新名]
import 包名.子包名.模块名
from 包名 import 模块名 [as 模块新名]
from 包名.子包名.模块名 import 属性名 [as 属性新名]
from 包名.子包名.模块名 import 属性名 [as 属性新名]
from 包名 import *
from 包名.模块名 import *
例如:使用menu中的show_menu()函数
#方法1
import mypack.menu
mypack.menu.show_menu()
#方法2
import mypack.menu as m
m.shou_menu()
#方法3
from mypack.menu import show_menu as menu
menu()
说明:包的导入顺序是若先导入大包,则要使用之内的小包仍需导入;若先导入小包,则大包会在小包前也被导入
包的__init__.py文件内的__all__列表
作用:用来记录此包中有哪些子包或模块在用from 包 import *语句导入时是否被导入
说明:__all__列表只对from import *语句起作用
__all__ = ['contra','tanks'] #列表内为模块名
包的相对导入:
包的相对导入是指包内模块的相互导入
语法:
from 相对路径或模块 import 模型或模块名
或
from 相对路径包或模块 import *
相对路径:
. #代表当前目录
.. #代表上一级目录
... #代表上二级目录
.... #以此类推
注:相对导入时不能超出包的外部
包的加载路径:
同模块的加载路径相同
1.当前文件夹
2.sys.path给出的路径