目录
系统模块sys
自定义模块
''' 此示例示意自定义模块
此模块中有二个函数:
myfac(n), mysum(n)
此模块中有两个数据:
name1, name2
'''
def myfac(n):
'''我是myfac 的文档字符串'''
print("正在计算%d的阶乘!" % n)
def mysum(n):
print("正在计算%d的和!" % n)
name1 = "audi"
name2 = "tesla"
print("mymod 模块被导入")
import mymod
from mymod import name1, name2
mymod.myfac(5)
mymod.mysum(100)
print(mymod.name1)
print(mymod.name2)
print('name1=', name1)
name1 = "魏老师"
print('name1=', name1)
# mymod3 中的内容
print("mymod3模块内的:__name__属性绑定", __name__)
import mymod3
print("我是test_mymod3模块,我最先运行")
print("test_mymod3.__name__ =", __name__)
import 语句搜索模块的路径顺序
1.搜索程序运行时的路径(当前路径)
2.sys.path 提供的路径
3.搜索内置模块
模块的加载过程:
在模块导入时,模块所有语句会执行
如果一个模块已经被导入,则再次导入时不会重新执行模块内的语句
模块的重新加载
import mymod
import imp
imp.reload(mymod) # 在运行时重新加载mymod 模块
模块被导入和执行的过程:
1.先搜索相关路径找模块(.py文件)
2. 判断是否有此模块对应的.py文件,如果.pyc文件比.py文件新,则直接加载.pyc 文件
3.否则用模块.py文件生成 .pyc并加载执行
pyc模块的编译 compile
编译 解释执行
mymod.py ----> mymod.pyc ------>python3
模块的文档字符串
模块内第一个没有赋值给任何变量的字符串为文档字符串
模块的__doc__属性:
用于绑定模块文档字符串
__file__属性
绑定模块对应的文件路径
__name__属性
__name__属性用来记录模块的自身的名字
作用:
1.记录模块名
2.判断是否为主模块
说明:
1. 当此模块作为主模块(也就是第一个运行的模块)运行时,
__name__绑定'__main__'
2.当模块不是主模块时,__name__绑定模块名(文件名去掉.py后缀)
模块的__all__列表
模块中的__all__列表是一个用来存放可导出属性的字符串列表
作用:
限定当用from xxx import*语句导入时,只导入__all__列表内的属性
# __all__ 列表限定其它模块在用from mymod4 import *导入时
# 只导入 'myfun1', 'myfun3', 'name1'
__all__ = ['myfun1', 'myfun3', 'name1']
def myfun1():
print("myfun1被调用")
def myfun2():
print("myfun2被调用")
def myfun3():
print("myfun3被调用")
name1 = 'aaaaa'
name2 = 'bbbbbbb'
模块的隐藏属性
模块中以'_' 开头的属性,在from xxx import *
导入时将不被导入,通常称这些属性为隐藏属性
随机模块random
作用:
随机模块random用于模拟或生成随机输出的模块
文档参见:
随机模块random.html
练习:
猜数字游戏:
随机生成一个0~100的整数,用变量x绑定
让用户输入一个数y,输出猜数字的结果
1).如果y等于x,则提示"恭喜您猜对了",退出程序
2).如果y大于x,则提示"您猜大了"
3).如果y小于x,则提示"您猜小了"
让用户循环输入,知道猜对为止,同时显示用户猜数字的次数后
退出程序
import random
x = random.randrange(101)
# print("x=", x)
count = 0
while True:
y = int(input("请输入您要猜的数字: "))
count += 1
if x == y:
print("恭喜您猜对了!")
break
elif y > x:
print("您猜大了")
else:
print("您猜小了")
print("您共猜了%d次" % count)
包(模块包)package
包是将模块以文件夹的组成形式进行分组管理的方法
作用:
将一系列模块进行分类管理,有利于访问命名冲突
可以在需要时加载一个或部分模块,而不是全部模块
包示例:
mypack/
__init__.py
menu.py
games/
__init__.py
contra.py
supermario.py
tanks.py
office/
__init__.py
excel.py
word.py
powerpoint.py
创建命令:
mkdir mypack
cd mypack
touch __init__.py menu.py
mkdir games office
cd games
touch __init__.py contra.py supermario.py tanks.py
cd ../office
touch __init__.py excel.py word.py powerpoint.py
__init__.py 文件
__init__.py 是常规包内必须存在的文件
__init__.py 会在包加载时被自动调用
作用:
编写此包的内容
在内部填写包的文档字符串
包的导入语法:
# 同模块的导入规则相同
import 包名[as 包别名]
import 包名.模块名[as 模块新名]
import 包名.子包名.模块名[as 模块新名]
from 包名import 模块名[as 模块新名]
from 包名.子包名import 模块名[as 模块新名]
from 包名.子包名.模块名import 属性名[as 属性新名]
from 包名import*
from 包名.子包名import*
...
练习:
1. 模拟'斗地主'发牌
牌共54张
花色:
黑桃('\u2660'), 梅花('\u2663'), 方块('\u2665'), 红桃('\u2666')
大小王
数字:
A0~10JQK
1) 生成54张片
2) 三个人玩牌,每人发17张,底牌留三张
输入回车, 打印第1个人的17张牌
输入回车, 打印第2个人的17张牌
输入回车, 打印第3个人的17张牌
输入回车, 打印3张底牌
2. 将学生信息管理程序拆分成相应的模块:
建议:
main.py # 放主事件循环 main函数及其关相函数
menu.py # 放菜单相关的函数
student_info.py # 放学生信息操作相关的函数
L = ['A'] + [str(x) for x in range(2, 11)] + list("JQK")
# print(L)
kinds = ['\u2660', '\u2663', '\u2665','\u2666']
# print(kinds)
poke = ['大王', '小王']
for k in kinds:
for n in L:
poke.append(k + n)
print("新买的牌:", poke)
poke2 = list(poke) # 复制一份
import random
random.shuffle(poke2) # 洗牌
input()
print("第1个人的17张牌是:", poke2[:17])
input()
print("第2个人的17张牌是:", poke2[17:34])
input()
print("第3个人的17张牌是:", poke2[34:51])
input()
print("底牌是:", poke2[51:])