python后端开发面试题_python 后端面试 必备必会问答大全

202008102025.jpg

1、对闭包和装饰器的理解

先来介绍下 装饰器的用途,为什么要使用装饰器

假如有这么个功能,来计算耗时:

def add():

start_time = time.time()

time.sleep(3)

end_time = time.time()

print("耗时:{}".format(end_time - start_time))

return None

if __name__ == "__main ":

add(1, 3)

疑问:会发现,如果我有多个应用需要计时,那就需要写很多的重复代码,这时候就可以使用装饰器来操作:

# 定义一个方法,接收一个函数,在python中一切皆对象,函数也可以用来做参数赋值等

# 需要理解python装饰器加载的过程和闭包

# 新建一个test.py

import time

def time_desc(func):

print("装饰器")

start_time = time.time()

func()

end_time = time.time()

print("耗时:{}".format(end_time - start_time))

# return a + b

@time_desc

def add():

time.sleep(3)

return None

python test.py 运行后,发现函数time_desc,执行了,控制台输入了日志

装饰器

耗时:3.000149965286255

耗时:3.000149965286255

我们并没有运行 time.desc 方法,那它为什么执行了呢?

事实证明了,在执行或者调用了这个模块里有装饰器,那python的这个@语法糖就直接运行了这个函数,所以我们才需要把

装饰器,写成闭包的形式

改写成:

import time

def time_desc(func):

def wrapper():

print("装饰器")

start_time = time.time()

func()

end_time = time.time()

print("耗时:{}".format(end_time - start_time))

return wrapper # 注意 此处不是 wrapper() 不是调用

@time_desc

def add():

time.sleep(3)

return None

这就是装饰器的由来;

还有需要注意:

(1)经语法糖@装饰器后,返回的其实是wrapper,如果你调用 add() 其实是执行了装饰器 wrapper方法,

(2)如果add(a,b) 有参数的话,那装饰器 wrapper(*args, **kwargs),来解决参数问题

j_0002.gif

本博客源码Github地址:

请随手给个star,谢谢!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值