详解 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 相关文章推荐
Python设计模式之代理模式实例
Apr 26 Python
基于Python的接口测试框架实例
Nov 04 Python
python实现求最长回文子串长度
Jan 22 Python
python-django中的APPEND_SLASH实现方法
Jun 21 Python
PyQt5重写QComboBox的鼠标点击事件方法
Jun 25 Python
Python随机函数库random的使用方法详解
Aug 21 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
Sep 10 Python
python 字符串常用函数详解
Sep 11 Python
python读取xml文件方法解析
Aug 04 Python
Python用K-means聚类算法进行客户分群的实现
Aug 23 Python
Python如何急速下载第三方库详解
Nov 02 Python
pytorch 预训练模型读取修改相关参数的填坑问题
Jun 05 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在文件指定行中写入代码的方法
2012/05/23 PHP
ini_set的用法介绍
2014/01/07 PHP
php中array_multisort对多维数组排序的方法
2020/06/21 PHP
Symfony2获取web目录绝对路径、相对路径、网址的方法
2016/11/14 PHP
CodeIgniter框架实现的整合Smarty引擎DEMO示例
2019/03/28 PHP
javascript 日期时间函数(经典+完善+实用)
2009/05/27 Javascript
在网站上应该用的30个jQuery插件整理
2011/11/03 Javascript
js实现一个链接打开两个链接地址的方法
2015/05/12 Javascript
浅谈JSON.stringify()和JOSN.parse()方法的不同
2016/08/29 Javascript
JavaScript学习笔记整理_用于模式匹配的String方法
2016/09/19 Javascript
JS对象深度克隆实例分析
2017/03/16 Javascript
vue学习笔记之vue1.0和vue2.0的区别介绍
2017/05/17 Javascript
jQuery中ajax请求后台返回json数据并渲染HTML的方法
2018/08/08 jQuery
ES6的Fetch异步请求的实现方法
2018/12/07 Javascript
JavaScript工具库之Lodash详解
2019/06/15 Javascript
改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件
2019/07/13 Javascript
js实现图片实时时钟
2020/01/15 Javascript
Javascript地址引用代码实例解析
2020/02/25 Javascript
Vue通过getAction的finally来最大程度避免影响主数据呈现问题
2020/04/24 Javascript
JavaScript监听键盘事件代码实现
2020/06/03 Javascript
微信小程序学习总结(二)样式、属性、模板操作分析
2020/06/04 Javascript
解决Echarts2竖直datazoom滑动后显示数据不全的问题
2020/07/20 Javascript
[01:11]steam端dota2实名认证操作流程视频
2021/03/11 DOTA
Python基础中所出现的异常报错总结
2016/11/19 Python
Python正则抓取网易新闻的方法示例
2017/04/21 Python
python遍历文件夹下所有excel文件
2018/01/03 Python
Python读取指定日期邮件的实例
2019/02/01 Python
WxPython建立批量录入框窗口
2019/02/27 Python
详解Python sys.argv使用方法
2019/05/10 Python
python日志logging模块使用方法分析
2019/05/23 Python
django项目登录中使用图片验证码的实现方法
2019/08/15 Python
python如何快速拼接字符串
2020/10/28 Python
html5使用canvas绘制太阳系效果
2014/12/15 HTML / CSS
兼职安全员岗位职责
2015/02/15 职场文书
校长一岗双责责任书
2015/05/09 职场文书
Oracle 区块链表创建过程详解
2021/05/15 Oracle