如何在Python中使用闭包和装饰器?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
Python是什么意思
Python是一种跨平台的,具有解释性,编译性,互动性和面向对象的脚本语言,其最初的设计是用于编写自动化脚本,随着版本的不断更新和新功能的添加,常用于用于开发独立的项目和大型项目。
<强>闭包强>
1。函数引用
#=utf - 8编码 def test1 (): 打印才能(& # 39;却;能够is test1 ! & # 39;) #调用函数 test1 () #引用函数 ret =test1 #打印id 打印(& # 39;test1 \ t的地址:& # 39;,id (test1)) 打印(& # 39;ret \ t \ t的地址:& # 39;,id (ret)) 打印(& # 39;你会发现test1的地址和ret的地址是一样的! & # 39;) #通过引用调用函数 ret ()
运行结果:
这是test1 !
引用>
test1 ,的地址:139879303947128
ret ,,,的地址:139879303947128
你会发现test1的地址和ret的地址是一样的!
这是test1 !1。什么是闭包
在嵌套函数中,内部函数用到了外部函数的变量,则
称内部函数为闭包。
python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(关闭)。
上代码:
#=utf - 8编码 def 外(num): def 才能;内部(num_in): ,,,return num + num_in ,return 内部 # 10赋值给麻木了 时间=ret 外(10) # 20赋值给了num_in 打印(& # 39;ret (20),=, & # 39;, ret (20)) # 30赋值给了num_in 打印(& # 39;ret (30),=, & # 39;, ret (30))运行结果:
ret (20)=,30
引用>
ret (30)=,40<强>闭包的应用例子一:强>
看代码:
#=utf - 8编码 def line_conf (a, b): def 才能;(x)行: ,,,return * x + b return 才能行 时间=line1 line_conf (1, 1) 时间=line2 line_conf (4, 5) 打印(line1 (5)) 打印(line2 (5))运行结果:
6
引用>
25这个例子中,函数线与变量a, b构成闭包。在创建闭包的时候,我们通过line_conf的参数a, b说明了这两个变量的取的值,这样,我们就确定了函数的最终形式(y=x + 1 x和y=4 + 5)。我们只需要变换参数a, b,就可以获得不同的直线表达函数。由此,我们可以看的到,闭包也具有提高代码可复用性的作用。
如果没有闭包,我们需要每次创建直线函数的时候同时说明a, b, x。这样,我们就需要更多的参数传递,也减少了代码的可移植性。
<强>闭包思考:强>
1。闭包似优化了变量,原来需要类对象完成的工作,闭包也可以完成。
2。由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存。代码如下:
#=utf - 8编码 #定义函数:完成包裹数据 def makeBold(函数): def 才能包装(): ,,,return “& lt; b>“, +, func (), +,“& lt;/b>“ return 才能包装 #定义函数:完成包裹数据 def makeItalic (fn): def 才能包装(): ,,,return “& lt; i>“, +, fn (), +,“& lt;/i>“ return 才能包装 @makeBold def test1 (): return 才能“hello  world-1" @makeItalic def test2 (): return 才能“hello  world-2" @makeBold @makeItalic def test3 (): return 才能“hello  world-3" print (test1 ()) print (test2 ()) print (test3 ())运行结果:
& lt; b>你好world-1
引用>
& lt; i>你好world-2
& lt; b> & lt; i>你好world-3 & lt;/b><>强装饰器(decorator)功能强>
1。引入日志
2。函数执行时间统计
3。执行函数前预备处理
4。执行函数后清理功能
5。权限校验等场景
6。缓存<>强装饰器示例强>
例1:无参数的函数
代码如下:
#=utf - 8编码 得到time import , ctime睡眠 def time_func(函数): def 才能wrapped_func (): ,,,print (& # 39; % s call  at % & # 39; % (func.__name__, ctime ())) ,,,func () return wrapped_func才能 @time_func def foo (): 打印才能(& # 39;小姐:am foo ! & # 39;) foo () 睡眠(2) foo ()如何在Python中使用闭包和装饰器