如何在Python中使用闭包和装饰器

  介绍

如何在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中使用闭包和装饰器