详解 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生成指定尺寸缩略图的示例
May 07 Python
基于asyncio 异步协程框架实现收集B站直播弹幕
Sep 11 Python
python实现给微信公众号发送消息的方法
Jun 30 Python
Python标准库sched模块使用指南
Jul 06 Python
Python使用getpass库读取密码的示例
Oct 10 Python
python中is与双等于号“==”的区别示例详解
Nov 21 Python
Python基础教程之异常详解
Jan 10 Python
Python学习笔记之错误和异常及访问错误消息详解
Aug 08 Python
Python @property及getter setter原理详解
Mar 31 Python
python3+PyQt5+Qt Designer实现界面可视化
Jun 10 Python
Python装饰器详细介绍
Mar 25 Python
Python列表的索引与切片
Apr 07 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的header和asp中的redirect比较
2006/10/09 PHP
采用header定义为文件然后readfile下载(隐藏下载地址)
2014/01/31 PHP
Laravel 5 学习笔记
2015/03/06 PHP
PHP自定义函数判断是否为Get、Post及Ajax提交的方法
2017/07/27 PHP
PHP cookie,session的使用与用户自动登录功能实现方法分析
2019/06/05 PHP
JavaScript null和undefined区别分析
2009/10/14 Javascript
解析javascript系统错误:-1072896658的解决办法
2013/07/08 Javascript
jquery中选择块并改变属性值的方法
2013/07/31 Javascript
Jquery 返回json数据在IE浏览器中提示下载的问题
2014/05/18 Javascript
AngularJS HTML编译器介绍
2014/12/06 Javascript
2014 年最热门的21款JavaScript框架推荐
2014/12/25 Javascript
谈谈jQuery Ajax用法详解
2015/11/27 Javascript
深入理解js中this的用法
2016/05/28 Javascript
AngularJS应用开发思维之依赖注入3
2016/08/19 Javascript
手机浏览器 后退按钮强制刷新页面方法总结
2016/10/09 Javascript
jQuery快速实现商品数量加减的方法
2017/02/06 Javascript
jQuery插件FusionCharts绘制的3D饼状图效果实例【附demo源码下载】
2017/03/03 Javascript
将input框中输入内容显示在相应的div中【三种方法可选】
2017/05/08 Javascript
nodejs中sleep功能实现暂停几秒的方法
2017/07/12 NodeJs
基于AngularJS实现表单验证功能
2017/07/28 Javascript
Angular.js中数组操作的方法教程
2017/07/31 Javascript
koa2实现登录注册功能的示例代码
2018/12/03 Javascript
基于Vue+elementUI实现动态表单的校验功能(根据条件动态切换校验格式)
2019/04/04 Javascript
微信小程序动态显示项目倒计时
2019/06/20 Javascript
微信小程序可滑动月日历组件使用详解
2019/10/21 Javascript
Python之list对应元素求和的方法
2018/06/28 Python
Python+selenium 获取浏览器窗口坐标、句柄的方法
2018/10/14 Python
Django之模型层多表操作的实现
2019/01/08 Python
Python绘制股票移动均线的实例
2019/08/24 Python
Python如何通过Flask-Mail发送电子邮件
2020/01/29 Python
利用pandas向一个csv文件追加写入数据的实现示例
2020/04/23 Python
对照四风自我剖析材料
2014/10/07 职场文书
幼儿园学前班幼儿评语
2014/12/29 职场文书
一年级数学下册复习计划
2015/01/17 职场文书
努力工作保证书
2015/02/28 职场文书
2015年国庆节广播稿
2015/08/19 职场文书