详解 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 相关文章推荐
对pandas的dataframe绘图并保存的实现方法
Aug 05 Python
Python中一些不为人知的基础技巧总结
May 19 Python
TensorFlow实现简单卷积神经网络
May 24 Python
python 获取url中的参数列表实例
Dec 18 Python
浅谈python requests 的put, post 请求参数的问题
Jan 02 Python
Python2.7实现多进程下开发多线程示例
May 31 Python
浅谈Python大神都是这样处理XML文件的
May 31 Python
python脚本调用iftop 统计业务应用流量的思路详解
Oct 11 Python
python 列表、字典和集合的添加和删除操作
Dec 16 Python
python实现可下载音乐的音乐播放器
Feb 25 Python
Django缓存Cache使用详解
Nov 30 Python
Django框架中视图的用法
Jun 10 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实现清除wordpress里恶意代码
2015/10/21 PHP
PHP获取用户客户端真实IP的解决方案
2016/10/10 PHP
详解PHP归并排序的实现
2016/10/18 PHP
thinkPHP框架实现多表查询的方法
2018/06/14 PHP
复制本贴标题和地址的js代码
2008/07/01 Javascript
从QQ网站中提取的纯JS省市区三级联动菜单
2013/12/25 Javascript
详解JavaScript中localStorage使用要点
2016/01/13 Javascript
jQuery实现只允许输入数字和小数点的方法
2016/03/02 Javascript
JavaScript学习笔记之数组的增、删、改、查
2016/03/23 Javascript
jquery根据一个值来选中select下的option实例代码
2016/08/29 Javascript
浅谈Javascript中的函数、this以及原型
2016/10/09 Javascript
js返回顶部实例分享
2016/12/21 Javascript
VUE开发一个图片轮播的组件示例代码
2017/03/06 Javascript
JS实现上传图片实时预览功能
2017/05/22 Javascript
深入理解Node中的buffer模块
2017/06/03 Javascript
详解jQuery中的isPlainObject()使用方法
2018/02/27 jQuery
Vue.js实现可配置的登录表单代码详解
2018/03/29 Javascript
Angular CLI在Angular项目中如何使用scss详解
2018/04/10 Javascript
JavaScript实现淘宝京东6位数字支付密码效果
2018/08/18 Javascript
实例讲解JavaScript预编译流程
2019/01/24 Javascript
js中数组常用方法总结(推荐)
2019/04/09 Javascript
中级前端工程师必须要掌握的27个JavaScript 技巧(干货总结)
2019/09/23 Javascript
es6中class类静态方法,静态属性,实例属性,实例方法的理解与应用分析
2020/02/15 Javascript
JavaScript实现图片伪异步上传过程解析
2020/04/10 Javascript
Python实现的维尼吉亚密码算法示例
2018/04/12 Python
python 多线程串行和并行的实例
2019/02/22 Python
python issubclass 和 isinstance函数
2019/07/25 Python
python 星号(*)的多种用途
2020/09/21 Python
HTML5 Canvas像素处理使用接口介绍
2012/12/02 HTML / CSS
十月份红领巾广播稿
2014/01/22 职场文书
法人授权委托书样本
2014/09/19 职场文书
夫妻婚内购房协议书
2014/10/05 职场文书
python自动统计zabbix系统监控覆盖率的示例代码
2021/04/03 Python
GoLang中生成UUID唯一标识的实现
2021/05/08 Golang
总结Python连接CS2000的详细步骤
2021/06/23 Python
HTML基础详解(上)
2021/10/16 HTML / CSS