详解 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生成随机数的方法
Jan 14 Python
python3+PyQt5实现支持多线程的页面索引器应用程序
Apr 20 Python
使用python爬取B站千万级数据
Jun 08 Python
python复制列表时[:]和[::]之间有什么区别
Oct 16 Python
在python2.7中用numpy.reshape 对图像进行切割的方法
Dec 05 Python
对python3中, print横向输出的方法详解
Jan 28 Python
python随机数分布random均匀分布实例
Nov 27 Python
关于Python3 lambda函数的深入浅出
Nov 27 Python
python 实现屏幕录制示例
Dec 23 Python
Pycharm如何导入python文件及解决报错问题
May 10 Python
Python2.x与3​​.x版本有哪些区别
Jul 09 Python
Python代码注释规范代码实例解析
Aug 14 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操作memcache缓存方法分享
2015/06/03 PHP
PHP安装threads多线程扩展基础教程
2015/11/17 PHP
phpStorm+XDebug+chrome 配置详解
2019/04/01 PHP
在laravel框架中使用model层的方法
2019/10/08 PHP
地震发生中逃生十大法则
2008/05/12 Javascript
解决Extjs 4 Panel作为Window组件的子组件时出现双重边框问题
2013/01/11 Javascript
Javascript脚本实现静态网页加密实例代码
2013/11/05 Javascript
append和appendTo的区别以及appendChild用法
2013/12/24 Javascript
js中opener与parent的区别详细解析
2014/01/14 Javascript
javascript限制用户只能输汉字中文的方法
2014/11/20 Javascript
Eclipse配置Javascript开发环境图文教程
2015/01/29 Javascript
使用AngularJS处理单选框和复选框的简单方法
2015/06/19 Javascript
分享10个优化代码的CSS和JavaScript工具
2016/05/11 Javascript
gulp-uglify 与gulp.watch()配合使用时报错(重复压缩问题)
2016/08/24 Javascript
微信小程序去哪里找 小程序到底如何使用(附小程序名单)
2017/01/09 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(上)
2017/04/21 Javascript
node.js将MongoDB数据同步到MySQL的步骤
2017/12/10 Javascript
vue+jquery+lodash实现滑动时顶部悬浮固定效果
2018/04/28 jQuery
js canvas实现橡皮擦效果
2018/12/20 Javascript
vue设计一个倒计时秒杀的组件详解
2019/04/06 Javascript
layui写后台表格思路和赋值用法详解
2019/11/14 Javascript
Vue-router 报错NavigationDuplicated的解决方法
2020/03/31 Javascript
Javascript实现单选框效果
2020/12/09 Javascript
kafka-python批量发送数据的实例
2018/12/27 Python
Python scrapy增量爬取实例及实现过程解析
2019/12/24 Python
python GUI库图形界面开发之PyQt5 Qt Designer工具(Qt设计师)详细使用方法及Designer ui文件转py文件方法
2020/02/26 Python
Django+boostrap 美化admin后台的操作
2020/03/11 Python
Python中使用socks5设置全局代理的方法示例
2020/04/15 Python
CSS3线性渐变简单实现以及该属性在浏览器中的不同
2012/12/12 HTML / CSS
德国旅行、体验和活动的预订平台:Watado
2019/12/04 全球购物
传统软件工程与面向对象的软件工程有什么区别
2012/05/31 面试题
预备党员政审材料
2014/02/04 职场文书
无刑事犯罪记录证明范本
2014/09/29 职场文书
2015年公司中秋节致辞
2015/07/31 职场文书
Vue实现下拉加载更多
2021/05/09 Vue.js
《废话连篇——致新手》——chinapizza
2022/04/05 无线电