目录
- 系统模块
- 自定义模块
- 模块的加载与导入
- 模块的属性
- 随机模块
- 包
- 包的导入
1. 系统模块
系统模块 sys :
此模块全部是运行时系统相关信息
函数 | 说明 |
---|---|
sys.path | 模块搜索路径path[0]是当前脚本程序的路径名 |
sys.modules | 已加载模块的字典 |
sys.version | 版本信息字符串 |
sys.version_info | 版本信息的命名元组 |
sys.platform | 操作系统平台名称信息 |
sys.builtin_module_names | 获得python内建模块的名称(字符串元组) |
sys.exit([arg]) | 程序退出,正常退出是sys.exit(0) |
sys.getrecursionlimit() | 得到递归嵌套层次限制(栈的深度) |
2. 自定义模块
函数、对象、类写在 .py 文件里,命名规则与变量名规则相同
模块有各自独立的作用域,使用 "模块名." 隔离开
但 from 模块名 import * 可能引起变量名冲突
模块化编程的优点 :
1.有利于多人合作开发
2.使代码更易于维护
3.提高代码的复用率
3.有利于解决变量名冲突问题
3. 模块的加载与导入
import 语句 搜索模块的路径顺序 :
1.搜索程序运行时的路径(当前路径)
2.sys.path提供的路径
3.搜索内置模块
sys.path是一个存储模块搜索路径的列表 :
1.可以把自定义的模块放在相应的路径下导入
2.可以把自己模块的路径添加在sys.path列表中: sys.path.append()
模块的加载过程 :
1.在模块导入时,模块的所有语句会执行
2.如果一个模块已经导入,则再次导入时不会重新执行模块内的语句
模块的重新加载 :
import 模块名 #首次加载该模块
import imp
imp.reload(模块名) #重新加载该模块
模块被导入和执行的过程 :
1.先搜索相关的路径找模块(.py)
2.判断是否有此模块对应的.pyc文件,如果存在pyc文件,且比.py文件新
则直接加载.py文件(创建时间或最后修改时间)
3.否则用.py文件生成.pyc后在进行加载
pyc 模块的编译文件
编译 执行
mod.py ------->mod.pyc------->python3
4. 模块的属性
属性的本质是变量(是模块内的全局变量)
模块内常用的预置属性
__doc__ 属性
作用:用来绑定模块的文档字符串
模块内第一个没有赋值给任何变量的字符串作为模块的文档
__file__ 属性
作用:用来绑定模块对应的文档路径名
1.对于内建模块不绑定路径(没有__file__属性)
2.对于其他模块,绑定路径名的字符串
__name__ 属性
此属性用来记录模块的自身名称
作用:
1.记录模块名称
2.用来判断是否为主模块(最先运行的模块)
说明:
1.当此模块为主模块时,__name__ 绑定 '__main__'
2.当此模块不是主模块时,此属性绑定模块名
if __name__ = '__main__' :
来判断模块是否被当做主模块
模块的 __all__ 列表 :
模块中的 __all__ 列表是一个用了存放可导出属性的字符串列表
作用:
当使用 from import * 语句导入时,只导入 __all__ 列表内的属性
注 :
在模块前加 __all__ = ["属性1","属性2"]
作用: 使用 from XXX import * 时只导入该模块内的属性1和属性2
不影响 import 模块名 ; 模块名.属性3的使用
模块的隐藏属性 :
模块中以 '_' 开头的属性,在 from import * 语句导入时,
将不被导入,通常称这些属性为隐藏属性
5. 随机模块
random 模块
作用: 用于模拟或生成随机输出的模块
import random as R
函数名 | 说明 |
---|---|
R.random() | 返回一个[0,1)之间的随机实数 |
R.uniform(a,b) | 返回[a,b)区间内的随机实数 |
R.randrange([start,]stop[,step]) | 返回renge(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则用当前时间设置随机种子 |
'''随机生成一个0~100之间的数用x绑定,循环让用户输入一个数用y绑定,
输出猜数字的结果:
'''
import random as R
x = int(R.uniform(0,100))
n = 1
y = int(input('猜猜我想的是几?请输入[0,100)之间数:\n'))
while True :
if y == x :
print('猜对了,你一共猜了 %d 次' % n)
break
elif y > x :
y = int(input('猜大了,再试一次\n'))
n += 1
elif y<x :
y = int(input('猜小了,再试一次\n'))
n += 1
6. 包
表达式 --->语句 --->函数/类 --->模块 --->包
包(模块包) 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 会在包加载时被自动调用
作用:
编写此包的内容
在内部填写文档字符串
在__init__.py 内可以加载此包所依赖的一些其它模块
7. 包的导入
包的导入:
用三条import语句可以导入包(同模块的导入规则)
import 包名 [as 包别名]
import 包名.模块名 [as 模块新名]
import 包名.子包名.模块名
from 包名 import 模块名 [as 模块新名]
from 包名.子包名 import 模块名 [as 模块新名]
from 包名.子包名.模块名 import 属性名 [as 属性新名]
from 包名 import *
from 包名.模块名 import *
...
模拟斗地主发牌,牌共54张
黑桃('\u2660'), 梅花('\u2663'),方块('\u2665'),红桃('\u2666')
大小王
A2-10JQK
三个人玩,每个人发17张牌,底牌留三张
操作:
输入回车: 打印第一个人的17张牌
输入回车: .....二...........
输入回车: .....三...........
输入回车: 打印三张底牌
import random
#生成54张牌
def get_poke():
kinds = ['\u2660','\u2663','\u2665','\u2666']
number = ['A']+list(
map(str,range(2,11)))+['J','Q','K']
L = [x + y for x in kinds
for y in number] +['大王','小王']
return L
def poke_games() :
pk = get_poke()
#洗牌
random.shuffle(pk)
#切片拿牌
input('输入回车继续: ')
print('第一个人的牌为 :',pk[0:17])
input('输入回车继续: ')
print('第二个人的牌为 :',pk[17:34])
input('输入回车继续: ')
print('第三个人的牌为 :',pk[34:51])
input('输入回车继续: ')
print('底牌为 :',pk[51:54])
poke_games()