首页 > 其他 > 详细

7.11 闭包函数 装饰器

时间:2019-07-11 19:12:13      阅读:90      评论:0      收藏:0      [点我收藏+]

闭包函数

  顾名思义就是定义在函数内部的函数,内部函数引用了外部函数作用域的名字

def outter():
    x = 111
    def inner():
        print(x)
    return inner
res = outter()  # res就是inner函数内存地址

def func():
    x = 333
    res()
func()  # 返回的还是111 # 因为在定义阶段就已经固定了

给函数体传参有两种方式

1. 传参

  def index1(username):  # 这里的username就是变量名,也可以说是参数

  print(username)  # 这样就往函数体内传入了参数

2. 闭包

def outter(x,y):
    def my_max():
        if x > y:
            return x
        return y
    return my_max
res1 = outter(1,40)  # res1就是my_max函数的内存地址
print(res1())  # 40
print(res1())  # 40
res2 = outter(90,200)  # 这里的res2也是my_max函数的内存地址
                       # 虽然之前已经传了值了
                       # 但是在上一句代码执行结束后
                       # 关系解除,这里又建立了新的关系。
print(res2())  # 200
print(res2())  # 200
print(res2())  # 200
                

  需要注意传参和闭包的使用场景:

    1. 直接传参,可能会是在全局中定义,占用变量名,当项目较大,要传参数过多时,

      不推荐使用这个方法,只在小项目中可以使用。

    2. 闭包传参,特点是只给内部传参,在局部定义变量名,而不是全局,比较安全,起名也方便。

装饰器

  就是用来装饰的工具,就是给被装饰的对象添加新的功能,并且不改变原来的使用方法。

  装饰器的使用要遵循开放封闭原则

    开放:对扩展开放

    封闭:对修改封闭

  装饰器(装饰器也是可调用对象callable=True)必须遵循的两个原则:

    1. 不改变被装饰对象源代码

    2. 不改变被装饰对象(必须是可调用对象)调用方式

 

补充:

  1.
  import time

  print(time.time())

   # 返回的是 时间戳 即当前时间距离1970-1-1 00:00:00相差的秒数

 

  2.

  time.sleep(3)

  #让程序暂停三秒再运行

 

装饰器简单版本

  

import time
def index():
    time.sleep(3)
    print(过了三秒,我开始执行了)

def outter(func):  # func = 最原始的index函数的内存地址
    def get_time():
        start = time.time()
        func()  # func = index函数的内存地址() 直接调用
        end = time.time()
        print(index run time:%s%(end-start))
    return get_time
index = outter(index)  # outter(最原始的index函数内存地址)
# index指向get_time函数的内存地址
index()

技术分享图片

 

  

 

7.11 闭包函数 装饰器

原文:https://www.cnblogs.com/PowerTips/p/11171777.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!