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


Posted in Python onAugust 03, 2017

详解 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 相关文章推荐
使用matplotlib画散点图的方法
May 25 Python
python操作excel的方法(xlsxwriter包的使用)
Jun 11 Python
解决Python 中英文混输格式对齐的问题
Jul 16 Python
python处理两种分隔符的数据集方法
Dec 12 Python
Django ManyToManyField 跨越中间表查询的方法
Dec 18 Python
matplotlib绘制多个子图(subplot)的方法
Dec 03 Python
python scrapy重复执行实现代码详解
Dec 28 Python
pytorch中tensor张量数据类型的转化方式
Dec 31 Python
python、PyTorch图像读取与numpy转换实例
Jan 13 Python
使用python-pptx包批量修改ppt格式的实现
Feb 14 Python
Python读取Excel数据并生成图表过程解析
Jun 18 Python
python单元测试之pytest的使用
Jun 07 Python
Python 爬虫之超链接 url中含有中文出错及解决办法
Aug 03 #Python
python中MethodType方法介绍与使用示例
Aug 03 #Python
初学python的操作难点总结(新手必看篇)
Aug 03 #Python
python 禁止函数修改列表的实现方法
Aug 03 #Python
详解Python函数可变参数定义及其参数传递方式
Aug 02 #Python
详解Python import方法引入模块的实例
Aug 02 #Python
Python字符串拼接的几种方法整理
Aug 02 #Python
You might like
php+AJAX传送中文会导致乱码的问题的解决方法
2008/09/08 PHP
php递归删除目录与文件的方法
2015/01/30 PHP
常用PHP封装分页工具类
2017/01/14 PHP
利用phpexcel对数据库数据的导入excel(excel筛选)、导出excel
2017/04/27 PHP
jQuery Div中加载其他页面的实现代码
2009/02/27 Javascript
ExtJS下书写动态生成的xml(兼容火狐)
2013/04/02 Javascript
Jquery方式获取iframe页面中的 Dom元素
2014/05/07 Javascript
jquery 新建的元素事件绑定问题解决方案
2014/06/12 Javascript
在HTML中插入JavaScript代码的示例
2015/06/03 Javascript
jQuery 判断图片是否加载完成方法汇总
2015/08/10 Javascript
轻松搞定jQuery.noConflict()
2016/02/15 Javascript
js 上传文件预览的简单实例
2016/08/16 Javascript
javascript+html5+css3自定义提示窗口
2017/06/21 Javascript
深入浅析Node.js单线程模型
2017/07/10 Javascript
微信小程序-getUserInfo回调的实例详解
2017/10/27 Javascript
详解IWinter 一个路由转控制器的 Nodejs 库
2017/11/15 NodeJs
详解vue-admin和后端(flask)分离结合的例子
2018/02/12 Javascript
解决vue动态为数据添加新属性遇到的问题
2018/09/18 Javascript
微信小程序实现的3d轮播图效果示例【基于swiper组件】
2018/12/11 Javascript
Vue源码解析之数据响应系统的使用
2019/04/24 Javascript
JavaScript 实现拖拽效果组件功能(兼容移动端)
2020/11/11 Javascript
Python 条件判断的缩写方法
2008/09/06 Python
在Apache服务器上同时运行多个Django程序的方法
2015/07/22 Python
基于python select.select模块通信的实例讲解
2017/09/21 Python
在Python运行时动态查看进程内部信息的方法
2019/02/22 Python
windows环境中利用celery实现简单任务队列过程解析
2019/11/29 Python
区分python中的进程与线程
2020/08/13 Python
python实现启动一个外部程序,并且不阻塞当前进程
2020/12/05 Python
css3 盒模型以及box-sizing属性全面了解
2016/09/20 HTML / CSS
萨克斯第五大道的折扣店:Saks Fifth Avenue OFF 5TH
2016/08/25 全球购物
内业资料员岗位职责
2014/01/04 职场文书
电子商务网站的创业计划书
2014/01/05 职场文书
安全生产投入制度
2014/01/29 职场文书
科技开发中心办公室主任岗位责任制
2014/02/10 职场文书
世界遗产的导游词
2015/02/13 职场文书
关于JavaScript回调函数的深入理解
2021/06/27 Javascript