装饰器

# 装饰器 本质是函数,(装饰其他函数),就是为其他函数添加附加功能
#原则  1.不能修改被装饰的函数的源代码 2.不能修改被装饰的函数的调用方式
#实现装饰器知识 1.函数即变量 2.高阶函数 3.嵌套函数   装饰器=高阶函数+嵌套函数

#装饰器例子
import time
def timmer(func):
    def warapper(*args,**kwargs):
        start_time=time.time()
        func()
        stop_time=time.time()
        print("the func run time is %s" %(stop_time-start_time))
    return warapper


@timmer  #使用装饰器timmer
def test1():
    time.sleep(3)   #运行3秒
    print('in the test1')

test1()
'''
#函数即变量 函数就是变量 有内存回收机制 变量名或函数名 del 内存就会回收,不del就不会回收
#函数先定义在引用
'''
def foo():
    print('in the foo')
    bar()   #函数先定义在引用 即先执行完def操作,在引用bar  或叫先声明在调用

def bar():
    print('in the bar')

foo()
#lambda匿名函数
cal = lambda x:x*3
cal(3)
print(cal(3  ))

#def foo():
#    print('in the foo')
#    bar()   #函数先定义在引用 即先执行完def操作,在引用bar  或叫先声明在调用
#foo()   #已经先调用了foo函数  但bar函数还没来得及定义声明
#def bar():
#    print('in the bar')

#高阶函数 1.把一个函数名当成实参传给另一个函数(在不修改被装饰函数源代码的情况下为其添加功能)
#2.返回值中包含函数名(不修改函数的调用方式)
def bar():
    print('in the bar')

def test1(func):         #传入bar函数名
    print(func)          #返回bar的内存地址
    func()

test1(bar)      #传入bar函数名


import time
def bar():
    time.sleep(1)
    print('in the bar')

def test1(func):         #传入bar函数名
    start_time=time.time()
    func()  #运行bar函数
    stop_time=time.time()
    print("the func run time is %s "%(stop_time-start_time))
test1(bar)

import time
def bar():
    time.sleep(1)
    print('in the bar')
def test2(func):
    print(func)
    return func

#print(test2(bar))
#t = test2(bar) #返回值传给t   print把返回值输出到屏幕上
#print(t)
#t()
bar = test2(bar) #覆盖之前的bar 可以获取到bar的内存地址
bar()       #可以获取到bar的内存地址 增加的新功能

#嵌套函数
def foo():
    print('in the foo')
    def bar():                        #函数的嵌套  函数里面在嵌套一个函数
        print('in the bar')
    bar()
foo()

#def test1():
#    test2()  #这种叫函数的调用 不叫函数嵌套
#test1()
#作用域 从里往外
x = 0
def gran():
    x = 1
    def da():
        x = 2
        def so():
            x = 3
            print(x)
        so()
    da()
gran()


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章