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