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. Jquery Mobile 记录

    使用的是C#语言,.Net+Jquery Mobile 框架开发 1.使用水平组切换操作 <fieldset id="Tfdset1" data-role="con ...

  2. IBATIS处理typeHandler类容易范的SQLException总结

    1. java.sql.SQLException: 无效的列类型 原因: A. ibatis的IN,OUT参数.或者typeHandler类中传入的参数值数据类型与Oracle自定义对象中的属性值的数 ...

  3. python基础:名称空间与作用域

    Python的变量定义后都有自己的作用域,每个作用域内都有名字空间.名称空间就是变量名称与对象的关联关系.Python中使用变量名引用对象,需要使用该变量时,就在命名空间中进行搜索,获取对应的对象.从 ...

  4. JDK安装与环境变量配置(Win7)

    1.下载JDK(Java SE Development Kit) 地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-dow ...

  5. 前端开发面试题收集 css

    什么是CSS盒子模型 页面上的每个元素都被浏览器看做是一个矩形的盒子. 由内容.填充.边框.边界组成. 什么是 css sprite 将多个图片拼接在一个图片中,通过background-positi ...

  6. centos下python的pymssql模块安装及简单使用

    1.安装pymssq模块 1-1.环境准备: 1-1-1.unixODBC安装 yum install unixODBC unixODBC-devel -y 1-1-2.freetds安装 下载 fr ...

  7. Generator & yield write in sync way

    Generator & yield write in sync way var p = new Promise(function(resolve, reject){ setTimeout(fu ...

  8. 拓扑排序(TopologicalSort)算法

    拓扑排序算法应用: 有些事情做都需要按照流程的去做,比如你准备约你小女友去影院看速度与激情7大片,首先你想的是我怎么到达影院,然后达到影院,你可以先买票,或者等小女友来了一起买票,然后一起进电影大厅. ...

  9. 配置php中的Oracle扩展

    window 1. 从 OTN Instant Client page下载windows客户端安装包,安装包的位数(32/64位)必须和你所使用的操作系统类型.php版本一致.解压安装包至C:\ins ...

  10. 矩形嵌套(LIS)

    矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a& ...