一、学习Python的时候发现函数内部,还可以写函数,并且可以返回函数。觉得挺新奇的,主要是在探索装饰器(有点像Java的注解)的时候,发现这个理解还是很主要的,所以这里记录一下。

  二、闭包

  1)首先看一部分代码

def sum1(x):
def sum2(y):
print x + y
return sum2

  2)理解:

  a、外部传入一个参数

  b、在sum1内部声明了一个sum2函数,并且需要传参数,但是没有调用
  c、然后返回了sum2函数

  3)执行:

sum2 = sum1(10)
sum2(2) //12
sum2(4) //14

  4)闭包:在第一次调用完成后,按理说x应该用结束了,但是内部函数还需要使用。后续计算直接使用x的变量值得出x+y的结果。

  简单一点:就是外层函数传入一个参数a, 内层函数依旧传入一个参数b, 内层函数使用a和b, 最后返回内层函数

  三、装饰器

  1)首先还是看一段代码和执行结果

def w1(fn):
print "w1"
def inner():
print "in1"
fn()
return inner def w2(fn):
print "w2"
def inner():
print "in2"
fn()
return inner @w1
@w2
def f():
print "f" f()

  执行结果:

  

  2)说明

  装饰器:这个看着其实有点像AOP的过程,在spring中存在通过AOP的方式来进行切面,然后加入其它逻辑,比如:事务等。这里的修饰器也就是,在原来的函数基础上,做了更多地工作用来包装原本函数执行结果。

  注意:Python中的装饰器和spring中的AOP还是存在差别,就是装饰器是嵌套装饰的,AOP是一层一层切面的。(感觉也差不多)

  3)理解

  a、f()通过@w2装饰,即为:w2f = w2(f()).

  注意:这里返回的是w2中的inner,是以第一次包装后的函数。

  b、通过第二次包装@w1,然后返回w1w2f = w1(w2f)

  注意:这里包装的是@w2包装后的函数

  c、执行过程:包装顺序,从下往上。

          然后执行函数,执行w1w2f-->w2f-->f

  四、通用装饰器

  不带参数装饰器:

def func(function_name):

    def func_in(*args, **kwargs):
return function_name(*args, **kwargs) return func_in

  带参数的装饰器:

def func_arg(*args1, **kwargs1):

    def func(function_name):

        def func_in(*args2, **kwargs2):

            return function_name(*args2, **kwargs2)

        return func_in

    return func

  类装饰器:

class ClassArg:
def __init__(self, func):
self.func = func def __call__(self, *args, **kwargs):
self.func(*args, **kwargs)

python之闭包、装饰器的更多相关文章

  1. python函数闭包-装饰器-03

    可调用对象 callable()  # 可调用的(这个东西加括号可以执行特定的功能,类和函数) 可调用对象即  callable(对象)  返回为  True  的对象 x = 1 print(cal ...

  2. 【Python】 闭包&装饰器

    python中的函数本身就是对象,所以可以作为参数拿来传递.同时其允许函数的层级嵌套定义,使得灵活性大大增加. 闭包 闭包的定义:将函数的语句块与其运行所需要的环境打包到一起,得到的就是闭包对象.比如 ...

  3. python高级-闭包-装饰器

    闭包内容: 匿名函数:能够完成简单的功能,传递这个函数的引用,只有功能 普通函数:能够完成复杂的功能,传递这个函数的引用,只有功能 闭包:能够完成较为复杂的功能,传递这个闭包中的函数以及数据,因此传递 ...

  4. python之闭包+装饰器

    闭包 内部函数对外部函数作用域变量的引用. 函数内的属性都是有生命周期的,都是在函数执行期间 闭包内的闭包函数私有化了变量,类似于面向对象 图片解析 示例一 https://www.bilibili. ...

  5. python高级之装饰器

    python高级之装饰器 本节内容 高阶函数 嵌套函数及闭包 装饰器 装饰器带参数 装饰器的嵌套 functools.wraps模块 递归函数被装饰 1.高阶函数 高阶函数的定义: 满足下面两个条件之 ...

  6. Python深入05 装饰器

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法 ...

  7. Day04 - Python 迭代器、装饰器、软件开发规范

    1. 列表生成式 实现对列表中每个数值都加一 第一种,使用for循环,取列表中的值,值加一后,添加到一空列表中,并将新列表赋值给原列表 >>> a = [0, 1, 2, 3, 4, ...

  8. 第二篇:python高级之装饰器

    python高级之装饰器   python高级之装饰器 本节内容 高阶函数 嵌套函数及闭包 装饰器 装饰器带参数 装饰器的嵌套 functools.wraps模块 递归函数被装饰 1.高阶函数 高阶函 ...

  9. python基础—函数装饰器

    python基础-函数装饰器 1.什么是装饰器 装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能. 装饰器的返回值是也是一个函数对象. 装饰器经常用于有切 ...

  10. python学习之装饰器-

    python的装饰器 2018-02-26 在了解python的装饰器之前我们得了解python的高阶函数 python的高阶函数我们能返回一个函数名并且能将函数名作为参数传递 def outer() ...

随机推荐

  1. js中const,var,let区别与用法(转)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/qq_36784628/article/d ...

  2. 使用注解@Slf4j简化Logger的初始化

    一.是不是厌倦了 private final static Logger logger = LoggerFactory.getLogger(Application.class); 的拷贝和修改? 二. ...

  3. openresty开发系列2--nginx的简单安装,正向、反向代理及常用命令和信号控制介绍

    openresty开发系列2--nginx的简单安装,正向.反向代理及常用命令和信号控制介绍 一.nginx的安装下载及编译安装1.Nginx下载:nginx-1.13.0.tar.gz,下载到:/u ...

  4. js 跳转到 百度指定地址定位点

    js 跳转到 百度指定地址定位点 http://api.map.baidu.com/geocoder?address=北京市海淀区上地信息路9号奎科科技大厦&output=html&s ...

  5. WebMercator和geographic互相转换

    方法1:esri的sdk中包含的方法:esri.geometry.geographicToWebMercator() 方法2:自己转换 //经纬度转Web墨卡托 function lonLat2Web ...

  6. python获取风和天气城市数据 ID

    import requestsurl='https://cdn.heweather.com/china-city-list.csv'strhtml=requests.get(url)strhtml.e ...

  7. QVector init error

    QMetaType::registerType: Binary compatibility break -- Size mismatch for type 'PtsData' [1025]. Prev ...

  8. Java程序员金三银四精心准备的面试题及答案(基础篇)

    1.面向对象的特征有哪些方面? [基础] 答:面向对象的特征主要有以下几个方面: 1)抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问 ...

  9. source insight 使用配置(私人)

    1.输入两个空格,两个空格全消失,前后的字粘在一起显示,不想这样,就取消下图的勾.

  10. python web开发——django学习(一)第一个连接mysql数据库django网站运行成功

    1.新建一个项目 2.新建一些文件夹方便管理 3.新建一个项目叫message  4.连接数据库 python web开发Django连接mysql 5.在数据库里自动生成django的表  6.运行 ...