LEGB L>E>G?B
- L:local函数内部作用域
- E:enclosing函数内部与内嵌函数之间
- G:global全局作用域
- B:build-in内置作用域
python 闭包
1.Closure:内部函数中对enclosing作用域变量的引用
2.函数实质与属性
- 函数是一个对象
- 函数执行完成后内部变量回收
- 函数属性
- 函数返回值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
passline = 60 def func(val): if val > = passline: print ( 'pass' ) else : print ( 'failed' ) def in_func(): print (val) in_func() return in_func f = func( 89 ) f() print (f.__closure__) |
一般情况
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
def f_100(val): passline = 60 if val > = passline: print ( 'pass' ) else : print ( 'failed' ) def f_150(val): passline = 90 if val > = passline: print ( 'pass' ) else : print ( 'failed' ) f_100( 89 ) f_150( 89 ) |
闭包
1
2
3
4
5
6
7
8
9
10
11
12
|
def set_passline(passline): def cmp (val): if val > = passline: print ( 'Pass' ) else : print ( 'failed' ) return cmp f_100 = set_passline( 60 ) f_150 = set_passline( 90 ) f_100( 89 ) f_150( 89 ) |
Closure:内部函数中对enclosing作用域变量的引用,它会将enclosing作用域变量传递到内部函数的closure中
闭包的作用:
- 封装
- 代码复用
python闭包二
求和
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
def my_sum( * arg): if len (arg) = = 0 : return 0 for val in arg: if not isinstance (val, int ): # 有一个非int则返回0 return 0 return sum (arg) def my_average( * arg): if len (arg) = = 0 : return 0 for val in arg: if not isinstance (val, int ): # 有一个非int则返回0 return 0 return sum (arg) / len (arg) print (my_sum( 1 , 2 , 3 , 4 , 5 )) print (my_sum( 1 , 2 , 3 , 4 , 5 , '6' )) print (my_aveage( 1 , 2 , 3 , 4 , 5 )) print (my_average()) |
闭包的使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
def my_sum( * arg): return sum (arg) def my_average( * arg): return sum (arg) / len (arg) def dec(func): def in_dec( * arg): # my_sum print ( 'in dec arg= ' ,arg) if len (arg) = = 0 : return 0 for val in arg: if not isinstance (val, int ): return 0 return func( * arg) # 闭包,存在于in_dec函数中的__closure__中,所以可以调用 return in_dec my_sum = dec(my_sum) # 传参 print (my_sum ( 1 , 2 , 3 , 4 , 5 )) print (my_sum ( 1 , 2 , 3 , 4 , 5 , '6' )) # my_sum就是in_dec函数,会先执行参数类型判断,然后执行__closure__中的函数my_sum |
python 装饰器
- 装饰器用来装饰函数
- 返回一个函数对象
- 被装饰函数标识符指向返回的函数对象
- 语法糖 @deco
使用装饰器的方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
def dec(func): def in_dec( * arg): # my_sum print ( 'in dec arg= ' ,arg) if len (arg) = = 0 : return 0 for val in arg: if not isinstance (val, int ): return 0 return func( * arg) # 闭包,存在于in_dec函数中的__closure__中,所以可以调用 return in_dec # 如果没有返回值,则my_sum调用装饰器后为None # my_sum = dec(my_sum) # 不手动传参 @dec # 装饰器将my_sum作为参数传入dec,并返回一个新的函数赋值给my_sum def my_sum( * arg): return sum (arg) def my_average( * arg): return sum (arg) / len (arg) print (my_sum ( 1 , 2 , 3 , 4 , 5 )) print (my_sum ( 1 , 2 , 3 , 4 , 5 , '6' )) |
另一个例子
1
2
3
4
5
6
7
8
9
10
11
12
|
def deco(func): def in_deco(x,y): print ( 'in deco' ) func(x,y) print ( 'call deco' ) return in_deco @deco def bar(x, y): print ( 'in bar' ,x + y) bar( 1 , 2 ) |
以上就是Python中LEGB和闭包及装饰器的介绍,如有疑问请留言或者到本站社区交流讨论,本站关于Python 的文章还有很多,还希望大家搜索查阅,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
原文链接:http://blog.csdn.net/wwwdc1012/article/details/72597720