本文摘自php中文网,作者黄舟,侵删。
这篇文章主要介绍了详解 Python中LEGB和闭包及装饰器的相关资料,主要介绍了函数作用域和闭包的理解和使用方法及Python中的装饰器,需要的朋友可以参考下详解 Python中LEGB和闭包及装饰器
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 ):
return 0
return sum (arg)
def my_average( * arg):
if len (arg) = = 0 :
return 0
for val in arg:
if not isinstance (val, int ):
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):
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)
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' ))
|
python 装饰器
装饰器用来装饰函数
返回一个函数对象
被装饰函数标识符指向返回的函数对象
语法糖 @deco
使用装饰器的方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | def dec(func):
def in_dec( * arg):
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)
return in_dec
@dec
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 | 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字符串格式化的方法介绍
Python中swapcase是什么意思
Python在每个字符后添加空格的实例
Python //什么意思
Python如何另起一行
Python图片转字符画代码是什么
Python中关于eval函数与ast.literal_eval使用的区别介绍(图文)
Python数据怎么处理numpy.median
怎么安装Python包
Python中的命名空间和范围
更多相关阅读请进入《Python》频道 >>
人民邮电出版社
python入门书籍,非常畅销,超高好评,python官方公认好书。
转载请注明出处:木庄网络博客 » 关于Python中LEGB与闭包以及装饰器的具体讲解