# 将函数作为返回值返回,我们也称为闭包deffn():
a =10# 在函数内部定义一个函数deffn1():print('我是fn1', a)# 输出结果 我是fn1 10# 将内部函数作为返回值返回return fn1
# r是一个函数 是调用fn()后返回的函数 这个函数是在fn内部定义,并不是全局函数
r = fn()print(r())# 输出结果 我是Noneprint(a)# 输出结果 NameError: name 'a' is not defined
# 闭包求多个数的平均值defmake_average():
nums =[]defaverage(n):
nums.append(n)returnsum(nums)/len(nums)return average
a = make_average()print(a(10))# 输出结果 10.0print(a(200))# 输出结果 105.0
nums =[]# 不小心修改变量print(a(300))# 输出结果 170.0
3.装饰器的引入
直接修改函数中的代码来完成需求,会产生以下问题
如果修改的多,修改会比较麻烦
不方便后期维护
违反开闭原则
程序的设计,要求对程序的扩展,关闭对程序的修改
4.装饰器的使用
通过装饰器,可以再不修改原来函数的情况下来对函数进行扩展
在开发过程中,我们都是通过装饰器来扩展函数功能的
defadd(a, b):return a + b
defstart_end(old):defnew_function(*args,**kwargs):print('开始执行')
result = old(*args,**kwargs)# 调用被扩展的函数print('执行结束')return result
return new_function
f = start_end(add)
r = f(2,29)print(r)# 输出结果 # 开始执行# 执行结束# 31