详解 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删除指定目录下过期文件的2个脚本分享
Apr 10 Python
matplotlib绘制符合论文要求的图片实例(必看篇)
Jun 02 Python
python使用fcntl模块实现程序加锁功能示例
Jun 23 Python
Python tkinter模块中类继承的三种方式分析
Aug 08 Python
python的staticmethod与classmethod实现实例代码
Feb 11 Python
PyQt5每天必学之单行文本框
Apr 19 Python
对python读取zip压缩文件里面的csv数据实例详解
Feb 08 Python
softmax及python实现过程解析
Sep 30 Python
python将字符串转变成dict格式的实现
Nov 18 Python
python对Excel按条件进行内容补充(推荐)
Nov 24 Python
Django Form and ModelForm的区别与使用
Dec 06 Python
Python中logging日志库实例详解
Feb 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&mysql 日期操作小记
2012/02/27 PHP
浅析HTTP消息头网页缓存控制以及header常用指令介绍
2013/06/28 PHP
php 读取文件头判断文件类型的实现代码
2013/08/05 PHP
基于preg_match_all采集后数据处理的一点心得笔记(编码转换和正则匹配)
2014/01/31 PHP
php导出excel格式数据问题
2014/03/11 PHP
php遍历CSV类实例
2015/04/14 PHP
php7连接MySQL实现简易查询程序的方法
2020/10/13 PHP
jquery uaMatch源代码
2011/02/14 Javascript
jQuery 遍历- 关于closest() 的方法介绍以及与parents()的方法区别分析
2013/04/26 Javascript
javascript setTimeout和setInterval计时的区别详解
2013/06/21 Javascript
js获取下拉列表框中的value和text的值示例代码
2014/01/11 Javascript
js四舍五入数学函数round使用实例
2014/05/09 Javascript
jQuery分组选择器用法实例
2014/12/23 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
2015/05/14 Javascript
js 判断所选时间(或者当前时间)是否在某一时间段的实现代码
2015/09/05 Javascript
javascript移动开发中touch触摸事件详解
2016/03/18 Javascript
基于javascript实现九九乘法表
2016/03/27 Javascript
判断数组是否包含某个元素的js函数实现方法
2016/05/19 Javascript
简单的js表格操作
2016/09/24 Javascript
JS获取浮动(float)元素的style.left值为空的快速解决办法
2017/02/19 Javascript
vue单页面实现当前页面刷新或跳转时提示保存
2018/11/02 Javascript
详解express使用vue-router的history踩坑
2019/06/05 Javascript
[00:32]2018DOTA2亚洲邀请赛VGJ.T出场
2018/04/03 DOTA
python中ConfigParse模块的用法
2014/09/29 Python
使用Python编写Prometheus监控的方法
2018/10/15 Python
python贪吃蛇游戏代码
2020/04/18 Python
Python selenium根据class定位页面元素的方法
2019/02/26 Python
Python&&GDAL实现NDVI的计算方式
2020/01/09 Python
Python非单向递归函数如何返回全部结果
2020/12/18 Python
html5图片上传预览示例分享
2014/04/14 HTML / CSS
探讨HTML5移动开发的几大特性(必看)
2015/12/30 HTML / CSS
电脑售后服务承诺书
2014/03/27 职场文书
2014年村党支部工作总结
2014/12/04 职场文书
公司人事任命通知
2015/04/20 职场文书
《猴王出世》教学反思
2016/02/23 职场文书
什么是css原子化,有什么用?
2022/04/24 HTML / CSS