# Day_09
## 函数
+ **闭包函数** : (在函数中定义的函数!通过闭包将不同功能模块分离)
+ 必要条件:
+ 函数的嵌套的定义
+ 内部函数使用外部函数的变量
+ 外部函数必须有返回值,返回内部函数名
+ 让函数内部的局部变量,在函数执行完成后,让外部能操作这个变量,延长函数内部局部变量的生命周期
+ 缺点: 占用内存高,存在内存溢出
+ 全局污染 : 全局变量大量出现容易导致重名现象,将独立的某个功能组件,单独在一个函数中实现,最终通过函数与函数之间局部变量的隔离,达到变量数据的隔离
+ 项目开发原则: 开闭原则
+ 对于程序拓展 --> 开放
+ 对程序修改 --> 关闭
+ **装饰器**
+ 语法: 必须是嵌套函数
```
def 装饰器名称(fn):
def wrapper(*args, **kwargs):
目标函数执行前,要添加的代码功能
res = fn(*args, **kwargs)
目标函数执行后,要添加的代码
return res
return wrapper
```
+ 装饰器的应用 : 身份验证、授权验证、资源访问、日志记录、时间统计
+ 装饰器的添加
+ 目标函数的参数
```python
def wrap(fn):
def inner(name, age):
print(f"修改前年龄{age}")
age -= 2
fn(name, age)
return inner
@wrap
def func(name, age):
print(f"name: {name}, age: {age}")
func("小明", 21)
```
+ 外函数接收功能
+ 内函数接收参数
+ 目标函数返回值
## 模块和包的引用方式
+ 模块的命名
+ 根据软件中不同功能命名
+ 不能以中文命名
+ 不要与系统模块名冲突
+ 模块中的代码
+ 文档注释 : 描述模块的版本、功能、开发者、修改日期
+ 引入模块
+ 绝对引入方式: `import 导入`
+ 导入三个路径
1. 系统的 sys.path 路径
2. 环境变量 PythonPATH 路径 [通常没有配置]
3. 当前文件夹
+ 基本导入 [最常用]
+ 语法 : `import 模块`
+ 别名引入
+ 语法 : `import 模块 as 别名`
+ 直接引用模块内容 [不推荐]
+ 语法 : `from 模块 import 变量/函数`
+ 相对引入方式 (对于大型项目中,绝对路径引入可能出现错误,命名重复,相对引入更加精确)
+ 命令的路径表示
+ **. :** : 当前文件夹
+ **.. :** : 上一级文件夹
+ 模块的相对引入
+ 相对引入基本语法 [常用]
+ 当前文件下引用: `from . import 模块`
+ 相对引入别名语法 : `from . import 模块 as 别名`
+ 相对引入具体数据 [不推荐] : `from .模块 import 变量/函数`
## 包
+ 包 (Package) : 程序包的简称,通过文件夹管理 Python 模块
+ 标准程序包 : 包含一个 \_\_init__.py 模块 (包声明模块,可以为空)
+ 绝对引入
+ 绝对引入 [推荐]
+ 语法 : `from 包 import 具体模块`
+ 别名引入 [推荐]
+ 语法 : `from 包 import 具体模块 as 别名`
+ 直接引入 [了解] 自动执行指定包中 \_\_init__.py 文件
+ 语法 : `from . import 模块`
+ 偷懒引入
+ 语法 : `from 模块 import *`
+ 相对引入
+ 相对引入
+ `from . import 模块`
+ 相对引入 |
+ `from .包 import 模块`
+ \_\_name\_\_ (当前文件名) : 如果当前文件被当做模块使用,判断是否允许被执行
`if __name__ == "main": 代码`
## 内置模块
+ **random 模块** (随机模块)
+ 随机小数
+ `random()` : 产生 0-1 之间的随机小数
+ `uniform(a, b)` : 指定范围随机小数
+ 随机整数
+ `randint(a, b)` : 指定范围随机整数,包含开头结尾
+ `randrange(start, stop, [step])` : start, stop 范围内间隔指定步长 (step) 的整数,包含开头不包含结尾
+ 随机选择一个数据
+ `random.choice(lst)` : 随机返回可迭代序列的一个数据
```python
# from random import choice
import random
lst = [1,2,3,4,5]
random.choice(lst)
# choice(lst)
```
+ 打乱
+ `random.shuffle(可迭代序列)` : 打乱列表顺序