python 装饰器、内部函数、闭包简单理解
python内部函数、闭包共同之处在于都是以函数作为参数传递到函数,不同之处在于返回与调用有所区别。
1、python内部函数
python内部函数示例:
def test(*args):
def add(*args): # 显示的调用外部函数的参数
return args
return add(*args) # 返回内部函数的直接调用 运行结果如下:
test(1,2,3)
(1,2,3)
内部函数直接引用外部函数参数,外部函数test显示的返回内部函数add的调用。
当需要在函数内部多次执行复杂任务时,内部函数非常有用,从而避免了循环和代码的堆叠重复。
2、python闭包
内部函数可以看作是一个闭包。闭包是一个可以由另一个函数动态生成的函数,并且可以改变和存储函数外创建的变量的值。
python闭包示例:
def test(a):
def add(): # 没用引用外部函数的参数
return "it's a callable %s" % a # 直接在内部函数使用外部函数的参数
return add # 返回内部函数本身,不返回内部函数调用 运行结果如下:
a1 = test(1) # 动态生成的一个可以记录外部变量的函数
<function __main__.add> a1() # 调用此函数
it's a callable 1 test(1)() # 本身调用过程,先动态生成一个函数再进行调用
it's a callable 1
3、python装饰器
装饰器实质上是一个函数,它把一个函数作为输入并且返回另外一个函数,在装饰器中,通常使用下面这些python技巧:
*args 和 **kwargs
闭包
作为参数的函数
python装饰器示例:
def test(func): # 将函数作为参数进行传递
def add(*args,**kwargs):
print “it's a d”
return func(*args,**kwargs) # 内部函数进行相关操作以后,返回传递函数的调用
return add def func(a,b):
return a+b 运行结果如下:
test(func) # 将func作为函数传递进test函数进行装饰
<function __main__.add> # 装饰后的函数,类似闭包 test(func)(1,2) # 显示的对装饰后的函数进行调用
it's a d # 中间被装饰的过程被print出来
3 更简单的方法调用装饰器
@test # 同一个函数可以调用多个装饰器,执行过程中不分先后顺序
def func(a,b):
return a+b 无论传入test()的函数func是什么,装饰器都会返回一个新的函数,其中包含test增加的额外语句。
实际上,装饰器并不需要执行函数func中的代码,只是在结束前函数add调用函数func以得到的func返回的结果和附加代码的结果
装饰器本身需要传递参数的时候:
def test(cmd): # 将参数传递
def exc(func): # 第二步进行函数作为参数传递
def add(*args,**kwargs):
print "it's a %s" % cmd
print "begin"
return func(*args,**kwargs)
return add
return exc 运行结果如下:
test('haha')
<function __main__.exc> test('haha')(func)(1,2) # 调用装饰器返回结果
it's a haha
begin
3 更简单的方法调用
@test('haha') # test函数进行了参数传递
def func(a,b):
return a+b
python装饰器注意事项:
对func进行装饰以后,func的函数命名空间发生了变化
执行 func.__name__
add
如何指向原来的命名空间呢?python自带了functools库直接调用则行
import functools
def test(func):
@functools.wraps(func)
def add(*args,**kwargs):
print "it's a decorator"
return func(*args,**kwargs)
return add @test
def func(a,b):
return a+b 再次运行,查看命名空间
func.__name__
func # 返回了本身
python 装饰器、内部函数、闭包简单理解的更多相关文章
- Python装饰器与闭包
闭包是Python装饰器的基础.要理解闭包,先要了解Python中的变量作用域规则. 变量作用域规则 首先,在函数中是能访问全局变量的: >>> a = 'global var' & ...
- python 装饰器 传递参数简单案例
def debug(func): def wrapper(*args, **kwargs): # 指定宇宙无敌参数 print "[DEBUG]: enter {}()".form ...
- python装饰器方法
前几天向几位新同事介绍项目,被问起了@login_required的实现,我说这是django框架提供的装饰器方法,验证用户是否登录,只要这样用就行了,因为自己不熟,并没有做过多解释. 今天查看dja ...
- python装饰器执行顺序
. python 装饰器 1) 2层装饰器 def decorator(func): # TODO def wrapper(*args, **kwargs): # TODO func(*args, * ...
- http://python.jobbole.com/85056/ 简单 12 步理解 Python 装饰器,https://www.cnblogs.com/deeper/p/7482958.html另一篇文章
好吧,我标题党了.作为 Python 教师,我发现理解装饰器是学生们从接触后就一直纠结的问题.那是因为装饰器确实难以理解!想弄明白装饰器,需要理解一些函数式编程概念,并且要对Python中函数定义和函 ...
- python装饰器的简单理解
如果你接触 Python 有一段时间了的话,想必你对 @ 符号一定不陌生了,没错 @ 符号就是装饰器的语法糖. 装饰器的使用方法很固定: 先定义一个装饰函数(帽子)(也可以用类.偏函数实现) 再定义你 ...
- Python装饰器,Python闭包
可参考:https://www.cnblogs.com/lianyingteng/p/7743876.html suqare(5)等价于power(2)(5):cube(5)等价于power(3)(5 ...
- 理解 Python 装饰器看这一篇就够了
讲 Python 装饰器前,我想先举个例子,虽有点污,但跟装饰器这个话题很贴切. 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个办法就是把内裤改造一下,让它 ...
- 总结了11条,我对Python 装饰器的理解
对于每一个学习 Python 的同学,想必对 @ 符号一定不陌生了,正如你所知, @ 符号是装饰器的语法糖,@符号后面的函数就是我们本文的主角:装饰器. 装饰器放在一个函数开始定义的地方,它就像一顶帽 ...
随机推荐
- SQL Server 事务嵌套
示例代码: DECLARE @TranCounter INT; SET @TranCounter = @@TRANCOUNT; -- Procedure called when there is -- ...
- iOS self和super的区别
self和super的区别 #import <Foundation/Foundation.h> 首先先写两个类 fist和two,two继承fist类 @interface First:N ...
- WPF那些事儿
概述 感觉学习的东西必须做个记录,不然很快就忘掉了.现在把WPF学习过程中一些零碎的东西记录在下面,没有具体的主题,想到啥.看到啥都写在这里,算是复习一下并做个备忘吧. 1. 等待对话框 看到同事做的 ...
- 使用CRT定位内存泄漏
1. 使能内存泄漏检测#define _CRTDBG_MAP_ALLOC#include <stdlib.h>#include <crtdbg.h>注1:语句顺序不能修改:注2 ...
- 计时器中qq上的一个功能,延时作用
在qq主页面板上的最上方有自己的用户名,往用户名上移动会出现一个大框,往大框中移动,大框不会消失,如果离开大框或者姓名,大框就会消失,这一功能用到display:none的效果还有就是计时器的延时功能 ...
- 国标电表DLT645转MODBUS TCP协议转换器MRD-5021,工业设备,浪涌三级保护MRD
DL/T645转ModbusTcp协议转换器 MRD-5021具有1 路RS485及1路以太网接口,最多支持同时采集5个DL/T645-1997或者5个2007协议国标电表设备,支持DL/T645协议 ...
- linux自带有usb驱动,为什么还需要libusb呢
linux里的软件分为用户层和内核层两种.比如内核里编译了温度传感器的驱动,还得有lm-sensors在用户层负责解释处理内核递交出的数据.usb驱动是硬件驱动方面的东西,libusb是给应用软件开发 ...
- 使用SndPlaySound从内存中播放WAV
有些时候,我们写的程序需要播放音乐,一般大家会采用以下几种方式:1.把音乐文件放置在某个特定的目录,例如Sound,WAV,Music供程序读取播放:2.使用资源来存放音乐.有些人估计也是使用这个方法 ...
- Azure 为 SAP 提供的增强监控解决方案
正如大家在之前公告中所看到的,多个SAP应用程序已获得认证可在 Azure虚拟机中运行,未来还会有更多 SAP应用程序获得认证.对于希望在 Azure中运行 SAP应用程序的客户来说,这是个激动人心的 ...
- ssh 应用
SSH反向连接及Autossh ssh 隧道: http://www.cnblogs.com/robinyjj/archive/2008/11/02/1325018.html This guy wri ...