闭包函数与装饰器

1、闭包函数

(1)闭指的是该函数时一个内部函数;

(2)包指的是该函数包含对外部作用域(非全局作用域)名字的应用

# def outter():
# x = 1
# def inner():
# print(x)
# return inner
#f=outter()
# def f2():
# x=1111111
# f()
# f2()

2、函数的传值方式
(1)使用参数的形式
 def inner(x):
# print(x)
# inner(1)
# inner(1)
# inner(1)

(2)包给函数

def outter(x):
# x=1
def inner():
print(x)
return inner #返回inner的内存地址

f=outter(18) #outter()就是inner的内存地址
f() #加()调用inner函数


 import requests
# def outter(url):
# # url='https://www.baidu.com'
# def get():
# response=requests.get(url)
# if response.status_code == 200:
# print(response.text)
# return get
#
# baidu=outter('https://www.baidu.com')
# python=outter('https://www.python.org')
# baidu()
# baidu()
#
# python()
# python()

3、装饰器
(1)什么是装饰器?
器指的是工具,而程序中的函数就具备某一功能的工具;装饰指的是为被装饰器对象添加额外的功能;
就目前尚未知识来看:
定义装饰器就是定义一个函数,只不过该函数的功能是用来为其他函数添加额外的功能;
其实:
装饰器本身可以是任意可调用的对象,被装饰的对象也可以是任意可调用的对象

(2)为什么要用装饰器?
软件的维护应该遵循开放封闭的原则
开放封闭的原则指的是:软件一旦上线运行后对修改源代码是封闭的,对扩展功能是开放的,这就
用到了装饰器。
装饰器的实现毕勋遵循两大原则:
1、不修改被装饰对象的源代码
2、不修改被装饰对象的调用方式
(装饰器其实就在遵循1和2原则的前提下为被装饰对象添加新功能)

(3)如何用装饰器?
# import time
# def index():
# print('welcom to index')
# time.sleep(3)
#
# def timmer(func):
# #func=最原始的index
# def wrapper():
# start=time.time()
# func() #调用index函数
# stop=time.time()
# print('run time is %s' %(stop - start))
# return wrapper
#
# index=timmer(index) #index=wrapper函数的内存地址
# index()


4、装饰器修正
(1)被装饰函数有返回值
import time
def index():
print('hoole')
time.sleep(3)
return 234

def timmer(func):
def y():
ster = time.time()
res = func()
stop = time.time()
print('run is %s' %(stop-ster))
return(res)
return y
index =timmer(index)
res=index()
print(res)

(2)被装饰函数是有参函数
import time
def home(name):
print('holle %s'%(name))
time.sleep(3)

def index():
print('weloce come')
time.sleep(2)

def timmer(func):
def y(*args ,**kwargs ): #参数y需要有形参,调用home就是调用y函数,home的实参,传给y 函数使用
ster = time.time()
func(*args ,**kwargs)
stop = time.time()
print('rnu is %s' %(stop -ster))
return y

index = timmer(index)
index()
home=timmer(home)
home('qqc')

5、装饰器语法糖
在被装饰的整上方,并且是单独一行写上@装饰器名
# import time
# def timmer(func):
# #func=最原始的index
# def wrapper(*args,**kwargs):
# start=time.time()
# res=func(*args,**kwargs)
# stop=time.time()
# print('run time is %s' %(stop - start))
# return res
# return wrapper
#
# @timmer # index=timmer(index)
# def index():
# print('welcome to index')
# time.sleep(3)
# return 123
#
# @timmer # home=timmer(home)
# def home(name):
# print('welcome %s to home page' %name)
# time.sleep(2)
#
# res=index()
# print(res)
# home('egon')








def deco(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
return res
return wrapper

(装饰器通用模式)





原文地址:https://www.cnblogs.com/quqinchao/p/qqcnm.html