详解 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学习笔记(二)基础语法
Jun 06 Python
如何在Python中编写并发程序
Feb 27 Python
Python实现的单向循环链表功能示例
Nov 10 Python
VSCode下好用的Python插件及配置
Apr 06 Python
python 读入多行数据的实例
Apr 19 Python
Python中return self的用法详解
Jul 27 Python
Python爬虫之UserAgent的使用实例
Feb 21 Python
Python解压 rar、zip、tar文件的方法
Nov 19 Python
使用Pandas将inf, nan转化成特定的值
Dec 19 Python
Python qrcode 生成一个二维码的实例详解
Feb 12 Python
python对execl 处理操作代码
Jun 22 Python
Python如何快速找到多个字典中的公共键(key)
Apr 29 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
jq的get传参数在utf-8中乱码问题的解决php版
2008/07/23 PHP
php设计模式 Adapter(适配器模式)
2011/06/26 PHP
php数组一对一替换实现代码
2012/08/31 PHP
浅析php中三个等号(===)和两个等号(==)的区别
2013/08/06 PHP
最新版本PHP 7 vs HHVM 多角度比较
2016/02/14 PHP
ThinkPHP删除栏目(实现批量删除栏目)
2017/06/21 PHP
Laravel使用RabbitMQ的方法示例
2019/06/18 PHP
laravel 解决Eloquent ORM的save方法无法插入数据的问题
2019/10/21 PHP
单击和双击事件的冲突处理示例代码
2014/04/03 Javascript
jQuery焦点图切换简易插件制作过程全纪录
2014/08/27 Javascript
JavaScript正则表达式之multiline属性的应用
2015/06/16 Javascript
使用 Node.js 模拟滑动拼图验证码操作的示例代码
2017/11/02 Javascript
了解ESlint和其相关操作小结
2018/05/21 Javascript
vue组件中iview的modal组件爬坑问题之modal的显示与否应该是使用v-show
2019/04/12 Javascript
[01:17]炒鸡美酒第四天TA暴走
2018/06/05 DOTA
python网络编程学习笔记(九):数据库客户端 DB-API
2014/06/09 Python
Django配置celery(非djcelery)执行异步任务和定时任务
2018/07/16 Python
用Python实现读写锁的示例代码
2018/11/05 Python
python+mysql实现教务管理系统
2019/02/20 Python
python pytest进阶之xunit fixture详解
2019/06/27 Python
用Python实现BP神经网络(附代码)
2019/07/10 Python
python多线程实现TCP服务端
2019/09/03 Python
Python中的list与tuple集合区别解析
2019/10/12 Python
python使用正则表达式(Regular Expression)方法超详细
2019/12/30 Python
matplotlib 对坐标的控制,加图例注释的操作
2020/04/17 Python
python:HDF和CSV存储优劣对比分析
2020/06/08 Python
Keras实现DenseNet结构操作
2020/07/06 Python
入学申请自荐信范文
2014/02/26 职场文书
政府绩效管理实施方案
2014/05/04 职场文书
感恩祖国演讲稿
2014/09/09 职场文书
职称评定个人总结
2015/03/05 职场文书
企业财务经理岗位职责
2015/04/08 职场文书
纪检监察立案决定书
2015/06/24 职场文书
结婚主持人致辞
2015/07/28 职场文书
团支部组织委员竞选稿
2015/11/21 职场文书
Java使用JMeter进行高并发测试
2021/11/23 Java/Android