详解 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 图片验证码代码
Dec 07 Python
Python的Django中django-userena组件的简单使用教程
May 30 Python
Python简单遍历字典及删除元素的方法
Sep 18 Python
python爬虫实战之爬取京东商城实例教程
Apr 24 Python
python利用正则表达式搜索单词示例代码
Sep 24 Python
Python三种遍历文件目录的方法实例代码
Jan 19 Python
python生成ppt的方法
Jun 07 Python
wxPython+Matplotlib绘制折线图表
Nov 19 Python
Python实现隐马尔可夫模型的前向后向算法的示例代码
Dec 31 Python
python json.dumps中文乱码问题解决
Apr 01 Python
Python魔术方法专题
Jun 19 Python
python中导入 train_test_split提示错误的解决
Jun 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的FTP学习(三)
2006/10/09 PHP
Smarty实现页面静态化(生成HTML)的方法
2016/05/23 PHP
PHP 出现 http500 错误的解决方法
2021/03/09 PHP
JavaScript 事件属性绑定带参数的函数
2009/03/13 Javascript
JavaScript this调用规则说明
2010/03/08 Javascript
JS拖动技术 关于setCapture使用
2010/12/09 Javascript
Javascript跨域请求的4种解决方式
2013/03/17 Javascript
javascript中parentNode,childNodes,children的应用详解
2013/12/17 Javascript
jsonp跨域请求数据实现手机号码查询实例分析
2015/12/12 Javascript
在React框架中实现一些AngularJS中ng指令的例子
2016/03/06 Javascript
第四章之BootStrap表单与图片
2016/04/25 Javascript
js阻止浏览器默认行为触发的通用方法(推荐)
2016/05/15 Javascript
微信小程序 css使用技巧总结
2017/01/09 Javascript
bootstrap下拉框动态赋值方法
2018/08/10 Javascript
vue+axios实现文件下载及vue中使用axios的实例
2018/09/21 Javascript
[40:57]TI4 循环赛第二日 iG vs EG
2014/07/11 DOTA
[02:51]2014DOTA2 TI小组赛总结中国军团全部进军钥匙球馆
2014/07/15 DOTA
[01:56]生活中的妖精之七夕特别档
2016/08/09 DOTA
[49:31]TFT vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
处理Python中的URLError异常的方法
2015/04/30 Python
Python设计模式中单例模式的实现及在Tornado中的应用
2016/03/02 Python
Python编程pygame模块实现移动的小车示例代码
2018/01/03 Python
python生成圆形图片的方法
2020/03/25 Python
selenium如何定位span元素的实现
2021/01/13 Python
python爬虫scrapy框架之增量式爬虫的示例代码
2021/02/26 Python
国际化的太阳镜及太阳镜配件零售商:Sunglass Hut
2016/07/26 全球购物
香港交友网站:be2香港
2018/07/22 全球购物
Watchshop德国:欧洲在线手表No.1
2019/06/20 全球购物
YII2 全局异常处理深入讲解
2021/03/24 PHP
思想专业自荐信范文
2013/12/25 职场文书
庆祝新中国成立65周年“向国旗敬礼”网上签名寄语
2014/09/27 职场文书
三严三实民主生活会发言稿
2014/10/13 职场文书
公司周年庆典致辞
2015/07/30 职场文书
房屋买卖定金协议书
2016/03/21 职场文书
mybatis中sql语句CDATA标签的用法说明
2021/06/30 Java/Android
Python 中的 copy()和deepcopy()
2021/11/07 Python