Python基础(7)_闭包函数、装饰器

一、闭包函数

闭包函数:1、函数内部定义函数,成为内部函数,
     2、改内部函数包含对外部作用域,而不是对全局作用域名字的引用
那么该内部函数成为闭包函数

 1 #最简单的无参闭包函数
 2 def func1()
 3     name='ares'
 4     def func2()
 5         print(name)
 6 
 7 #有参和返回值的闭包函数
 8 def timmer(func):
 9     def wrapper(*args,**kwargs):
10         start_time = time.time()
11         res=func(*args,**kwargs)
12         stop_time=time.time()
13         print('run time is %s' %(stop_time-start_time))
14         return res
15     return wrapper

二、高阶函数

  1)函数接收的参数是一个函数名

  2)函数的返回值是一个函数名

  3)满足上述条件任意一个,都可称之为高阶函数

 1 #高阶函数应用1:把函数当做参数传给高阶函数
 2 import time
 3 def foo():
 4     print('from the foo')
 5 
 6 def timmer(func):
 7     start_time=time.time()
 8     func()
 9     stop_time=time.time()
10     print('函数%s 运行时间是%s' %(func,stop_time-start_time))
11 timmer(foo)
12 #总结:我们确实为函数foo增加了foo运行时间的功能,但是foo原来的执行方式是foo(),现在我们需要调用高阶函数timmer(foo),改变了函数的调用方式
13 
14 #高阶函数应用2:把函数名当做参数传给高阶函数,高阶函数直接返回函数名
15 import time
16 def foo():
17     print('from the foo')
18 
19 def timmer(func):
20     start_time=time.time()
21     return func
22     stop_time=time.time()
23     print('函数%s 运行时间是%s' %(func,stop_time-start_time))
24 foo=timmer(foo)
25 foo()
26 #总结:我们确实没有改变foo的调用方式,但是我们也没有为foo增加任何新功能

高阶函数总结

1.函数接收的参数是一个函数名

  作用:在不修改函数源代码的前提下,为函数添加新功能,
  不足:会改变函数的调用方式
2.函数的返回值是一个函数名
  作用:不修改函数的调用方式
  不足:不能添加新功能

三、函数嵌套

 1 #函数的嵌套定义
 2 def f1():
 3     def f2():
 4         def f3():
 5             print('from f3')
 6         print('from f2')
 7         f3()
 8     print('from f1')
 9     f2()
10 # print(f1)
11 f1()
12 
13 '''
14 from f1
15 from f2
16 from f3
17 
18 '''

 

四、装饰器

1、定义:

器即函数

装饰即修饰,意指为其他函数添加新功能

装饰器定义:本质就是函数,功能是为其他函数添加新功能

2、装饰器遵循的原则:开放封闭原则(对扩展是开放的,对源码修改是封闭的)

  即、1)不修改被装饰函数的源代码

    2)为被装饰函数添加新功能后,不修改被装饰函数的调用方式

3、装饰器,装饰器本质可以是任意可调用对象,被装饰的对象也可以是任意可调用对象,
  装饰器的功能是:在不修改被装饰对象源代码以及调用方式的前提下为期添加新功能

 

装饰器=高阶函数+函数嵌套+闭包

基本框架

1 #这就是一个实现一个装饰器最基本的架子
2 def timer(func):
3     def wrapper():
4         func()
5     return wrapper

 

统计一个函数运行时间的装饰器

# import time
# import random
# #装饰器
# def timmer(func):
#     # func=index
#     def wrapper():
#         start_time = time.time()
#         func() #index()
#         stop_time=time.time()
#         print('run time is %s' %(stop_time-start_time))
#     return wrapper
# #被装饰函数
# def index():
#     time.sleep(random.randrange(1,5))
#     print('welecome to index page')
#
# def home():
#     time.sleep(random.randrange(1,3))
#     print('welecome to HOME page')
#
# index=timmer(index) #index=wrapper
# home=timmer(home)
#
# index() #wrapper()
# home()

装饰器的语法:在被装饰对象的正上方的单独一行,@装饰器名字,#@timer就等同于index=timmer(index)

import time
import random
#装饰器
def timmer(func):
    def wrapper():
        start_time = time.time()
        func()
        stop_time=time.time()
        print('run time is %s' %(stop_time-start_time))
    return wrapper
#被装饰函数
@timmer             #index=timmer(index)
def index():
    time.sleep(random.randrange(1,5))
    print('welecome to index page')
# @timmer #home=timmer(home)
# def home():
#     time.sleep(random.randrange(1,3))
#     print('welecome to HOME page')

index() #wrapper()
# home()

加多个装饰器:

 1 #加多个装饰器
 2 import time
 3 import random
 4 #装饰器
 5 def timmer(func):
 6     def wrapper():
 7         start_time = time.time()
 8         func()
 9         stop_time=time.time()
10         print('run time is %s' %(stop_time-start_time))
11     return wrapper
12 def auth(func):
13     def deco():
14         name=input('name: ')
15         password=input('password: ')
16         if name == 'egon' and password == '123':
17             print('login successful')
18             func() #wrapper()
19         else:
20             print('login err')
21     return deco
22 
23 #被装饰函数  #多个装饰函数,从上往下添加,调用时从下往上
24 @auth                 #index=auth(wrapper) #index=deco                      #index=auth(wrapper) #index=deco
25 @timmer                #index=timmer(index) #index=wrapper 
26 def index():
27     # time.sleep(random.randrange(1,5))
28     time.sleep(3)
29     print('welecome to index page')
30 
31 
32 def home():
33     time.sleep(random.randrange(1,3))
34     print('welecome to HOME page')
35 
36 # index() #deco()
37 # home()

装饰器修订

 1 #装饰器修订
 2 import time
 3 import random
 4 #装饰器
 5 def timmer(func):
 6     def wrapper(*args,**kwargs):
 7         start_time = time.time()
 8         res=func(*args,**kwargs)  #接收参数
 9         stop_time=time.time()
10         print('run time is %s' %(stop_time-start_time))
11         return res    #增加返回值
12     return wrapper
13 #被装饰函数
14 
15 @timmer
16 def index():
17     time.sleep(random.randrange(1,5))
18     print('welecome to index page')
19 @timmer
20 def home(name):
21     time.sleep(random.randrange(1,3))
22     print('welecome to %s HOME page' %name)
23     return 123123123123123123123123123123123123123123
24 index()
25 
26 res1=index()
27 print('index return %s' %res1)
28 res2=home('egon') #wraper()
29 print('home return %s' %res2)

 

posted @ 2017-06-14 15:57  hedeyong11  阅读(216)  评论(1编辑  收藏  举报