详解 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处理二进制数据的方法
Jun 03 Python
Python读写Json涉及到中文的处理方法
Sep 12 Python
谈谈如何手动释放Python的内存
Dec 17 Python
python+selenium实现登录账户后自动点击的示例
Dec 22 Python
python使用Tkinter实现在线音乐播放器
Jan 30 Python
python-str,list,set间的转换实例
Jun 27 Python
Python循环中else,break和continue的用法实例详解
Jul 11 Python
win7下 python3.6 安装opencv 和 opencv-contrib-python解决 cv2.xfeatures2d.SIFT_create() 的问题
Oct 24 Python
Python装饰器使用你可能不知道的几种姿势
Oct 25 Python
python自动化测试之异常及日志操作实例分析
Nov 09 Python
利用pandas将非数值数据转换成数值的方式
Dec 18 Python
Tensorflow获取张量Tensor的具体维数实例
Jan 19 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连接Access数据库的方法小结
2013/06/20 PHP
php header功能的使用
2013/10/28 PHP
PHP图片裁剪函数(保持图像不变形)
2014/05/04 PHP
PHP函数getenv简介和使用实例
2014/05/12 PHP
thinkPHP订单数字提醒功能的实现方法
2016/12/01 PHP
laravel按天、按小时,查询数据的实例
2019/10/09 PHP
javascript的键盘控制事件说明
2008/04/15 Javascript
JavaScript之HTMLCollection接口代码
2011/04/27 Javascript
基于jquery的不规则矩形的排列实现代码
2012/04/16 Javascript
得到form下的所有的input的js代码
2013/11/07 Javascript
javaScript年份下拉列表框内容为当前年份及前后50年
2014/05/28 Javascript
使用CDN和AJAX加速WordPress中jQuery的加载
2015/12/05 Javascript
使用Node.js处理前端代码文件的编码问题
2016/02/16 Javascript
基于zepto的移动端轻量级日期插件--date_picker
2016/03/04 Javascript
javascript实现鼠标点击页面 移动DIV
2016/12/02 Javascript
老生常谈combobox和combotree模糊查询
2017/04/17 Javascript
React教程之Props验证的具体用法(Props Validation)
2017/09/04 Javascript
Javascript中的作用域及块级作用域
2017/12/08 Javascript
vue实现新闻展示页的步骤详解
2019/04/11 Javascript
JavaScript Reflect Metadata实现详解
2019/12/12 Javascript
Element Dialog对话框的使用示例
2020/07/26 Javascript
vue 函数调用加括号与不加括号的区别
2020/10/29 Javascript
[57:31]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第一场 2月1日
2021/03/11 DOTA
python简单程序读取串口信息的方法
2015/03/13 Python
Python中实现参数类型检查的简单方法
2015/04/21 Python
Python压缩解压缩zip文件及破解zip文件密码的方法
2015/11/04 Python
Python中字符串的处理技巧分享
2016/09/17 Python
python+POP3实现批量下载邮件附件
2018/06/19 Python
Django多数据库的实现过程详解
2019/08/01 Python
python双向链表原理与实现方法详解
2019/12/03 Python
Python打包工具PyInstaller的安装与pycharm配置支持PyInstaller详细方法
2020/02/27 Python
Python面向对象特殊属性及方法解析
2020/09/16 Python
纽约市的奢华内衣目的地:Anya Lust
2019/08/02 全球购物
信息专业个人的自我评价
2013/12/27 职场文书
摄影助理岗位职责
2014/02/07 职场文书
解决Golang中ResponseWriter的一个坑
2021/04/27 Golang