装饰器和闭包函数
# #5.装饰器
def a(f):
print('*****开始*****')
f()#这里的意思是,参数是一个函数被传进来执行,所有a函数是修饰函数,b函数是被修饰的函数
print('*****结束*****')
return 123
@a#加了这个语句之后,a修饰了b,就不用a(b) ,直接运行函数b,也不需要写b()
def b():
print('b函数被执行')
return 456
b#调用被修饰的函数,直接就是写函数名字,装饰器可以用来丰富函数的功能
x=b
print(b)#b函数被修饰函数修饰后,b的返回值就是装饰函数a的返回值123
#https://www.cnblogs.com/cicaday/p/python-decorator.html
# #*******************************************************************************************************
#6.闭包函数
#闭包函数的实例1
# outer是外部函数 a和b都是外函数的临时变量
# def outer( a ):
# b = 10
# # inner是内函数
# def inner():
# #在内函数中 用到了外函数的临时变量
# print(a+b)
# # 外函数的返回值是内函数的引用
# return inner
#
# if __name__ == '__main__':
# demo = outer(5)
# # 在这里我们调用外函数传入参数5
# # 此时外函数两个临时变量 a是5 b是10 ,并创建了内函数,然后把内函数的引用返回存给了demo
# # 外函数结束的时候发现内部函数将会用到自己的临时变量,这两个临时变量就不会释放,会绑定给这个内部函数
#
# # 我们调用内部函数,看一看内部函数是不是能使用外部函数的临时变量
# # demo存了外函数的返回值,也就是inner函数的引用,这里相当于执行inner函数
# demo() # 15
#
#
# demo2 = outer(7)
# demo2()#17
# #***************************************************************************
# #***************************************************************************
#***************************************************************************
#闭包函数的实例2
#闭包,又称闭包函数或者闭合函数,其实和前面讲的嵌套函数类似,不同之处在于,闭包中外部函数返回的不是一个具体的值,而是一个函数。一般情况下,返回的函数会赋值给一个变量,这个变量可以在后面被继续执行调用
# #闭包函数,其中 exponent 称为自由变量
# def nth_power(exponent):
# def exponent_of(base):
# return base ** exponent
# return exponent_of # 返回值是 exponent_of 函数
# square = nth_power(2) # 计算一个数的平方
# cube = nth_power(3) # 计算一个数的立方
# print(square(5)) # 计算 5 的平方
# print(cube(5)) # 计算 5 的立方
# #在上面程序中,外部函数 nth_power() 的返回值是函数 exponent_of(),而不是一个具体的数值。
# #需要注意的是,在执行完 square = nth_power(2) 和 cube = nth_power(3) 后,
# # 外部函数 nth_power() 的参数 exponent 会和内部函数 exponent_of 一起赋值给 squre 和 cube,
# # 这样在之后调用 square(2) 或者 cube(2) 时,程序就能顺利地输出结果,而不会报错说参数 exponent 没有定义。
#
#
# #简单闭包实例
# def adder(x):
# def wrapper(y):
# return x+y
# return wrapper
# adder5=adder(5)#这里将内函数和变量5保存为一个闭包
# print(adder5(3))#这里的adder5就是一个闭包,相当于与一个加数为5的求和的一个函数
# # 记得:闭包的特性就是:内嵌函数会保存它引用的外围函数的变量值。
# #
# # 闭包概念:在一个内部函数中,对外部作用域的变量进行引用,(并且一般外部函数的返回值为内部函数),那么内部函数和被引用的变量等就被认为是闭包。
#************************************************************************************************************
#************************************************************************************************************