上节回顾
1.函数嵌套
嵌套定义:在一个函数中定义另一个函数
默认情况下 只能在内部使用,内部函数可以访问外层函数中的内容
嵌套调用:在一个函数体中调用了另一个函数
2.名称空间:存放名字与值的内存地方的绑定关系的 内存区域
三个名称空间
内置的
存的是内置的名称,随着解释器的运行而生效,随着解释器的关闭而失效
内置的名称在任何位置都能访问到
全局的
存的是顶着最左边没有任何缩进的名称
全局名称在任何位置都能访问到
局部的
存的是函数内定义的名称,随着函数的运行而生效,随着函数的运行结束而失效
特点:只能在函数内部来访问
名称空间的查找顺序
局部->全局->内置
3.作用域
分为全局和局部
内置的和全局的名称空间被划分为全局作用域
局域名称空间被划分为局部作用域
强调:名称空间与作用域的访问顺序在定义时就已经确定了,与调用无关
4.函数对象
函数可以当做变量来使用,除了变量不能调用外,其他用法都相同
函数是第一类对象
1.函数可以调用
2.函数可以当做容器类型的参数
3.函数可以作为函数的参数
4.函数可以作为函数的返回值
5.闭包函数
什么是闭包函数
闭:它本质也是一个函数,与普通函数的不同之处在于闭包函数是一个被定义在另一个函数的内部的函数,可以直接访问到外层函数中的内容
包:当我们将这个内部函数用return进行返回时,外界就可以拿到这个的内存地址
同时,由于名称空间与作用域是定义时就固定的,无论 你在什么位置调用这个内部函数,它都能够访问到外层的名称,这就体现了包的概念
特点:你拿到这个函数时,不仅仅只有函数地址,还包裹着外层的名称空间内容
装饰器
什么是装饰器?
器:指的是一种工具
装饰,指的是给某个已存在的对象添加装饰品
装饰的目标是为了给被装饰的对象添加新功能
在程序中工具就是函数
如此一来装饰器指的也就是一个函数被装饰者也是一个函数
总结:装饰器就是用一个函数去扩展另一个已存在函数的功能
扩展性是对于一个应用程序来说非常重要的能力,任何应用程序都需要扩展,于是出现了开闭原则
开闭原则
对修改关闭,对扩展开发
不允许修改源代码以及调用方式
装饰器就是一种可以保证不修改源码也不修改调用方式还能给函数添加新功能的方式
语法糖
一种简便写法 使你的语法更简洁
@原来的函数
该语法就可以帮我们完成对原始函数的伪装 注意必须在装饰函数的正上方
在开发时要注意 装饰器必须写在被装饰函数之上
在嵌套多个装饰前时,执行的顺序是 从上往下一次调用 结束的顺序反过来 从下往上
实际开发中 没什么用
装饰器模板
def download():
pass
def outer(func):
def wrapper():
print("扩展的新功能")
download()
print("扩展的新功能")
return wrapper
download=outer(download)
download()
语法糖:@函数名
01无参装饰器
02有参装饰器
有参就在无参外卖再套一层函数
语法糖 @函数名(参数)
函数名.__doc__ 获取文档注释内容
换文档注释