详解 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中使用HTMLParser解析html实例
Feb 08 Python
Python中isnumeric()方法的使用简介
May 19 Python
python实时分析日志的一个小脚本分享
May 07 Python
NumPy.npy与pandas DataFrame的实例讲解
Jul 09 Python
python交互界面的退出方法
Feb 16 Python
Python 通过requests实现腾讯新闻抓取爬虫的方法
Feb 22 Python
Python3安装Pillow与PIL的方法
Apr 03 Python
详解PyTorch手写数字识别(MNIST数据集)
Aug 16 Python
python3中的eval和exec的区别与联系
Oct 10 Python
Python全局锁中如何合理运用多线程(多进程)
Nov 06 Python
Python print不能立即打印的解决方式
Feb 19 Python
python运行脚本文件的三种方法实例
Jun 25 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
DC《小丑》11项提名领跑奥斯卡 Netflix成第92届奥斯卡提名最大赢家
2020/04/09 欧美动漫
php下使用以下代码连接并测试
2008/04/09 PHP
PHP fgetcsv 定义和用法(附windows与linux下兼容问题)
2012/05/29 PHP
PHP、Nginx、Apache中禁止网页被iframe引用的方法
2020/10/01 PHP
PHP+MySQL插入操作实例
2015/01/21 PHP
PHP检查网站是否宕机的方法示例
2017/07/24 PHP
JQuery 遮罩层实现(mask)实现代码
2010/01/09 Javascript
基于jQuery UI CSS Framework开发Widget的经验
2010/08/21 Javascript
Js 导出table内容到Excel的简单实例
2013/11/19 Javascript
解决json日期格式问题的3种方法
2014/02/02 Javascript
javascript面向对象之this关键词用法分析
2015/01/13 Javascript
HTML5之WebSocket入门3 -通信模型socket.io
2015/08/21 Javascript
Bootstrap select下拉联动(jQuery cxselect)
2017/01/04 Javascript
基于JS实现网页中的选项卡(两种方法)
2017/06/16 Javascript
webpack多页面开发实践
2017/12/18 Javascript
详解webpack打包nodejs项目(前端代码)
2018/09/19 NodeJs
vue添加class样式实例讲解
2019/02/12 Javascript
小程序实现可拖动的悬浮按钮
2020/09/07 Javascript
Python实现统计单词出现的个数
2015/05/28 Python
举例讲解Python设计模式编程的代理模式与抽象工厂模式
2016/01/16 Python
Python字典操作详细介绍及字典内建方法分享
2018/01/04 Python
使用 Python 实现简单的 switch/case 语句的方法
2018/09/17 Python
Python实现点阵字体读取与转换的方法
2019/01/29 Python
Python模拟登录之滑块验证码的破解(实例代码)
2019/11/18 Python
Python + Requests + Unittest接口自动化测试实例分析
2019/12/12 Python
window环境pip切换国内源(pip安装异常缓慢的问题)
2019/12/31 Python
python模拟预测一下新型冠状病毒肺炎的数据
2020/02/01 Python
python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例
2020/04/02 Python
xadmin使用formfield_for_dbfield函数过滤下拉表单实例
2020/04/07 Python
捷克购买家具网站:JENA nábytek
2020/03/19 全球购物
医学专业个人求职自荐信格式
2013/09/23 职场文书
关于礼仪的演讲稿
2014/01/04 职场文书
校园十佳歌手策划书
2014/01/22 职场文书
2014年保险公司工作总结
2014/11/22 职场文书
梳理总结Python开发中需要摒弃的18个坏习惯
2022/01/22 Python
基于PyQT5制作一个桌面摸鱼工具
2022/02/15 Python