文档开发者中心
我的

Python十大装B语法

9. 装饰器

刚弄明白迭代器和生成器,这又来个装饰器,Python 咋这么多器呢?的确,Python 为我们提供了很多的武器,装饰器就是最有力的武器之一。装饰器很强大,我在这里尝试从需求的角度,用一个简单的例子,说明装饰器的使用方法和制造工艺。

假如我们需要定义很多个函数,在每个函数运行的时候要显示这个函数的运行时长,解决方案有很多。比如,可以在调用每个函数之前读一下时间戳,每个函数运行结束后再读一下时间戳,求差即可;也可以在每个函数体内的开始和结束位置上读时间戳,最后求差。不过,这两个方法,都没有使用装饰器那么简单、优雅。下面的例子,很好地展示了这一点。

>>> import time>>> def timer(func):
 def wrapper(*args,**kwds):
  t0 = time.time()
  func(*args,**kwds)
  t1 = time.time()
  print('耗时%0.3f'%(t1-t0,))
 return wrapper>>> @timerdef do_something(delay):
 print('函数do_something开始')
 time.sleep(delay)
 print('函数do_something结束')

 >>> do_something(3)函数do_something开始
函数do_something结束
耗时3.077
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

timer() 是我们定义的装饰器函数,使用@把它附加在任何一个函数(比如do_something)定义之前,就等于把新定义的函数,当成了装饰器函数的输入参数。运行 do_something() 函数,可以理解为执行了timer(do_something) 。细节虽然复杂,不过这么理解不会偏差太大,且更易于把握装饰器的制造和使用。

10. 巧用断言assert

所谓断言,就是声明表达式的布尔值必须为真的判定,否则将触发 AssertionError 异常。严格来讲,assert是调试手段,不宜使用在生产环境中,但这不影响我们用断言来实现一些特定功能,比如,输入参数的格式、类型验证等。

>>> def i_want_to_sleep(delay):
 assert(isinstance(delay, (int,float))), '函数参数必须为整数或浮点数'
 print('开始睡觉')
 time.sleep(delay)
 print('睡醒了')

 >>> i_want_to_sleep(1.1)开始睡觉
睡醒了>>> i_want_to_sleep(2)开始睡觉
睡醒了>>> i_want_to_sleep('2')Traceback (most recent call last):
  File '<pyshell#247>', line 1, in <module>
    i_want_to_sleep('2')
  File '<pyshell#244>', line 2, in i_want_to_sleep    assert(isinstance(delay, (int,float))), '函数参数必须为整数或浮点数'AssertionError: 函数参数必须为整数或浮点数
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

后记

近期有很多朋友通过私信咨询有关python学习问题。为便于交流,我在CSDN的app上创建了一个小组,名为“python作业辅导小组”,面向python初学者,为大家提供咨询服务、辅导python作业。欢迎有兴趣的同学扫码加入。

点赞
收藏
回复
分享
举报
浏览378 发布于2019-11-15 10:09未知归属地
全部评论
最多点赞
最新发布
最早发布
暂无评论
暂无评论
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要发帖子

目录 收起
9. 装饰器
10. 巧用断言assert
后记
了解社区公约,与您携手共创和谐专业的开发者社区。