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 装饰器、内部函数、闭包简单理解的更多相关文章

  1. Python装饰器与闭包

    闭包是Python装饰器的基础.要理解闭包,先要了解Python中的变量作用域规则. 变量作用域规则 首先,在函数中是能访问全局变量的: >>> a = 'global var' & ...

  2. python 装饰器 传递参数简单案例

    def debug(func): def wrapper(*args, **kwargs): # 指定宇宙无敌参数 print "[DEBUG]: enter {}()".form ...

  3. python装饰器方法

    前几天向几位新同事介绍项目,被问起了@login_required的实现,我说这是django框架提供的装饰器方法,验证用户是否登录,只要这样用就行了,因为自己不熟,并没有做过多解释. 今天查看dja ...

  4. python装饰器执行顺序

    . python 装饰器 1) 2层装饰器 def decorator(func): # TODO def wrapper(*args, **kwargs): # TODO func(*args, * ...

  5. http://python.jobbole.com/85056/ 简单 12 步理解 Python 装饰器,https://www.cnblogs.com/deeper/p/7482958.html另一篇文章

    好吧,我标题党了.作为 Python 教师,我发现理解装饰器是学生们从接触后就一直纠结的问题.那是因为装饰器确实难以理解!想弄明白装饰器,需要理解一些函数式编程概念,并且要对Python中函数定义和函 ...

  6. python装饰器的简单理解

    如果你接触 Python 有一段时间了的话,想必你对 @ 符号一定不陌生了,没错 @ 符号就是装饰器的语法糖. 装饰器的使用方法很固定: 先定义一个装饰函数(帽子)(也可以用类.偏函数实现) 再定义你 ...

  7. Python装饰器,Python闭包

    可参考:https://www.cnblogs.com/lianyingteng/p/7743876.html suqare(5)等价于power(2)(5):cube(5)等价于power(3)(5 ...

  8. 理解 Python 装饰器看这一篇就够了

    讲 Python 装饰器前,我想先举个例子,虽有点污,但跟装饰器这个话题很贴切. 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个办法就是把内裤改造一下,让它 ...

  9. 总结了11条,我对Python 装饰器的理解

    对于每一个学习 Python 的同学,想必对 @ 符号一定不陌生了,正如你所知, @ 符号是装饰器的语法糖,@符号后面的函数就是我们本文的主角:装饰器. 装饰器放在一个函数开始定义的地方,它就像一顶帽 ...

随机推荐

  1. 开启MSSQLServer跨服务器查询功能

    首先在MSSQL客户端中进行如下图文操作配置 其次使用脚本进行操作配置 ---开启SQLServer 跨服务器查询功能 exec sp_configure 'show advanced options ...

  2. Oracle Semaphore Management in UNIX Administration

    Oracle UNIX/Linux Tips by Burleson Consulting Semaphores and Oracle 11g 信号量和数据库 Semaphores are data ...

  3. Nodejs随笔(三):全局对象之global

    首先,进入node REPL: mesogene@mesogene-team:~$ node > 查看global对象,发现其他全局对象(包括Buffer.require对象)以及全局方法都包含 ...

  4. iOS开发之git学习

    本人是参考廖雪峰的git学习的.他写的非常详细,我在这里就是把我学习中的总结以及碰到的坑写出来. /* 初始化git仓库:git init */ /* 添加文件到git仓库 */ 分两步: 第一步:追 ...

  5. OC——NSString和NSMutableString

    int main(int argc, const char * argv[]) { @autoreleasepool { //----------------NSString------------- ...

  6. HTTP缓存缓存机制

    http协议无状态,所以缓存设定从两方面考虑.客户端浏览器和服务器端. 浏览器端实现过期机制. 服务器端实现验证机制. 缓存机制. 为了减轻服务器负担,也减少网络传输数量.http1.0定义了Expi ...

  7. php 数组的几个小算法

    1. 判断a数组是否为b数组的子集 <?php $a = array('apple','orange'); $b = array('apple','banana','ornage'); $arr ...

  8. PHP学习日记(一)——类、函数的使用

    一.自定义函数 function add($a,$b){ $c=$a+$b; echo 'add test:'; echo $c; return $c; } add(1,2); 输出结果: add t ...

  9. Oracle EBS-SQL (PO-1):检查供货比例异常.sql

    select distinct msr.sourcing_rule_name                     名称 , msi.description                      ...

  10. pragma comment的使用

    该宏放置一个注释到对象文件或者可执行文件. #pragma comment( comment-type [,"commentstring"] ) comment-type是一个预定 ...