详解 Python中LEGB和闭包及装饰器

详解 Python中LEGB和闭包及装饰器

LEGB L>E>G?B

  • L:local函数内部作用域
  • E:enclosing函数内部与内嵌函数之间
  • G:global全局作用域
  • B:build-in内置作用域

python 闭包

1.Closure:内部函数中对enclosing作用域变量的引用

2.函数实质与属性

  • 函数是一个对象
  • 函数执行完成后内部变量回收
  • 函数属性
  • 函数返回值

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__)

一般情况

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)

闭包

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闭包二

求和

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())

闭包的使用

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 装饰器

  1. 装饰器用来装饰函数
  2. 返回一个函数对象
  3. 被装饰函数标识符指向返回的函数对象
  4. 语法糖 @deco

使用装饰器的方式

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'))

另一个例子

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和闭包及装饰器 的全部内容, 来源链接: utcz.com/z/313780.html

回到顶部