python之闭包与装饰器
python闭包与装饰器
闭包
在函数内部定义的函数包含对外部的作用域,而不是全局作用域名字的引用,这样的函数叫做闭包函数。
示例:
#----------------------------------
name='tom'
def func():
name='jack'
def bar():
print(name)
return bar
f = func() # f = bar
f() # 调用bar()
#输出结果:
jack
上述代码运行结果打印的是jack而不是tom,bar这个函数就是闭包函数。
闭包函数属性:
闭包函数是内部函数
包含对外部作用域而非全局作用域的引用
闭包函数特点:
自带作用域
延迟计算
注意:
函数的作用域关系在函数定义阶段就已经固定,与调用位置无关,无论函数在何处调用,都需要回到定义阶段去找对应的作用域关系。
查看一个函数是否是闭包函数可以使用__closure__方法:
name='tom'
def func():
name='jack'
def bar():
print(name)
return bar
f = func() # f = bar
f() # 调用bar()
print(f.__closure__) #如果是闭包函数返回引用的外部作用域对象
print(f.__closure__[0].cell_contents)
#返回闭包函数引用外部作用域的值,[0]就是取第一个对象的值,有多个也可以这样取出
总结
闭包函数的基本形式:
# def 外部函数名():
# 内部函数需要的变量
# def 内部函数():
# 引用外部变量
# return 内部函数
装饰器
装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。概括的讲,装饰器的作用就是为已经存在的函数或对象添加额外的功能,使用装饰器能够使用原函数名调用实现除了原来功能之外的扩展功能。
定义比较抽象,下面举个例子:
def deco(func):
def wrapper(*args,**kwargs): #这个就相当于是修饰后的新函数
print('before')
res = func(*args,**kwargs) #意味着传入函数可以接收可变长参数
print('after')
return res #这个返回值就是传入函数的返回值
return wrapper
@deco #将下面的foo作为参数传入deco(),等同于foo = deco(foo),这时候的foo = wrapper
def foo(x,y):
print('this is foo')
return x+y
foo(2,3) #调用foo其实就是执行wrapper
# print(foo(2,3)) #测试返回值
装饰器的原则
不能修改被装饰的函数的源代码
不能修改被装饰的函数的调用方式
装饰器的作用
在不修改被装饰对象源代码以及调用方式的前提下为期添加新功能
多个装饰器调用
@auth #foo = auth(time(foo))
@time #foo = time(foo)
def foo():
pass
调用顺序可以理解为:先调用auth,再调用time,再调用foo。总结就是从外到内(从上往下)执行,判断调用关系就是从内到外。相当于给foo函数增加了time功能和auth两个功能,包了两层,一层一个功能。
有参装饰器
上面说的装饰器函数都是无参装饰器,还有一种是有参装饰器,有参装饰器其实就是在无参装饰器函数外面再包了一个变量。
示例:
def deco(type):
def auth(func):
def wrapper(*args,**kwargs):
if type == 'file':
print('file auth')
res = func(*args,**kwargs)
return res
elif type == 'ldap':
print('ldap auth')
elif type == 'mysql':
print('mysql auth')
else:
print('other auth')
return wrapper
return auth
@deco('file') #执行deco('file')返回auth,然后@auth,index = auth(index) 所以最终执行index()还是wrapper()函数,不过不同的是包括了type='file'
def index():
print('welcome to index')
index()
#执行结果:
file auth
welcome to index
python之闭包与装饰器的更多相关文章
- Python函数编程——闭包和装饰器
Python函数编程--闭包和装饰器 一.闭包 关于闭包,即函数定义和函数表达式位于另一个函数的函数体内(嵌套函数).而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量.参数.当其中一个 ...
- Python之闭包and装饰器
闭包和装饰器是Python中非常重要的一种语法格式,在日常工作中应用非常广泛. 首先,我先为大家简单的介绍一下闭包的概念. 闭包:闭包是在函数嵌套的基础上,内层函数使用到外层函数的变量,且外层函数返回 ...
- 关于python的闭包与装饰器的实验
首先看闭包,在嵌套函数内添加返回值,可以通过外部函数读取内部函数信息 #encoding=utf-8 #闭包应用 #先定义闭包函数,并使用 def outer(func): def inner(): ...
- python中闭包和装饰器
前言: 编程语言发展的过程中,我们为了提高代码利用率,发明了函数式编程.函数将代码封装起来,我们需要用到此功能函数的时候,调用一下就可以了.但是使用的过程中,也遇到了一些问题,比如函数实现的功能不够, ...
- python的闭包与装饰器
原文发表在我的博客主页,转载请注明出处 前言 如果把python当作脚本语言,每次就是写个几十行上百行来处理数据的话,装饰器也许不是很必要,但是如果要开发一个大型系统,装饰器是躲不开的,最开始体会ry ...
- Python的闭包和装饰器
什么是闭包 python中函数名是一个特殊的变量,它可以作为另一个函数的返回值,而闭包就是一个函数返回另一个函数后,其内部的局部变量还被另一个函数引用. 闭包的作用就是让一个变量能够常驻内存. def ...
- Python高级--闭包与装饰器
前言:在Python中,闭包是一种非常有用的功能!它通常与装饰器一起搭配使用,可以在不改变被装饰函数的功能的基础上,完成更多的功能.如权限认证. 一.如何定义闭包 1.闭包就是两个嵌套的函数,外层函数 ...
- python中闭包和装饰器的理解(关于python中闭包和装饰器解释最好的文章)
转载:http://python.jobbole.com/81683/ 呵呵!作为一名教python的老师,我发现学生们基本上一开始很难搞定python的装饰器,也许因为装饰器确实很难懂.搞定装饰器需 ...
- Python作用域-->闭包函数-->装饰器
1.作用域: 在python中,作用域分为两种:全局作用域和局部作用域. 全局作用域是定义在文件级别的变量,函数名.而局部作用域,则是定义函数内部. 关于作用域,我要理解两点:a.在全局不能访问到局部 ...
随机推荐
- linux(四)之元字符
一直觉得linux是一个非常高深的东西,但是慢慢学过来其实就是一堆一堆的命令执行,让一个程序运行的结果. 只有你有毅力去学习,并且系统的去学习我相信没有什么恶意难道自己的.接下来我们一下来感受一下li ...
- linux(三)之linux常用命令二
今天就是星期五了,又可以休息两天了.有点小激动,开心.不过还是要加油,因为还有很多东西等着我去学习呢! 七.chmod 作用:修改文件的权限 7.1.命令格式:chmod mode filename ...
- bzoj:2331: [SCOI2011]地板
Description lxhgww的小名叫“小L”,这是因为他总是很喜欢L型的东西.小L家的客厅是一个的矩形,现在他想用L型的地板来铺满整个客厅,客厅里有些位置有柱子,不能铺地板.现在小L想知道,用 ...
- POJ2407-Relatives-欧拉函数
欧拉函数: 对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目. 对于一个正整数N的素数幂分解N=P1^q1*P2^q2*...*Pn^qn. Euler函数表达通式:euler(x)=x(1 ...
- linux系统下Vi编辑器或者Vim编辑器设置显示行号、自动缩进、调整tab键宽度的技巧?
工作中嫌vim 中一个tab键的宽度太大,linux系统默认,没改之前是一个tab键宽度是8个字符,想改成4个字符, 操作如下:(注意:这是在root用户下)cd ~vim .vimrc添加如下几行: ...
- RAID 详解
一.什么是RAID 磁盘阵列全名是『Redundant Arrays of Inexpensive Disks, RAID 』,英翻中的意思是:容错式廉价磁盘阵列. RAID 可以透过一个技术(软件或 ...
- init和plus(编码中遇到问题就看这里)
转自:http://ask.dcloud.net.cn/article/165 编码中遇到问题就看这里: http://uikoo9.com/book/chapterDetail/4 plus初始化原 ...
- 从零开始学习前端开发 — 2、CSS基础
一.CSS简介 1.CSS是什么 CSS是Cascading Style Sheets的简称,中文称为层叠样式表.特点:实现了表现与结构相分离 2.css基础语法 css是由选择符和声明两大部分组成 ...
- PHP批量去除bom头代码的小工具
在 aitecms 群里有网友抱怨了好几天说本地的验证码一直无法显示,后来听说解决了,问其如何解决的,说是去除了文件 bom 就好了.后来百度到一篇文章也说 dedecms 的验证码不能显示,某次解决 ...
- ThinkPHP配置文件的加载
分类: thinkphp(39) 版权声明:本文为博主原创文章,未经博主允许不得转载. 惯例配置->应用配置->模式配置->调试配置->状态配置->模块配置->扩展 ...