Python_闭包、装饰器

闭包

  • 内部函数调用外部函数的变量(一个闭包就是你调用的一个函数A,这个函数A返回一个函数B给你。这个返回的函数B就叫做闭包)

  • 优点:可以提高代码的可复用性,减少了代码的可移植性

  • 特点:一个独立的空间,多个闭包互补影响,占用空间远小于实例对象;

  • 注意点:引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存

  • nonlocal 修改一个函数内部变量时使用

# 定义一个函数
def test(number):
        
        # 在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数及用到的一些变量称之为闭包
        def test_in(number_in):
                print("in text_in 函数, number_in is %d" % number_in)
                return number + number_in
        # 其实这里返回的就是闭包的结果
        return text_in
# 给test函数赋值,这个20就是给参数number
ret = test(20)
# 注意这里的100其实给参数的number_in
print(ret(100))
# 注意这里的200其实给参数number_in
print(ret(200))

运行结果:
in test_in 函数, number_in is 100
120
in test_in 函数, number_in is 200
220

装饰器

  • 定义一个函数,在运行时动态增加功能

  • 在不修改原函数的代码的情况下,添加新的功能,可以在执行原函数之前加,也可以在执行原函数之后添加

  • 注意点:

    • 装饰器只能在调用原函数之前或之后添加功能,而不能在函数的中间添加功能
    • 只要用装饰器装饰了的函数,那么不管被调用多少次,都是装饰之后的效果
  • 装饰器(decorator)功能
    1.引入日志
    2.函数执行时间统计
    3.执行函数前预备处理
    4.执行函数后清理功能
    5.权限校验等场景
    6.缓存

#### 第一波 ####
def foo()
       print("foo")
foo # 表示是函数
foo() # 表示执行foo函数
#### 第二波 ####
def foo()
       print("foo")

foo = lambda x: x + 1
foo() # 执行lambda表达式, 而不再是原来的foo函数, 因为foo这个名字被重新指向另外一个匿名函数
  • 写代码要遵循开放封闭原则,它规定已经实现的功能代码不允许被修改,但可以被扩展
    - 封闭:对实现功能的代码块
    - 开放:扩展开发

  • 一般情况下为了让装饰器更通用,可以有return

  • 装饰的时候:谁离被装饰的函数越近,那么就先装谁

  • 调用的时候:谁离的远,那么先调谁

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,273评论 19 139
  • 要点: 函数式编程:注意不是“函数编程”,多了一个“式” 模块:如何使用模块 面向对象编程:面向对象的概念、属性、...
    victorsungo阅读 5,547评论 0 6
  • 本章将会介绍 闭包表达式尾随闭包值捕获闭包是引用类型逃逸闭包自动闭包枚举语法使用Switch语句匹配枚举值关联值原...
    寒桥阅读 5,472评论 0 3
  • 每日打卡。 来评论区记录下今天的收获和成长吧!
    树洞君阅读 3,043评论 15 3
  • 这幅作品依然是形式感很强,能很直接了当的抓住观众的眼球,作者概括的将天和地一分为二,言简意赅。构图紧致,画面由左及...
    巴拉巴拉2822阅读 3,805评论 0 0

友情链接更多精彩内容