详解 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插件virtualenv搭建虚拟环境
Nov 20 Python
python实现扫描日志关键字的示例
Apr 28 Python
python斐波那契数列的计算方法
Sep 27 Python
pyside+pyqt实现鼠标右键菜单功能
Dec 08 Python
Python爬虫运用正则表达式的方法和优缺点
Aug 25 Python
Pytorch 多维数组运算过程的索引处理方式
Dec 27 Python
keras获得某一层或者某层权重的输出实例
Jan 24 Python
使用卷积神经网络(CNN)做人脸识别的示例代码
Mar 27 Python
Python读取配置文件(config.ini)以及写入配置文件
Apr 08 Python
浅析Python 多行匹配模式
Jul 24 Python
Python中的None与 NULL(即空字符)的区别详解
Sep 24 Python
OpenCV-Python实现人脸美白算法的实例
Jun 11 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
PHPWind与Discuz截取字符函数substrs与cutstr性能比较
2011/12/05 PHP
Windows下部署Apache+PHP+MySQL运行环境实战
2012/08/31 PHP
php给图片添加文字水印方法汇总
2015/08/27 PHP
Gambit vs ForZe BO3 第二场 2.13
2021/03/10 DOTA
JavaScript中两个感叹号的作用说明
2011/12/28 Javascript
Nodejs实现的一个简单udp广播服务器、客户端
2014/09/25 NodeJs
推荐JavaScript实现继承的最佳方式
2014/11/11 Javascript
理解JavaScript的变量的入门教程
2015/07/07 Javascript
手机端转盘抽奖代码分享
2015/09/10 Javascript
Vue学习笔记进阶篇之单元素过度
2017/07/19 Javascript
微信web端后退强制刷新功能的实现代码
2018/03/04 Javascript
JS实现的简单折叠展开动画效果示例
2018/04/28 Javascript
js中自定义react数据验证组件实例详解
2018/10/19 Javascript
小程序server请求微信服务器超时的解决方法
2019/05/21 Javascript
vuex state中的数组变化监听实例
2019/11/06 Javascript
node.js使用stream模块实现自定义流示例
2020/02/13 Javascript
微信小程序如何加载数据库真实数据的实现
2020/03/04 Javascript
[01:02:00]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第三场 1月24日
2021/03/11 DOTA
Python标准库sched模块使用指南
2017/07/06 Python
Python实现Logger打印功能的方法详解
2017/09/01 Python
详解windows python3.7安装numpy问题的解决方法
2018/08/13 Python
使用python模拟高斯分布例子
2019/12/09 Python
Python 文件数据读写的具体实现
2020/01/24 Python
Python实现计算图像RGB均值方式
2020/06/04 Python
windows支持哪个版本的python
2020/07/03 Python
HTML5实现自带进度条和滑块滑杆效果
2018/04/17 HTML / CSS
VICHY薇姿俄罗斯官方网上商店:法国护肤品牌,火山温泉水
2019/11/22 全球购物
Myprotein西班牙官网:欧洲第一大运动营养品牌
2020/02/24 全球购物
护理学专业推荐信
2013/12/03 职场文书
公务员年度考核登记表个人总结
2015/02/12 职场文书
思想工作总结范文
2015/08/12 职场文书
各类场合主持词开场白范文集锦
2019/08/16 职场文书
python批量更改目录名/文件名的方法
2021/04/18 Python
HTML CSS 一个标签实现带动画的抖音LOGO
2022/04/26 HTML / CSS
使用scrapy实现增量式爬取方式
2022/06/21 Python
Java中的Kafka为什么性能这么快及4大核心详析
2022/09/23 Java/Android