您的位置:首页 > 编程语言 > Python开发

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

2017-06-14 15:57 429 查看

一、闭包函数

闭包函数: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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: