python_20_装饰器_高阶函数的使用_01

本节知识:高阶函数的使用

                                                                                              备注:python全栈_day20_03

1.装饰器

  • 装饰器=高阶函数+函数嵌套+闭包.
  • 一个高阶函数无法满足装饰器功能.

2.高阶函数

  • 高阶函数的定义:
  1. 函数接受参数是一个函数.
  2. 函数的返回值是一个函数.
  3. 满足以上条件任意一个,都可以称之为高阶函数.

#高阶函数代码

 1 #满足第一种的高阶函数(函数接受参数是一个函数)
 2 import time     ##导入时间包
 3 def tpp():
 4     time.sleep(3)   ##设置运行时间
 5     print('hello ...')
 6 def test():
 7     print(tpp)    #获得tpp的内存地址
 8     start_time = time.time()    ##开始时间
 9     tpp()         #调用tpp函数
10     stop_time = time.time()     ##结束时间
11     print('函数的运行时间:%s'%(stop_time-start_time))  ##计算运行时间
12 test()
#满足第二个条件(函数的返回值是一个函数)
def tpp():
    print('hello...')
def test():
    return tpp

#str = test()
# print(str)   #获取tpp函数的内存地址
# str()
foo = test()
foo()       #实现了装饰器的,不改变函数名的调用方式
#编写一个装饰器,此方法不成立.多运行了一次
import time
def tpp():
    time.sleep(3)
    print('hello...')
#不修改foo函数的源代码
#不修改foo函数的调用方式
def test(func):
    #print(tpp)    #获得tpp的内存地址
    start_time = time.time()
    func()         #调用tpp函数
    stop_time = time.time()
    print('函数的运行时间:%s'%(stop_time-start_time))
    return func
foo = test(tpp)
foo()        #多调用了一次

                                                                                        

本节知识:函数嵌套于闭包

 

                                                                                          备注:python全栈_day20_04

 

  • 闭包的概念-----封装变量
 1 #函数嵌套
 2 def father(name):
 3     #print('from father %s'%name)
 4     def son():
 5         name = '小明_1'    #获取当前层的局部变量
 6         print('my father is %s'%name)
 7         def grandson():
 8             print('my grandson is %s'%name)
 9         grandson()
10     son()
11     #print(locals(),)   #获取当前层的局部变量(函数既是变量)
12 
13 father('小明')

  本节知识:修饰器框架      

                                                                                           备注:python全栈_day20_05

     

  • @ 语法糖  加在需要修饰函数的前面  

     1 import time
     2 #装饰器框架
     3 def timmer(func):
     4     def wrapper():
     5         #print(func)
     6         start_time = time.time()     #开始时间
     7         func()
     8         stop_time = time.time()
     9         print('test函数的运行时间%s'%(stop_time-start_time))
    10     return wrapper
    11 
    12 @timmer       #语法糖 @timmer等于test = timmer(test)
    13 def test():
    14     time.sleep(3)
    15     print('helle.......')
    16 
    17 # test = timmer(test)         #返回wrapper()函数的地址//做了赋值操作存在小遐思
    18 test()                  #执行wrapper()函数内容,并执行func()函数,func()函数等于test()

     

     

     1 import time
     2 #装饰器框架
     3 def timmer(func):
     4     def wrapper():
     5         #print(func)
     6         start_time = time.time()     #开始时间
     7         res = func()
     8         return res                 ####将func返回值赋值给res,res等于test的返回值
     9         stop_time = time.time()
    10         print('test函数的运行时间%s'%(stop_time-start_time))
    11     return wrapper
    12 
    13 @timmer       #语法糖 @timmer等于test = timmer(test)
    14 def test():
    15     time.sleep(3)
    16     print('helle.......')
    17     return '这是test的返回值'
    18 
    19 # test = timmer(test)         #返回wrapper()函数的地址//做了赋值操作存在小遐思
    20 #test()                  #执行wrapper()函数内容,并执行func()函数,func()函数等于test()
    21 
    22 #闭包加上返回值
    23 res = test()      #test函数其实是运行着wrapper的返回值
    24 print(res)     #返回None
    修饰器添加返回值

     

                                                                                                                                   

 

posted @ 2018-09-19 20:05  不灭一辉  阅读(109)  评论(0)    收藏  举报