本文摘自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实现简单http服务器
Python中@如何使用
Python中的字典排序如何实现代码说明
Python cookbook(数据结构与算法)将多个映射合并为单个映射
Python爬虫是什么?为什么把Python叫做爬虫?
Python抓取网页乱码的原因及解决方法
Python中如何将列表中的字符串连接成一个长路径的实例
Python有map吗
用Python tkinter实现剪刀石头布小游戏
更多相关阅读请进入《Python》频道 >>
人民邮电出版社
python入门书籍,非常畅销,超高好评,python官方公认好书。
转载请注明出处:木庄网络博客 » 关于Python中LEGB与闭包以及装饰器的具体讲解