详解 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实现的ini文件操作类分享
Nov 20 Python
python自动zip压缩目录的方法
Jun 28 Python
Python面向对象编程中关于类和方法的学习笔记
Jun 30 Python
win10下Python3.6安装、配置以及pip安装包教程
Oct 01 Python
Python统计单词出现的次数
Apr 04 Python
在python下读取并展示raw格式的图片实例
Jan 24 Python
python列表推导式入门学习解析
Dec 02 Python
解决Jupyter Notebook开始菜单栏Anaconda下消失的问题
Apr 13 Python
Django rest framework分页接口实现原理解析
Aug 21 Python
Python 列表推导式需要注意的地方
Oct 23 Python
python 合并多个excel中同名的sheet
Jan 22 Python
Python list去重且保持原顺序不变的方法
Apr 03 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中的Session和Cookie
2013/06/21 PHP
编译PHP报错configure error Cannot find libmysqlclient under usr的解决方法
2014/06/27 PHP
php将HTML表格每行每列转为数组实现采集表格数据的方法
2015/04/03 PHP
全面解析PHP操作Memcache基本函数
2016/07/14 PHP
PHP查询分页的实现代码
2017/06/09 PHP
Javascript前端UI框架Kit使用指南之Kitjs简介
2014/11/28 Javascript
javascript中DOM复选框选择用法实例
2015/05/14 Javascript
在AngularJS应用中实现一些动画效果的代码
2015/06/18 Javascript
jQuery+CSS3文字跑马灯特效的简单实现
2016/06/25 Javascript
js获取当前时间(昨天、今天、明天)
2016/11/23 Javascript
JavaScript编写的网页小游戏,很给力
2017/08/18 Javascript
vue防止花括号{{}}闪烁v-text和v-html、v-cloak用法示例
2019/03/13 Javascript
vue el-table实现行内编辑功能
2019/12/11 Javascript
JS实现的定时器展示简单秒表、页面弹框及跳转操作完整示例
2020/01/26 Javascript
Js参数RSA加密传输之jsencrypt.js的使用
2020/02/07 Javascript
vue如何使用rem适配
2021/02/06 Vue.js
[04:00]DOTA2解说界神雕侠侣 CJ第四天谷子现场过生日
2013/07/30 DOTA
Python使用函数默认值实现函数静态变量的方法
2014/08/18 Python
python算法演练_One Rule 算法(详解)
2017/05/17 Python
K-means聚类算法介绍与利用python实现的代码示例
2017/11/13 Python
Python线程之定位与销毁的实现
2019/02/17 Python
PyQt5实现暗黑风格的计时器
2019/07/29 Python
python计算波峰波谷值的方法(极值点)
2020/02/18 Python
Python 实现平台类游戏添加跳跃功能
2020/03/27 Python
python list等分并从等分的子集中随机选取一个数
2020/11/16 Python
详解CSS3中使用gradient实现渐变效果的方法
2015/08/18 HTML / CSS
Eclipse面试题
2014/03/22 面试题
简述安装Slackware Linux系统的过程
2012/01/12 面试题
Laravel的加密解密与哈希实例讲解
2021/03/24 PHP
学生实习自我鉴定
2013/10/11 职场文书
单位介绍信范文
2014/01/18 职场文书
年会活动策划方案
2014/01/23 职场文书
巡警年度自我鉴定
2014/02/21 职场文书
副董事长岗位职责
2014/04/02 职场文书
公安纪律作风整顿剖析材料
2014/10/10 职场文书
退伍军人感言
2015/08/01 职场文书