闭包
内外函数嵌套,内函数引用外函数作用域下的 非 全局变量,外部函数返回内部函数的对象
优点: 为变量续命 缺点: 浪费内存
# 内外函数嵌套
def outer(a, b):
def inner():
# 内部函数引用外部函数作用域下的非全局变量
print(a + b)
# 外函数返回内函数对象
return inner
outer(5, 9)()
def f1(n):
def f2():
list1 = [i for i in range(1, n+1)]
print(list1)
return f2
f1(9)()
装饰器
在不改变原函数的情况下,对已有函数进行额外的功能扩展。
不修改已有函数的源代码
和调用方式
给已有函数增加新功能
闭包与装饰器的区别:装饰器实质上是一个闭包函数,但是装饰器的参数有且只有一个并且是函数类型的时候,他才是装饰器,否则就是闭包
# 用闭包的思路实现 计算程序使用时间 print("今天天气好晴朗")
import time
def outer(f):
def inner():
start = time.time()
f()
end = time.time()
print(end - start-1)
return inner
@outer #调用 装饰器outer
def func(): # func 传入装饰器的参数 f
print("今天天气好晴朗")
time.sleep(1)
func() # 等同于innr()
通用装饰器
#内函数与被装饰的函数保持一致{参数一致,返回一致}
#定义一个装饰器,给程序增加 print("正在努力执行加法运算") 程序功能 通过传参实现几数相加
def outer(f):
def inner(*args):
print("正在努力执行加法运算")
f(*args)
return inner
@outer
def f1(*args):
print(sum(args))
f1(5, 9, 9, 45, 34)
#定义一个装饰器 给程序中的话添加<p> </p>
def outer(f):
def inner():
return "<p>" + f() + "</p>"
return inner
@outer
def func():
return "人生苦短,我用python"
print(func())
多层装饰器
#第一层装饰器装饰的是 第二层装饰器装饰过的
#第一个装饰器
def outer(f):
def inner():
print("这是装饰器1执行的开始")
f()
print("这是装饰器1执行的结束")
return inner
#第二个装饰器
def outer2(f):
def inner2():
print("这是装饰器2执行的开始")
f()
print("这是装饰器2执行的结束")
return inner2
@outer
@outer2
def func():
print("人生苦短,我用python")
func()
执行结果============>
这是装饰器1执行的开始
这是装饰器2执行的开始
人生苦短,我用python
这是装饰器2执行的结束
这是装饰器1执行的结束