python闭包和装饰器的关系_python之闭包函数和装饰器

1.闭包函数

作用域的关系:

作用域关系在函数定义阶段时就固定死了,与调用位置无关

即:在任意位置调用函数都需要跑到定义函数时寻找作用域关系

闭包函数:

闭指的是:该函数是一个内部函数

包指的是:指的是该函数包含对外部作用域(非全局作用域)名字的引用==(即形参变量名的赋值引用)

给函数传值有两种方式:

方式一:

使用参数的形式

def inner(x):

print(x)

inner(x)

方式二:

包给函数

def outter(x): 形参x=1 赋值

def inner():

print(x)

return inner

f=outter(1) ourret(1)函数最后运行结果是inner的内存地址,赋值给f

f() f()直接调用 inner函数

2.装饰器

1.什么是装饰器

器指的是工具,而在程序只能的函数就具备某一功能的工具

装饰指的是为被装饰对象添加额外功能

装饰器模板:

def timmer(func):

def wrapper(*args,**kwargs):

res=func(*args,**kwargs)

return res

return wrapper

#装饰器语法糖

# 在被装饰对象正上方,并且是单独一行写上@装饰器名

就目前来看:

定义装饰器就是定义一个函数,只不过该函数的功能是用来为 其他函数添加额外的功能

其实:

装饰器本身可以是任意可调用的对象

被装饰的对象也可以是任意可调用的对象

软件的维护遵循开放封闭原则

开放封闭原则指的是:软件一旦上线运行后对修改源代码是封闭的,对扩展功能的是开放的。这个时候就用到装饰器了

装饰器的实现必须遵循两大原则:

1.不修改被装饰对象的源代码

2.不修改被装饰对象的调用方式

装饰器就是在遵循1和2原则的前提下为呗装饰对象添加新功能

import time

def index():

print('welcom to index')

time.sleep(3)

def timmer(func):

#最原始func=index

def wrapper():

start=time.time()

func()

stop=time.time()

print('run time is %s'(stop-start))

return wrapper

index=timmer(index) #index=wrapper函数的内存地址

index()

装饰器中需要传参数的话,这时就需要用到之前的可变长参数的应用

*args,**keargs 函数形参会把参数原封不动转接给内部函数用

import time

def index():

print('welcome to index')

time.sleep(3)

return 123

def home(name):

print('welcome %s to name'%(name))

def timmer(func):

def wepper(*args, **kwargs):

start = time.time()

res = func(*args, **kwargs)

stop = time.time()

print('run time is %s' % (stop - start))

return res

return wepper

index = timmer(index)

home = timmer(home)

index()

home('egon')

装饰器语法糖:

在被装饰对象的上方,并且是单独一行写上@装饰器名

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()

# home('egon')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值