系统模块全都是运行时系统相关的信息
import sys
sys.path # 模块搜索路径 path[0] 是当前脚本程序的路径
sys.modules # 已加载模块的字典
sys.version # 版本信息
sys.version_info # 版本信息的命名元组
sys.platform # 操作系统平台名称信息
sys.argv # sys.argv绑定用户启动程序时命令行参数的列表
sys.copyright # 获取python版权相关的信息
sys.builtin_module_names # 获取python内建模块的名称(字符串元组)
sys.stdin # 标准输入文件对象,多用于input()
sys.stdout # 标准输出文件对象,多用于print()
sys.stderr # 标准错误输出文件对象,多用于输出错误信息
# sys的方法
sys.exit([arg]) # 退出程序,正常退出是sys.exit(0)
sys.getrecursionlimit() # 得到递归嵌套层次限制(栈的深度)
sys.setrecursionlimit(n) # 得到和修改递归嵌套层次限制(栈的深度)
# 此模块是用户自定义模块
# mymod1.py 文件
def myfun1():
print("正在调用mymod1里的 myfun1()")
def myfun2():
print("正在调用mymod2里的 myfun2()")
name1 = 'xiaomaomao'
name2 = "xiaoxiaomao"
# 导入mymod1并调用相应的数据和函数
# test_mymod1.py文件
import mymod1 # 导入模块
from mymod1 import name2
mymod1.myfun1()
mymod1.myfun2()
print(mymod1.name1)
print(name2)
自定义模块的模块名必须符合标识符的命名规则(同变量名)
模块有各自独立的作用域
# mymod1.py 文件
def myfun1():
print("正在调用mymod1里的 myfun1()")
def myfun2():
print("正在调用mymod2里的 myfun2()")
name1 = 'xiaomaomao'
name2 = "xiaoxiaomao"
# mymod2.py 文件
def myfun1():
print("mymod2.myfun1()")
name1 = "shishi"
# 导入mymod1, mymod2并调用相应的数据和函数
# 各模块内的变量不会冲突
import mymod1 # 导入模块
from mymod1 import name2
import mymod2
mymod1.myfun1()
mymod1.myfun2()
print(mymod1.name1)
print(name2)
mymod2.myfun1()
print(mymod2.name1)
模块化编程的优点:
(1) 有利于多人合作开发
(2) 使代码更易于维护
(3) 提高代码的复用率
(4) 有利于解决变量名冲突问题
import 语句搜索模块的路径顺序
(1) 搜索程序运行时的路径(当前路径)
(2) sys.path 提供的路径
(3) 搜索内置模块
sys.path 是一个存储模块搜索路径的列表
(1) 可以把自定义的模块放在相应的路径下可以导入
(2) 可以把自己模块的路径添加在sys.path列表中
# 模块加载方法(2)
import sys
sys.path.append("模块路径")
import 模块
(1) 在模块导入时,模块的所有语句会执行
(2) 如果一个模块以及导入,则再次导入时不会重新执行模块内的语句
模块的重新加载:
import mymod3
import imp
imp.reload(mymod3) # 重新加载mymod3模块
mymod3.myfun4()
(1) 先搜索相关的路径找模块(.py)
(2) 判断是否有此模块对应的.pyc文件,如果存在.pyc文件且.py文件新,则直接加载.pyc文件
(3) 否则用.py文件生成.pyc后再进行加载
pyc 模块的编译文件:
编译 解释执行
mymod1.py --------> mymod1.pyc --------> python3
属性的实质是变量(是模块内的全局变量)
模块内预置得到属性:
doc 属性:用来绑定模块的文档字符串
'''这是模块的文档字符串的标题
这是文档字符串的内容
此模块包含两个函数和两个变量'''
def f1():
'''这是函数的文档字符串'''
pass
print(__doc__)
print(f1.__doc__)
# 在控制台中输入help(mymod.py)就可以查看模块以及函数的文档字符串
file 属性:file 绑定模块对应的文档路径名
(1) 对于内建模块,不绑定路径(没有__file__属性)
(2) 对于其他模块,绑定路径的字符串
name 属性:用来记录模块的自身名字
作用:
(1) 记录模块名
(2) 用来判断是否为主模块(最先运行的模块)
说明:当此模块为主模块时,name 绑定 ‘main’; 当次模块不是主模块时,此属性绑定模块名。
模块中的__all__列表是一个用来存放可导出属性的字符串列表
作用:当用from import * 语句导入时,只导入__all__列表内的属性
示例:
'''
此模块示意__all__列表的作用和用法
'''
# 限制用from mymod6 import * 时只导入f1, var1
__all__ = ['f1', 'var1']
def f1():
pass
def f2():
pass
def f3():
pass
var1 = "hello"
var2 = "world"
模块中以’_'开头的属性,在from import * 语句导入时,将不被导入,通常称这些属性为隐藏属性。
示例:
'''
此模块示意模块内的隐藏属性
'''
def f1():
pass
def _f2():
'''
此函数在被其他模块用from import * 导入时将不会被导入
'''
pass
var = "变量1"
_var2 = "变量2" # _var2也是隐藏变量,也不会被导入
作用:用于模拟或生成随机输出的模块
# 随机模块
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个随机且不重复的元素
R.getrandbits(nbit) # 以长整型的形式返回用nbit位来表示的
R.seed(a=None) # 用给定的数a设置随机种子
包是将模块以文件夹的形式进行分组管理的方法
作用:将一系列模块进行分类管理,有利于防止命名冲突,可以在需要时加载一个或部分模块而不是全部模块
示例:
__init__.py
menu.py
games/
__init__.py
contra.py
supermario.py
tanks.py
office/
__init__.py
excel.py
word.py
init.py文件:(1) 常规包中必须存在的文件 (2) init.py会在包加载时被自动调用
作用:编写此包的内容;在内部填写文档字符串;在__init__.py内可以加载此包所依赖的一些其他模块
包的导入:
用三条import语句可以导入包(同模块的导入规则)
import 包名 [as 包别名]
import 包名.模块名 [as 模块新名]
import 包名.子包名.模块名
from 包名 import 模块名 [as 模块新名]
from 包名.子包名 import 模块名 [as 模块新名]
from 包名.子包名.模块名 import 属性名 [as 属性新名]
from 包名 import *
from 包名.模块名 import *
包的相对导入是指包内模块的相互导入
语法:from 相对路径包或模块 import 属性或模块名
或 from 相对路径包或模块 import *
相对路径:
. 代表当前目录
… 代表上一级目录
… 代表上两级目录
以此类推
注:相对导入时不能超出包的外部
示例:
# mypack/games/contra.py
def play():
print("正在玩contra")
print("contra模块被加载")
def gameover():
# 用绝对路径导入
# from mypack.menu import show_menu
# 用相对路径导入
from ..menu import show_menu
show_menu()
与模块的加载路径相同
(1) 当前文件夹
(2) sys.path给出的路径