前言:

编程语言发展的过程中,我们为了提高代码利用率,发明了函数式编程。函数将代码封装起来,我们需要用到此功能函数的时候,调用一下就可以了。但是使用的过程中,也遇到了一些问题,比如函数实现的功能不够,或者跟我们要实现的功能有些差别。肿么办呢?打开函数内部代码,重新写?可以吗?可以!但是这就违背了函数式编程思想的初衷,代码没有重复利用,而且还破坏了原有函数代码。怎么办?聪明的人类思想的灯泡再次闪亮,咔嚓一声霹雳响,闭包和装饰器诞生了!

闭包:

闭包的定义:

  • 外部函数中定义了一个内部函数
  • 内部函数中使用了外部函数的变量
  • 外部函数将内部函数作为返回值返回

举例:

def wai(x):
def nei():
print(x)
return nei a = wai(3)()

在这个函数中,内部函数nei使用了外部函数的变量X,外部函数wai将内部函数作为返回值返回了。结果是3。a = wai(3)实际上是等同于a = nei ,后面价格括号,才是调用了函数nei。这就是为什么是a = wai(3)()

闭包知道咋回事了,那么它实际意义是啥呢?装饰器就是它的实际应用

装饰器:

装饰器本身是一个闭包,只不过外部函数的变量变成了一个函数名。

举例:

# 定义装饰器
def zhuang_xiu(fun):
def nei():
print('吊顶')
fun()
print('地毯')
return nei
#要被装饰器装饰的函数
def new_house():
print('新房')
print('使用装饰器前:')
new_house()
#使用装饰器
print('使用装饰器后:')
@zhuang_xiu
def new_house():
print('新房')
new_house()

运行结果:

使用装饰器前:
新房
使用装饰器后:
吊顶
新房
地毯

这样,我们就在没有改变newhouse函数源代码的前提下,增加了功能,实现了我们的目的。大家理解了吗?不理解可以评论联系我哦!

python中闭包和装饰器的更多相关文章

  1. python中闭包和装饰器的理解(关于python中闭包和装饰器解释最好的文章)

    转载:http://python.jobbole.com/81683/ 呵呵!作为一名教python的老师,我发现学生们基本上一开始很难搞定python的装饰器,也许因为装饰器确实很难懂.搞定装饰器需 ...

  2. Python中闭包、装饰器的概念

    1.闭包(Closure)的概念: 内部函数中对enclosing作用域的变量进行引用 1 passline = 60 2 def func(val): 3 print('%x' % id(val)) ...

  3. Python中利用函数装饰器实现备忘功能

    Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下   " ...

  4. Python函数编程——闭包和装饰器

    Python函数编程--闭包和装饰器 一.闭包 关于闭包,即函数定义和函数表达式位于另一个函数的函数体内(嵌套函数).而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量.参数.当其中一个 ...

  5. python 中多个装饰器的执行顺序

    python 中多个装饰器的执行顺序: def wrapper1(f1): print('in wrapper1') def inner1(*args,**kwargs): print('in inn ...

  6. 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解

    第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一.    引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...

  7. Python之闭包and装饰器

    闭包和装饰器是Python中非常重要的一种语法格式,在日常工作中应用非常广泛. 首先,我先为大家简单的介绍一下闭包的概念. 闭包:闭包是在函数嵌套的基础上,内层函数使用到外层函数的变量,且外层函数返回 ...

  8. python之闭包与装饰器

    python闭包与装饰器 闭包 在函数内部定义的函数包含对外部的作用域,而不是全局作用域名字的引用,这样的函数叫做闭包函数. 示例: #-------------------------------- ...

  9. python中面向对象之装饰器

    python面向对象内置装饰器property,staticmethod,classmethod的使用 @property 装饰器作用及使用 作用:面向对象中的方法伪装成属性 使用如下: class ...

随机推荐

  1. php+form表单的文件上传

    <!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. HTML5-新增type属性

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. [Linux] 010 权限管理命令 chmod

    1. 权限管理命令:chmod 命令名称:chmod 命令英文原意:change the permissions mode of a file 命令所在路径:/bin/chmod 执行权限:所有用户 ...

  4. HNOI2019fish

    \({\rm fish}\) 20分: 六个for,点积判锐角钝角. #include <vector> #include <queue> #include <cmath ...

  5. 【转载】sizeof()、strlen()、length()、size()详解和区别

    c/c++中获取字符串长度.有以下函数:size().sizeof() .strlen().str.length();一.数组或字符串的长度:sizeof().strlen()1.sizeof():返 ...

  6. P1613跑路

    题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十分牛B的空间跑路器,每秒钟 ...

  7. Redis设计与实现 -- 动态字符串对象(SDS)

    1. 动态字符串( simple dynamic string, SDS) 在 Redis 中,当需要可以被重复修改的字符串时,会使用 SDS 类型 ,而不是 C 语言中默认的 C 字符串类型 .举个 ...

  8. 缓存模块redis

    1.安装 安装 下载 :wget http://download.redis.io/releases/redis-3.2.8.tar.gz 解压:tar xzf redis-3.2.8.tar.gz ...

  9. 攻防世界--insanity

    测试文件:https://adworld.xctf.org.cn/media/task/attachments/d2a7dde552e647688230e80b2767b912 1.准备 获得信息: ...

  10. ApacheHttpServer出现启动报错:the requested operation has failed解决办法

    转自:https://www.jb51.net/article/21004.htm 原因一:80端口占用 例如IIS,另外就是迅雷.我的apache服务器就是被迅雷害得无法启用! 原因二:软件冲突 装 ...