目录:
标准库 、 包(模块包) package 、 Python 调试器 pdb 模块
系统模块 sys
运行时系统相关的信息和函数
sys模块的变量:
变量 | 描述 |
---|---|
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模块的方法
函数名 | 描述 |
---|---|
sys.exit([arg]) | 退出程序,正常退出时sys.exit(0) |
sys.getrecursionlimit() | 得到递归嵌套层次限制(栈的深度) |
sys.setrecursionlimit(n) | 得到和修改递归嵌套层次限制(栈的深度) |
自定义模块
自定义模块示例
- 文件格式:
|test
——|mymod.py
——|test.py - mymod.py # 被导入模块
# 此文件用来示意自定义模块的定义和导入
def fac(n):
print("正在计算", n, "的阶乘...")
def sum_fac(n):
print("正在计算", n, "的阶乘的和!!")
name1 = 'audi'
name2 = 'tesla'
print("mymod 模块被加载!")
- test.py # 主模块
# 此示例来示意调用mymod.py中的函数和变量
import mymod # 导入自定义的mymod模块
print("---------------------")
mymod.fac(10)
mymod.sum_fac(30)
print("mymod.name1 =", mymod.name1)
name1 = 'home'
导入模块时的路径索引顺序:
- 索引程序的运行时路径(当前路径)
- 搜索 sys.path里提供的路径
- 搜索内置模块
模块化编程的优点:
- 有利于多人合作开发
- 使代码更加易于维护
- 提高代码的复用率
- 模块化编程有助于解决函数名和变量名冲突(重名)问题,模块内的变量的作用域为模块内全局
模块的加载过程
1. 在模块导入时,模块的所有语句都会执行
2. 如果一个模块已经导入,则再次导入时不会重新执行模块内的语句
模块的重新加载:
- 不同版本:
版本 | 方案 |
---|---|
Python 2.x | reload() 是内置函数 |
Python 3.0 - 3.3 | import imp 后 imp.reload(module) |
Python 3.4+ | imp 已经被废弃,取而代之的是 importlib |
模块被导入和执行的过程:
- 先搜索相关路径找模块(.py)
- 判断是否有此模块对应的.pyc文件,如果没有此文件,则用.py文件 生成相应的.pyc文件再进行加载
- 如果文件已经存在,则判断.pyc文件和.py文件的修改时间,再决定是否重新生成.pyc文件
模块的编译 compile
编译 解释执行
mymod.py --->> mymod.pyc ---> python3
模块的文档字符串 :
模块内第一行没有赋值给任何变量的字符串为文档字符
- 此文档字符串可以用help函数查看
示例见:
"""这是mymod2模块的文档字符串 此模块有两个函数和两个变量 此处省略100字... """ def fac(n): print("正在计算", n, "的阶乘...") def sum_fac(n): print("正在计算", n, "的阶乘的和!!") name1 = 'audi' name2 = 'tesla' print("mymod 模块被加载!")
- 说明:
模块的文档字符串被绑定在模块的 doc属性上
file属性
- 用来绑定模块对应的文件路径名
- 示例:
import mymod2
print(mymod2.__file__)
模块的 name 属性:
- 用来记录模块自身的名字
作用:
1. 记录模块名
2. 用来判断是否为主模块
3. name 说明:
1. 当此模块作为主模块(也就是第一个运行的模块)运行时,name绑定’main’
2. 当此模块不是主模块时,模块为名文件名去掉’.py’模块的 all列表
模块中的all列表是一个用来存放可导出属性的字符串列表
作用:
当用from import * 语句导入模块时,只导入 all 列表内的属性
示例:
# 此示例用来示意__all__列表的用法 __all__ = ['fun1', 'name1'] def fun1(): pass def fun2(): pass def fun3(): pass name1 = 'aaaa' name2 = 'bbbb'
模块的隐藏属性:
模块中以’_’ 开头的属性,在from import * 语句导入时,将不会导入,通常称这些属性为隐藏属性
- 示例见:
def fun(): print("hello") def _fun(): print("hello") name = "home" _name = "world"
标准库模块:
随机模块 random
作用:
用于模拟或生成随机数的模块模块函数说明见:
函数名 | 描述 |
---|---|
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则用当前时间设置随机种子 |
3. 练习:
1. 假设可以作为密码的字符有:
A-Z
a-z
0_9
下划线
写一个程序,随机生成六位密码
8z_A63
包(模块包) package
- 包是将模块以文件夹的组织形式进行分组管理的方法
- 作用:
- 将一系列模块进行分类管理,有利于防止命名冲突
- 可以在需要时加载一个或部分模块而不是全部模块
包示例:
#文件接口 mypack/ __init__.py menu.py games/ __init__.py contra.py # 魂斗罗 supermario.py # 超级玛丽 tanks.py # 坦克大战 office/ __init__.py excel.py word.py powerpoint.py
# 包的导入语法: import 包名 [as 包别名] import 包名.模块名 [as 模块新名] import 包名.子包名.模块名 [as 模块新名] from 包名 import 模块名 as 模块新名 from 包名.子包名 import 模块名 [as 模块新名] from 包名.子包名.模块名 import 属性名[as 属性新名] from 包名 import * from 包名.模块名 import *
练习:
- 编写一个闹钟程序,启动时设置定时时间(小时和分钟) 到时间后打印”时间到…..” 然后退出程序
模拟斗地主发牌,扑克牌共54张:
花色:
黑桃(‘\u2660’), 梅花(‘\u2663’), 方块(‘\u2665’), 红桃(‘\u2666’)
数值:
A2-10JQK
大小王
三个人,每人发17张牌,底牌留三张:
输入回车,打印第1个人的17张牌
输入回车,打印第2个人的17张牌
输入回车,打印第3个人的17张牌
再输入回车,打印出三张底牌继续完成学生信息管理项目
init.py 文件
- 是常规包内必须存在的文件,init.py会在导入包时被自动调用
- 作用:
- 编写此包的内容
包个格式要求必须有init.py文件 - 在内部添加包的文档字符串
- 在init.py 文件内可以加载此包所依懒的其它模块
(类似java maven依赖传递)
- 编写此包的内容
示例见:
""" 这是一个用来测试用的包,此处是标题 此包有两个函数: 以下略... """ __all__ = ['games', 'menu'] def fx(): print("我是mypack内的fx()函数") name1 = "我是mypack内的name1变量" import math # 导入其它的包 print("mypack包被加载!", math.factorial(5))
包的all列表
- 作用:
用来记录此包中有哪儿些子包或模块需要导入
当用from 包 import * 语句导入时,只查 找all中的模块或子包 - 说明:
all列表只在from xxx import *语句时起作用 - 说明:
当子包或子包内的模块被导入时,上一层的包也会被先导入
例如:
import mypack.games.contra
# 实质会先导入mypack,再导入games,再导入contra
包的相对导入:
- 包的相对导入是指包内的模块的相互导入
- 语法:
from 相对路径包或模块 import 属性或模块名
或
from 相对路径包或模块 import * - 相对路径:
在 from xxxx import 语句中,xxxx 部分可以使用相对路径
. 代表当前目录
.. 代表上一级目录
… 代表上二级目录
…. 以此类推
注:
1. 相对导入时不能超出包的外部
2. 相对的导入要避免循环导入