简单讲解闭包的写法和应用,在这之前,先声明,你定义的任意一个函数都可以作为其他函数的参数。就像下面这段代码的参数func,接收的参数就是一个函数名,在函数体内部使用了func()调用执行函数。

请看下面的代码,注意标红的位置,猜猜看结果

def a(func):

def inner():

print("验证中")

func()

return inner

def f2():

print("--------2-----")

f2 = a(f2)

f2()

结果是先打印:验证中,然后打印了--------2-----,如下:

验证中

--------2------

先讲一下闭包的意思,就是像第一个函数a,有一个参数func(可以是任意参数),然后a函数体的内部又定义了一个函数,这个函数可以有参数可以没有,函数内部用到了外部函数a的参数,此时就称为闭包。这种应用场景一般是在外部的函数的参数不经常变化,但是里面的参数经常需要变的时候,比如:

def test(a,b):

def inner(x):

return a*x+b

return inner

上面这个例子,ab是两个常量,x经常变化,就可以这样调用:

c = test(2,3)          #只需要调用一次,下面可以多次使用

inner(5)-------------------------à结果就是2*5+3

inner(6) -------------------------à结果就是2*6+3

……

然后我讲解一下为什么上面会出现那个的结果,讲一下程序执行的步骤:

  1. 先执行def a(func):这一行,是一个定义函数,不做操作
  2. 接着往下,执行def f1():这行,仍然不做操作
  3. 接着往下,执行def f2():这行,仍然不做操作
  4. 再往下执行一直到f2=a(f2),执行这句话的时候,先执行右侧,a(f2)即调用函数a,参数为f2,f2是一个函数名(注意哦,f2后面没有(),意思就是说这里只是把f2这个引用传递给了函数a的参数func),此时func指向了f2的函数体。进入到a函数里面,执行def inner(),这句话仍然不做操作,然后执行return inner(这里也要注意inner后面没有()),执行return这句话就是把inner返回给了等号左边的f2变量,可以理解为f2=inner
  5. 走f2(),这句话,第4步的时候把inner的引用给了f2,意味着f2现在指向的是inner这个函数体,也就是执行inner函数了
  6. Inner函数第一句打印一句话,不必说。第二句func(),还记得func指向哪里吗?注意第4步的执行右半部分的时候,把f2这个函数体的引用给了func所以此时的func()就是执行f2函数体的内容啦

上面这种情况呢,就是假如说你执行f1()、f2()等等函数的时候需要先执行一些一样的操作,本例中是print("验证中"),就可以这样用

上面说的理解了以后,那装饰器就容易理解了:

def a(func):

def inner():

print("验证中")

func()

return inner

def f1():

print("--------1-----")

@a        #这句话就是使用装饰器,等同于 f2 = a(f2),装饰器也可以有多个(不要加括号)

def f2():

print("--------2-----")

#f2 = a(f2)               #上面写了@a,这句话就可以省略了

f2()

如果你代码有大量重复的,就可以这样使用装饰器,把重复的代码放到a的位置,需要用到重复代码的地方用a装饰一下。

