day12 回顾:
-
装饰器
def 装饰器函数名(被装饰函数形参):
创建闭包
return 闭包@装饰器函数名
def 被装饰函数(形参列表):
pass被装饰函数(实参列表)
-
函数的文档字符串:
def 函数名(…):
‘文档字符串’>>> help(函数名)
__doc__属性
函数名.doc = ‘文档字符串’ -
模块
模块内通常有 数据,函数,类 -
四类模块:
内建模块
标准库模块
第三方模块
自定义模块 -
模块的导入语句有三种:
import 语句
import sys
sys.path
from import 语句
from sys import path
print(path)
from import * 语句
from sys import *
print(path) -
dir() 函数
-
三个模块:
math
time
sys
day13笔记:
自定义模块
-
要求:
模块文件名后缀必须为.py结尾
模块文件名必须是合法的标识符
避免名称和内建模块名冲突 -
导入方式:
import 自定义模块名
from 自定义模块名 import 属性
from 自定义模块名 import * -
import 语句 搜索模块的路径顺序
- 搜索内建模块
- 搜索程序运行时的路径(当前工作目录)
- 搜索sys.path提供的路径
可以在sys.path里添加自定义的路径
如:import sys
sys.path.append("/home/tarena")
imoprt mymod
#可以导入/home/tarena/mymod.py这个模块
-
模块化编程的优点:
- 有利于多人合作开发
- 使代码更加易于维护
- 提高代码的复用率
- 模块化编程有利于解决函数名和变量名冲突(模块内的变量的作用域为模块内为全局)
-
模块的加载过程:
在模块导入时,模块的所有语句会执行
如果一个模块已经导入,则再次导入时不会重新执行模块内的语句 -
模块的重新加载
import mymod
import imp
imp.reload(mymod) # 重新加载mymod模块 -
模块被导入和执行的过程:
- 搜索相关的路径找模块文件.py
- 判断是否有此模块对应的.pyc文件.如果pyc文件比.py文件新则直接加载.pyc文件,否则用.py文件重新生成.pyc文件并加载
-
pyc 模块的编译
编译 执行
mymod.py ----> mymod.pyc ----> pytyon3 -
模块的预置属性
__doc__属性绑定模块的文档字符串
模块的文档字符串是模块内第一个没有赋值给任何变量的字符串__file__属性
file 用来绑定模块所对应的文件路径名__name__属性
- 作用:
- 记录模块名
- 用来判断是否为主模块
说明:
1.当此模块为主模块运行时,__name__绑定’main’ - 当此模块不是主模块运行,而是被其它模块导入时,此模块名为模块文件.py前面的模块名
注:
主模块是指最先被python解释执行器执行的模块
- 作用:
-
模块的 all 列表
__all__列表是一个用来存储可导入属性的字符串列表- 作用:
限制用from xxx imoprt * 语句导入时导入部分属性,而不是全部属性
- 作用:
-
模块的隐藏属性:
模块中以’_’ 开头的属性,在from xxx import * 导入时将不被导入,通常称这些属性为隐藏属性 -
随机模块 random
- 作用:
用于模拟或生成随机输出的模块
文档参见:
python_base_docs_html/随机模块random.html
- 作用:
-
练习:
猜数字游戏:
随机生成一个0~100之间的整数,用变量x绑定
让用户输入一个数y.输出猜数字的结果
1) 如果y等于生成的数x,则提示"恭喜您猜对了",并退出程序
2) 如果y大于x,则提示"您猜大了", 然后继续猜下一次
3) 如果y小于y,则提示"您猜小了", …
直到猜对为止,最后显示用户猜数字的次数后退出程序
包(模块包) package
-
包是将模块以文件夹的组织形式进行分组管理的方法
-
作用:
将一系列模块进行分类管理,有利于防止名字冲突
可以在需要时加载一个或部分模块而不是全部模块
示例:
mypack/
__init__.py
menu.py
games/
__init__.py
contra.py
supermario.py
tanks.py
office/
__init__.py
excel.py
word.py
-
包的导入:
同模块的导入规则基本相同 -
语法:
import 包名 [as 包别名]
import 包名.模块名 [as 模块新名]
import 包名.子包名.模块名 [as 模块新名]
…
from 包名 import 模块名 [as 模块新名]
from 包名.子包名 import 模块名 [as 模块新名]
from 包名.子包名.模块名 import 属性名 [as 属性新名]
…
from 包名 import *
from 包名.模块名 import * -
init.py 文件
此文件是常规包内必须存在的文件,此文件会在包被导入时自动调用- 作用:
编写此包的内容
在内部填写包的文档字符串
在 init.py内可以加载此包所依懒的一些其它模块
示例见:
mypack/init.py
- 作用:
-
包内的__all__列表
作用:
用来记录此包中有哪儿些子包或模块在from import *语句导入时需要被导入 -
说明:
__all__列表只对from xxx import *语句中起作用 -
包的相对导入
包的相对导入是指包内模块的相互导入 -
语法:
from 相对路径包或模块 import 属性或模块名
或
from 相对路径包或模块 import * -
相对路径:
. 代表当前目录
… 代表上一级目录
… 代表上二级目录
… 以此类推
注: 相对导入时不能超出包的外部 -
包的加载路径:
- 当前工作路径:
- sys.path 提供的路径
模块的加载路径设置方法:
sys.path(“新路径”)
-
练习:
-
模拟斗地主发牌,扑克牌54张
花色:
黑桃(’\u2660’), 梅花(’\u2663’), 红桃(’\u2665’), 方块(’\u2666’)
数字:
A2-10JQK
大王,小王
三个人,每个人发17张牌,底牌留三张
输入回车,打印第1个人的17张牌
输入回车,打印第2个人的17张牌
输入回车,打印第3个人的17张牌
输入回车,打印3张底牌 -
修改学生信息管理程序,拆分为模块
要求:- 主事件循环放在 main.py中
- show_menu函数放在menu.py中
- 与学生操作相关的函数放在student_info.py中
-