Python中闭包、装饰器的概念
1.闭包(Closure)的概念:
内部函数中对enclosing作用域的变量进行引用
1 passline = 60
2 def func(val):
3 print('%x' % id(val))
4 if val >= passline:
5 print('pass')
6 else:
7 print('faild')
8
9 def in_func():
10 print(val)
11
12 in_func()
13 return in_func
14
15 f = func(80)
16 f() #in_func
17 print(f.__closure__)
运行结果:
5d4ff910
pass
80
80
(<cell at 0x000001B37C8B6CD8: int object at 0x000000005D4FF910>,)
按照正常的理解,当执行完func函数后,in_func函数无法使用func函数作用域内的变量val,但是通过上面的代码,可以看到val添加到了in_func的__closure__属性中(in_func的属性__closure__对val变量进行了引用,func执行完成后val没有被释放掉),
也就是说,在函数闭包中,内部函数中对enclosing作用域的变量进行引用,并将引用变量添加到了内部函数__closure__属性中
2.装饰器
所谓装饰器,是用来装饰函数,并且返回一个函数对象
如以下求和与求平均值的两个方法:
def my_sum(*args):
if len(args) == 0:
return 0
for item in args:
if not isinstance(item, int):
return 0
return sum(args) def my_average(*args):
if len(arg) == 0:
return 0
for item in args:
if not isinstance(item, int):
return 0
return sum(args) / len(args) print(my_sum(1,2,3))
print(my_average(2,3,4,'1'))
其中,两个方法中都有相同的一段的容错处理代码:
if len(arg) == 0:
return 0
for item in arg:
if not isinstance(item, int):
return 0
遵循程序设计的DRY原则,这段代码应该进行封装处理,这时便可引入函数闭包
def dec(func):
def in_func(*args):
if len(args) == 0:
return 0
for item in args:
if not isinstance(item, int):
return 0
return func(*args)
return in_func def my_sum(*args):
return sum(args) def my_average(*args):
return sum(args) / len(args) my_sum=dec(my_sum)
my_average=dec(my_average) print(my_sum(1,2,3))
print(my_average(2,3,4,''))
这样就对重复的代码进行了封装。而装饰器是一种语法糖,简化了代码的编写
def dec(func):
print('dec called')
def in_func(*args):
if len(args) == 0:
return 0
for item in args:
if not isinstance(item, int):
return 0
return func(*args)
return in_func @dec
def my_sum(*args):
print('my_sum called')
return sum(args)
@dec
def my_average(*args):
print('my_average called')
return sum(args) / len(args) # my_sum=dec(my_sum)
# my_average=dec(my_average) print(my_sum(1,2,3))
print(my_average(2,3,4,''))
运行结果:
dec called
dec called
my_sum called
6
Python中闭包、装饰器的概念的更多相关文章
- 简单说明Python中的装饰器的用法
简单说明Python中的装饰器的用法 这篇文章主要简单说明了Python中的装饰器的用法,装饰器在Python的进阶学习中非常重要,示例代码基于Python2.x,需要的朋友可以参考下 装饰器对与 ...
- 【Python】python中的装饰器——@
对装饰器本来就一知半解的,今天终于弄清楚了,Python中的装饰器是对装饰者模式的很好运用,简化到骨子里了. python中为什么需要装饰器,看这里:http://www.cnblogs.com/hu ...
- Python 中实现装饰器时使用 @functools.wraps 的理由
Python 中使用装饰器对在运行期对函数进行一些外部功能的扩展.但是在使用过程中,由于装饰器的加入导致解释器认为函数本身发生了改变,在某些情况下——比如测试时——会导致一些问题.Python 通过 ...
- 写python中的装饰器
python中的装饰器主要用于在已有函数实现功能前附加需要输出的信息,下面将用实例展示我如何写装饰器. 首先分别尝试写装饰器装饰一个无参函数和一个有参函数(被装饰函数仅输出,无返回值情况下) def ...
- python中的装饰器decorator
python中的装饰器 装饰器是为了解决以下描述的问题而产生的方法 我们在已有的函数代码的基础上,想要动态的为这个函数增加功能而又不改变原函数的代码 例如有三个函数: def f1(x): retur ...
- python中@property装饰器的使用
目录 python中@property装饰器的使用 1.引出问题 2.初步改善 3.使用@property 4.解析@property 5.总结 python中@property装饰器的使用 1.引出 ...
- 理解Python中的装饰器
文章先由stackoverflow上面的一个问题引起吧,如果使用如下的代码: @makebold @makeitalic def say(): return "Hello" 打印出 ...
- 理解Python中的装饰器//这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档
转自:http://www.cnblogs.com/rollenholt/archive/2012/05/02/2479833.html 这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档 ...
- 【Python】 闭包&装饰器
python中的函数本身就是对象,所以可以作为参数拿来传递.同时其允许函数的层级嵌套定义,使得灵活性大大增加. 闭包 闭包的定义:将函数的语句块与其运行所需要的环境打包到一起,得到的就是闭包对象.比如 ...
- python函数闭包-装饰器-03
可调用对象 callable() # 可调用的(这个东西加括号可以执行特定的功能,类和函数) 可调用对象即 callable(对象) 返回为 True 的对象 x = 1 print(cal ...
随机推荐
- JavaScript基础:创建对象
先来看两种简单的对象创建方式: 1.Object构造函数方法 var person = new Object(); person.name = "Nicholas"; person ...
- Unity随手记
过年11天假期,带娃带了7天,吃吃喝喝.也看了点书,<射雕英雄传>(书)看了一半,还有就是在看<unity官方案例精讲>这本. 随手记一些自觉有价值或者有意思的点. 1. 对脚 ...
- Win下 MySQL数据库安装与配置详解
第一步 从官网下载安装包 (本次只写安装版的32位的mysql) 1. https://www.mysql.com/downloads/ 下载的官网地址 一直滑到最下面 然后点第一个 然后选第一个 这 ...
- Java文件中为什么只能有一个public修饰的类, 并且类名还必须与文件名相同
当编写一个java源代码文件时,此文件通常被称为编译单元(有时也被称为转译单元).每个编译单元都必须有一个后缀名.java,而在编译单元内则可以有一个public类,该类的名称必须与文件的名称相同(包 ...
- esri-leaflet入门教程(2)-地图的HelloWorld
esri-leaflet入门教程(2)-地图的HelloWorld by 李远祥 常言道"君子性非异也,善假于物也".这句话在IT界同样也适用,只不过IT界有更为时髦的说法:&qu ...
- Python自然语言处理学习笔记之信息提取步骤&分块(chunking)
一.信息提取模型 信息提取的步骤共分为五步,原始数据为未经处理的字符串, 第一步:分句,用nltk.sent_tokenize(text)实现,得到一个list of strings 第二步:分词,[ ...
- iOS获取本地时间
NSDate *currentDate = [NSDate date];//获取当前时间,日期 NSDateFormatter *dateFormatter = [[NSDateFormatter a ...
- 11G内存设置一例
11G的内存设置参数有memory_target.memory_max_target.sga_target.pga_aggregate_target等. 一个特别繁忙的数据库,前期内存设置较低,物理内 ...
- bzoj4554: [Tjoi2016&Heoi2016]游戏 二分图匹配
4554: [Tjoi2016&Heoi2016]游戏 Description 在2016年,佳缘姐姐喜欢上了一款游戏,叫做泡泡堂.简单的说,这个游戏就是在一张地图上放上若干个炸弹,看 是否能 ...
- 复制vmware虚拟机后,eth0无法显示问题
1. rm /etc/udev/rules.d/70-persistent-net.rules 2. 删除 /etc/sysconfig/network-scripts/ifcfg-eth0下的UUI ...