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

发布时间 - 2026-01-11 02:37:40    点击率:

详解 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和闭包及装饰器的介绍,如有疑问请留言或者到本站社区交流讨论,本站关于Python 的文章还有很多,还希望大家搜索查阅,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Python中LEGB和闭包及装饰器  # Python  # 闭包  # LEGB  # Python必备基础之闭包和装饰器知识总结  # python高级语法之闭包和装饰器详解  # Python闭包装饰器使用方法汇总  # 深入理解python中的闭包和装饰器  # Python 中闭包与装饰器案例详解  # 中对  # 有一个  # 返回值  # 是一个  # 如有  # 希望能  # 如果没有  # 希望大家  # 谢谢大家  # 会将  # 还有很多  # 会先  # 内嵌  # 后为  # 复用  # 疑问请  # 一个函数  # 完成后  # func  # val 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 做企业网站制作流程,企业网站制作基本流程有哪些?  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  nginx修改上传文件大小限制的方法  手机网站制作与建设方案,手机网站如何建设?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  js实现获取鼠标当前的位置  如何快速生成高效建站系统源代码?  Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  Laravel怎么清理缓存_Laravel optimize clear命令详解  Laravel怎么实现模型属性的自动加密  高防服务器租用首荐平台,企业级优惠套餐快速部署  如何快速搭建高效简练网站?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  如何快速上传自定义模板至建站之星?  JavaScript中的标签模板是什么_它如何扩展字符串功能  node.js报错:Cannot find module 'ejs'的解决办法  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  专业商城网站制作公司有哪些,pi商城官网是哪个?  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  javascript基于原型链的继承及call和apply函数用法分析  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  Laravel如何使用.env文件管理环境变量?(最佳实践)  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  如何在阿里云购买域名并搭建网站?  如何快速搭建二级域名独立网站?  如何在阿里云虚拟主机上快速搭建个人网站?  详解MySQL数据库的安装与密码配置  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  如何快速登录WAP自助建站平台?  如何用景安虚拟主机手机版绑定域名建站?  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  动图在线制作网站有哪些,滑动动图图集怎么做?  深圳网站制作的公司有哪些,dido官方网站?  javascript如何操作浏览器历史记录_怎样实现无刷新导航  成都网站制作公司哪家好,四川省职工服务网是做什么用?  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  如何在 Pandas 中基于一列条件计算另一列的分组均值  如何用PHP快速搭建CMS系统?