闭包 closure
什么是闭包
闭包是指引用了此函数外部变量的函数
如果一个内嵌函数访问了外部嵌套函数的变量,则这个内嵌函数就是闭包
闭包必须满足三个条件:
1. 必须有一个内嵌函数
2. 内嵌函数必须引用外部函数中的变量
3. 外部函数返回值必须是内嵌函数
示例:
# 写一个函数来创建 x的y次方的函数
def make_power(y):
def fn(x):
return x ** y
return fn
pow2 = make_power(2)
print('5的方平是:', pow2(5))
def pow3(x):
return x ** 3
pow3 = make_power(3)
print('6的三次方是:', pow3(6))
print('5的三次方是:', pow3(5))
pow10 = make_power(10)
print("2的十次方法:", pow10(2))
# 用闭包来创建任意的函数
# f(x) = ax2 + bx + c
def get_fx(a, b, c):
def fx(x):
return a * x ** 2 + b * x + c
return fx
f123 = get_fx(1, 2, 3)
print(f123(20))
print(f123(50))
f654 = get_fx(6, 5, 4)
print(f654(10)) # ...
装饰器 decorator
什么是装饰器
装饰器是一个函数,主要作用是用来包装另一个函数或类(后面才讲)
包装的目的是在不改变原函数(或类名)的情况下改变被包装对象 的行为
函数装饰器
是指装饰器是一个函数,传入的是一个函数,返回的是一个函数
语法:
def 装饰器函数名(参数):
语句块
return 函数对象
@装饰器函数名<换行>
def 函数名(形参列表):
语句块
原理:
被装饰函数的变量(函数名)绑定装饰器函数调用后的返回的函数
示例:
# 此示例示意装饰器函数的定义和调用及装饰原理
def mydeco(fn): # <<<---- 装饰器函数
def fx():
print("fx被调用")
return fx
@mydeco
def myfun():
print("myfun被调用")
# 上述 mydeco的原理是在 def myfun语句调用之后加了如下语句
# myfun = mydeco(myfun)
myfun() # 调用myfun
# 此示例示意装饰器函数用来包装被装饰函数
def mydeco(fn): # <<<---- 装饰器函数
def fx():
print("----这是被装饰函数调用之前----")
fn() # 调用被装饰函数
print("++++这是被装饰函数调用之后++++")
return fx
@mydeco
def myfun():
print("myfun被调用")
myfun() # 调用myfun
# 此示例示意装饰器的应用场合及功能
# ------ 以下是小李写的一个装饰器函数------
def privileged_check(fn):
def fx(name, x):
print("正在进行权限验证.....")
if True:
fn(name, x)
else:
print("权限验证失败")
return fx
# ------ 以下是Eric写的程序-------
@privileged_check
def savemoney(name, x): # 存钱业务
print(name, '存钱', x, '元')
@privileged_check
def withdraw(name, x):
print(name, '取钱', x, '元')
# --------以下是调用者小张写的程序-------
savemoney('小王', 200)
savemoney('小赵', 400)
withdraw('小李', 500)
# 此示例示意装饰器的应用场合及功能
# ------ 以下是小李写的一个装饰器函数------
def privileged_check(fn):
def fx(name, x):
print("正在进行权限验证.....")
if True:
fn(name, x)
else:
print("权限验证失败")
return fx
def message_send(fn):
def fy(n, money):
# print('-----')
fn(n, money) # 调用被装饰函数
print("正在发送短信给", n, '...')
return fy
# ------ 以下是Eric写的程序-------
@message_send
@privileged_check
def savemoney(name, x): # 存钱业务
print(name, '存钱', x, '元')
# 实质:
# savemoney = privileged_check(savemoney)
# savemoney = message_send(savemoney)
@privileged_check
def withdraw(name, x):
print(name, '取钱', x, '元')
# --------以下是调用者小张写的程序-------
savemoney('小王', 200)
# savemoney('小赵', 400)
# withdraw('小李', 500)
函数的文档字符串:
函数内第一次未赋值给任何变量的字符串是此函数的文档字符串
语法:
def 函数名(参数列表):
'函数文档字符串'
语句块
说明:
1. 文档字符串通常用来说明函数的功能和使用方法
2. 在交互模式下,输入:
>>> help(函数名) 可以查看函数的文档字符串
3. 函数的文档字符串绑定在函数的__doc__属性上
示例:
def mysum(n):
'''mysum 函数用来求
1 + 2 + 3 + .... + n 的和
'''
return 100
>>> help(mysum)
函数的 __doc__ 属性
__doc__ 属性用于记录文档字符串
函数的 __name__ 属性
__name__属性用于记录函数名
说明:
以双下划线开头,以双下划线结尾的标识符通常代表python的特殊变量
函数定义的完整语法:
[@装饰器名1]
[@装饰器名2]
[...]
def 函数名(位置形参, *元组形参名, 命名关键字形参, **字典形参):
'文档字符串'
语句块
今天没作业~吼吼吼~~~
想要看更多的课程请微信关注SkrEric的编程课堂