Python函数名做参数,闭包,装饰器的更多相关文章

  1. Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列)

    Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列) 一丶带参数的装饰器 def wrapper_out(pt): def wrapper(func): ...

  2. 【python 】装饰器 (多个参数的函数,带参数的装饰器)【转】

    最简单的模板是这样的 #-*-coding:utf-8-*- def outer(func): def inner(): print 'before' func() print 'after' # r ...

  3. python 装饰器 (多个参数的函数,带参数的装饰器)

    最简单的模板是这样的 #-*-coding:utf-8-*- def outer(func): def inner(): print 'before' func() print 'after' # r ...

  4. Python函数小结(2)-- 装饰器、 lambda

    本篇依然是一篇学习笔记,文章的结构首先讲装饰器,然后讲lambda表达式.装饰器内容较多,先简要介绍了装饰器语法,之后详细介绍理解和使用不带参数装饰器时应当注意到的一些细节,然后实现了一个简单的缓存装 ...

  5. python函数(3):装饰器

    昨天学了很多函数方面的概念和知识其中有一个闭包的函数.很多人都对闭包的作用不是很清楚,今天我们就来认识一个新的知识点装饰器.它就是闭包函数的一个经典应用. 预习: 编写装饰器,为多个函数加上认证的功能 ...

  6. day20 Python 高阶函数,函数,嵌套,闭包 装饰器

    高阶函数定义 1.函数接收的参数是一个函数名 2.函数的返回值是一个函数名 3.满足上述条件任意一个都可以称之为高阶函数 一.函数的接收参数是一个函数名 import time def foo(): ...

  7. Python函数篇(5)-装饰器及实例讲解

    1.装饰器的概念   装饰器本质上就是一个函数,主要是为其他的函数添加附加的功能,装饰器的原则有以下两个: 装饰器不能修改被修饰函数的源代码 装饰器不能修改被修改函数的调用方式   装饰器可以简单的理 ...

  8. python 函数及变量作用域及装饰器decorator @详解

    一.函数及变量的作用   在python程序中,函数都会创建一个新的作用域,又称为命名空间,当函数遇到变量时,Python就会到该函数的命名空间来寻找变量,因为Python一切都是对象,而在命名空间中 ...

  9. day12 python函数名的应用 闭包 迭代器

    day12 python   一.函数名的应用(是第一类对象)     函数名的命名规范和变量是一样的     函数名其实就是变量名 def func():     print('i am funct ...

随机推荐

  1. Python中通过csv的writerow输出的内容有多余的空行两种方法

    第一种方法 如下生成的csv文件会有多个空行 import csv #python2可以用file替代open with open("test.csv","w" ...

  2. 在Vue中添加css扩展语言sass

    npm install vue-loader --save-dev npm install node-sass --save-dev npm install sass-loader --save-de ...

  3. Oracle 常用函数积累

    ①length 函数说明:计算字符串长度的函数 返回结果:数字 使用图解: ②lengthb 函数说明:计算字符串字节长度.在学习过程中,了解到还有一个 lengthb 函数.字节和字符的区别 返回结 ...

  4. 数据存储与访问之——SharedPreferences

    使用SharedPreferences(保存用户偏好参数)保存数据, 当我们的应用想要保存用户的一些偏好参数,比如是否自动登陆,是否记住账号密码,是否在Wifi下才能 联网等相关信息,如果使用数据库的 ...

  5. 使用动态SQL处理table_name作为输入参数的存储过程(MySQL)

    关于mysql如何创建和使用存储过程,参考笔记<MySQL存储过程和函数创建>以及官网:https://dev.mysql.com/doc/refman/5.7/en/create-pro ...

  6. 011.Kubernetes二进制部署kube-scheduler

    一 部署高可用kube-scheduler 1.1 高可用kube-scheduler介绍 本实验部署一个三实例 kube-scheduler 的集群,启动后将通过竞争选举机制产生一个 leader ...

  7. 简单搭建docker registry

    已知信息: 服务端IP:192.168.7.2xx 客户端IP:192.168.7.1xx 服务端: docker registry中镜像本地映射地址:/Users/dockergit/private ...

  8. 06-Node.js学习笔记-创建web服务器

    创建web服务器 //引用系统模块 const http = require('http'); //创建web服务器 //用于处理url地址 const url = require('url'); c ...

  9. Python数据结构性能分析

    1.目标 告诉大家Python列表和字典操作的 大O 性能.然后我们将做一些基于时间的实验来说明每个数据结构的花销和使用这些数据结构的好处 2.实操 在列表的操作有一个非常常见的编程任务就是是增加一个 ...

  10. RTP Payload Format for H264 Video

    基础传输结构 rtp中对于h264数据的存储分为两层,分别是 VCL: video coding layer 视频编码层 这是h264中block, macro block 以及 slice级别的定义 ...