首页 > 编程 > Python > 正文

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

2020-02-16 02:00:10
字体:
来源:转载
供稿:网友

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

LEGB L>E>G?B

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

python 闭包

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

2.函数实质与属性

函数是一个对象 函数执行完成后内部变量回收 函数属性 函数返回值
passline = 60def func(val):  if val >= passline:    print ('pass')  else:    print ('failed')  def in_func():    print (val)  in_func()  return in_funcf = 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 cmpf_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_decmy_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

使用装饰器的方式

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_sumdef 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'))            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表