详解 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标准库之循环器(itertools)介绍
Nov 25 Python
numpy中索引和切片详解
Dec 15 Python
Python爬虫框架Scrapy实例代码
Mar 04 Python
python 获取一个值在某个区间的指定倍数的值方法
Nov 12 Python
12个步骤教你理解Python装饰器
Jul 01 Python
linux环境中没有网络怎么下载python
Jul 07 Python
对python 树状嵌套结构的实现思路详解
Aug 09 Python
python 发送json数据操作实例分析
Oct 15 Python
python中property和setter装饰器用法
Dec 19 Python
python实现简单的购物程序代码实例
Mar 03 Python
python 19个值得学习的编程技巧
Aug 15 Python
Jupyter notebook 不自动弹出网页的解决方案
May 21 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
全国FM电台频率大全 - 20 广西省
2020/03/11 无线电
全国中波电台频率表
2020/03/11 无线电
晶体管来复再生式二管收音机
2021/03/02 无线电
php 常用字符串函数总结
2008/03/15 PHP
通过修改配置真正解决php文件上传大小限制问题(nginx+php)
2015/09/23 PHP
yii2局部关闭(开启)csrf的验证的实例代码
2017/07/10 PHP
laravel 时间格式转时间戳的例子
2019/10/11 PHP
Nigma vs Liquid BO3 第二场2.13
2021/03/10 DOTA
JavaScript SetInterval与setTimeout使用方法详解
2013/11/15 Javascript
浅析JavaScript事件和方法
2015/02/28 Javascript
jQuery实现鼠标滑向当前图片高亮显示并且其它图片变灰的方法
2015/07/27 Javascript
JavaScript 数组中最大最小值
2016/06/05 Javascript
angularjs实现文字上下无缝滚动特效代码
2016/09/04 Javascript
bootstrap实现图片自动轮播
2016/12/21 Javascript
Vue单页面应用保证F5强刷不清空数据的解决方案
2018/01/31 Javascript
JS验证输入的是否是数字及保留几位小数问题
2018/05/09 Javascript
JavaScript设计模式之工厂模式和抽象工厂模式定义与用法分析
2018/07/26 Javascript
js 将线性数据转为树形的示例代码
2019/05/28 Javascript
[03:12]完美世界DOTA2联赛PWL DAY6集锦
2020/11/05 DOTA
详谈在flask中使用jsonify和json.dumps的区别
2018/03/26 Python
opencv python 2D直方图的示例代码
2018/07/20 Python
Python中的元组介绍
2019/01/28 Python
python开发实例之python使用Websocket库开发简单聊天工具实例详解(python+Websocket+JS)
2020/03/18 Python
Python grpc超时机制代码示例
2020/09/14 Python
美国女士时尚珠宝及配饰购物网站:Icing
2018/07/02 全球购物
JS原生实现轮播图的几种方法
2021/03/23 Javascript
教师实习期自我鉴定
2013/10/06 职场文书
外语系毕业生自荐信范文
2013/12/16 职场文书
九年级体育教学反思
2014/01/23 职场文书
电子商务优秀毕业生求职信
2014/07/11 职场文书
2014年教师节座谈会发言稿
2014/09/10 职场文书
教育见习报告范文
2014/11/03 职场文书
大学生求职自荐信
2015/03/24 职场文书
小学安全工作总结2015
2015/05/18 职场文书
pandas数值排序的实现实例
2021/07/25 Python
【海涛dota】偶遇拉娜娅 质量局德鲁伊第一视角解说
2022/04/01 DOTA