装饰器

定义:

装饰器:器为函数意思,本质上是函数,与函数没有多大的区别,同样是def定义的函数。主要用来装饰其他函数,就是给其他函数添加新的功能。

规则:

1.不能修改被装饰函数的源代码

2.不能修改被装饰函数的调用方式

总结:

装饰器对被 装饰的函数完全是透明的。

 

实现装饰器的知识储备:

1.函数即‘变量’

2.高阶函数

  a.把一个函数的函数名当作实参传给宁外一个函数(不改变被装饰函数的源代码为其添加功能)

  b.返回值中包含函数名。(不改变原函数的调用方式的情况下为其添加功能)

3.嵌套函数

高阶函数+嵌套函数---》装饰器

 

函数即‘变量’

  定义一个x=1,在内存中是:内存中开辟一个小房子,将1这个值放进去,而x是这个房子的门牌号,指向的是存1的内存地址,这个就是函数的引用。调用变量是,直接x就行。

  函数即“变量”,同样的,函数名=函数体,将函数体放入内存中,就是一堆的字符串,并没有什么功能,将函数名这个门牌号指向这个函数体的内存地址。只是函数调用的时候要在函数名后面加小括号---》函数名()

  匿名函数,是没有函数名=函数体这样的,如果没有变量接收它,那么它会立刻被内存回收机制回收

  python解释器自带内存回收机制的功能

    解释器主要就是看这个值的变量的引用是否为0,为0就回收,不为0,不回收。比如:x=1 y=x 那么存储1这个值的内存地址就有2个引用。

    del x 删除了一个门牌号,去掉了一个引用,隔一段时间会自动刷新

    你不人为的去删除门牌号,它是会一直存在,直到函数结束,释放。

  python解释器是先解释,后调用,也就是与变量一样,先定义后调用。比如:x=1 y=2 print(x,y)与 y=2 x=1 print(x,y)是一样的效果,都是先在内存中定义,已经存在。

 

# def foo():
#     print("in the foo")
#     bar()#在内存中找bar指向的内存,没有,报错
# foo()


# def bar():
#     print("in the bar")
# def foo():
#     print("in the foo")
#     bar()
# foo()


# def foo():
#     print("in the foo")
#     bar()
# def bar():
#     print("in the bar")
# foo()


def foo():
    print("in the foo")
    bar()
foo()#第一,函数由上向下执行,首先,是在内存中定义foo,然后调用foo,但是这个时候内存中还没有定义bar,所以会出错
def bar():
    print("in the bar")

 

  

高阶函数

高阶函数

  a.把一个函数的函数名当作实参传给宁外一个函数(不改变被装饰函数的源代码为其添加功能)

  b.返回值中包含函数名。(不改变原函数的调用方式的情况下为其添加功能)

 1 import time
 2 def bar():
 3     time.sleep(3)
 4     print("in the bar")
 5 
 6 def test(func):
 7     start_time=time.time()
 8     func()
 9     stop_time=time.time()
10     print("the run func time is %s"%(stop_time-start_time))
11 
12 test(bar)
13 print(bar)
import time
def bar():
    time.sleep(3)
    print("in the bar")

def test(func):
    print("in the test")
    return bar

print(bar)
bar=test(bar)
print(bar)
bar()

嵌套函数

定义:在一个函数里面用def去定义一个新的函数,就叫嵌套函数; 

嵌套函数肯定默认是从里往外找;

def test():
    print("in the test")
    def bar():
        print("in the bar")
    bar()
test()
def test2():
    pass
def test1():
    print("in the test1")
    test2()
test1()

  这个就是函数的调用而不是嵌套函数

 

 1 x=1
 2 def grandpa():
 3     x=1
 4     def dad():
 5         x=2
 6         def son():
 7             x=3
 8             print(x)
 9         son()
10     dad()
11 grandpa()

函数永远都是从里面往外找

记住,函数即变量,函数体里面的函数,也只在当前函数内生效,跟局部变量和全局变量的作用域是一样的。假设你函数定义了不调用,就与变量定义了不调用是一样的。

posted on 2018-04-24 17:55  Linux的爱好者  阅读(136)  评论(0编辑  收藏  举报