最全一篇文章掌握 Python 中的装饰器,科学技术协会面试形式

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

print(’ sleep %d seconds.\n sleeps over.'%seconds)

return seconds

print(sleeps(3))

执行以上代码,输出:

start timer:

sleeps begin:

sleep 3 seconds.

sleeps over.

end timer:3.002512s.

3

可见,timethis装饰器实现了为sleeps函数计时的功能。其关键在于@标识符的使用。

一、理解@标识符

@标识符是Pyton的语法糖,定义被装饰函数时使用@timethis修饰和用语句sleeps = timethis(sleeps)是等价的。

@timethis

def sleeps(seconds):

print(’ sleeps begin:')

time.sleep(seconds)

print(’ sleep %d seconds.\n sleeps over.'%seconds)

return seconds

相当于

‘’’

遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025

寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!

‘’’

def sleeps(seconds):

print(’ sleeps begin:')

time.sleep(seconds)

print(’ sleep %d seconds.\n sleeps over.'%seconds)

return seconds

sleeps = timethis(sleeps)

@语法只是装饰器调用的便捷方式:将被装饰函数sleeps作为参数传给装饰器函数,再将装饰器返回值重新绑定到原sleeps变量上。理解了装饰器的使用方法,我们一步步来理解其定义过程。

二、装饰器是一个函数
  • 根据上文timethis装饰器的定义,它毫无疑问是一个函数。名称是timethis,参数是func,返回值是inner。

  • 根据 sleeps = timethis(sleeps) ,可知参数func是被装饰的函数sleeps。

  • 根据 return inner ,可知返回值inner是嵌套定义在装饰器中的一个函数。

综上,装饰器本身是一个函数,参数也是函数,返回值还是函数。之所以函数可以作为装饰器的参数和返回值,是因为函数在Python中是一等对象。

三、函数是一等对象

编程语言中的一等对象定义为:运行时创建,可赋值给变量或数据结构,可作为参数传递,可作为返回值返回。

Python中整数、字符串、字典类型是一等对象,具备以上四点特性,理解起来没有任何困难。但函数作为一等对象,需要我们举例说明。

3.1运行时创建

在Python控制台中定义一个函数reverse,实现对word这个序列类型的反转。

def reverse(word):

… return word[::-1]

reverse

<function reverse at 0x027A4C40>

reverse(‘hello world!’)

‘!dlrow olleh’

因其是在控制台会话中定义的,符合第一条运行时创建的要求。

3.2可赋值给变量或数据结构

可以将reverse函数赋值给另外的变量,再调用。如

backward=reverse

backward(‘hello world!’)

‘!dlrow olleh’

输出结果同上。所以函数符合第二条可赋值给变量的要求。

3.3函数作为参数传递

当使用高阶函数,如sorted时,高阶函数的key关键字接受一个单参数函数,对每个元素进行迭代,依照这个key函数作为排序依 据。

cars = [‘Honda’,‘toyota’,‘hyundai’,‘byd’,‘ford’,‘suzuki’,‘peuguot’,‘nissan’,‘citroen’,‘kia’,‘vw’,‘gm’,‘audi’,‘bmw’,‘beniz’]

print(sorted(cars,key=reverse))

输出

[‘Honda’, ‘kia’, ‘toyota’, ‘ford’, ‘byd’, ‘hyundai’, ‘audi’, ‘suzuki’, ‘gm’, ‘nissan’, ‘citroen’, ‘peuguot’, ‘bmw’, ‘vw’, ‘beniz’]

此时所有的car是依照结尾字符的先后排序的。reverse作为参数传入高阶函数。符合第三条函数可作为参数传递。

3.4函数作为返回值返回

为验证第四点,我们将reverse函数包装起来,让他在一个函数中返回。

‘’’

遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025

寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!

‘’’

def cmpLib():

def reverse(word):

return word[::-1]

return reverse

我们仍用上例中排序函数,key参数必须为一个单参函数。而函数backward的执行结果是一个函数,所以我们把它的调用结果作为key值。

print(sorted(cars,key=cmpLib())

结果

[‘Honda’, ‘kia’, ‘toyota’, ‘ford’, ‘byd’, ‘hyundai’, ‘audi’, ‘suzuki’, ‘gm’, ‘nissan’, ‘citroen’, ‘peuguot’, ‘bmw’, ‘vw’, ‘beniz’]

可见,结果正确。所以第四条函数可作为结果返回也成立。

综上,函数是一等对象。除了可调用性之外,函数和其他如字典、字符串、列表对象并没有本质区别。

理解装饰器我们需要的是函数一等性定义的后三点:函数可赋值,可作参数,可作返回结果。

我们再来分析与@timethis等价的sleeps = timethis(sleeps)语句:右侧函数先调用。timethis是装饰器函数,被装饰函数sleeps作为参数传入装饰器中;返回结果是装饰器中定义的inner函数;右侧计算结果重新赋值给变量sleeps。完美符合以上三点。也就是说sleeps函数实际上已经指向inner函数了。

理解了函数一等性,就理解了函数可以作为参数传递和作为结果返回。那么新定义的内部函数inner为什么采用 def inner(*args,**kwargs): 的参数命名形式呢?

四、可接受任意数量参数的函数

当我们定义不特定数量参数的函数时,可使用*开头的参数作可接受任意数量位置参数的参数,此时该参数作为一个元组使用。

同理,可以使用**开头的关键字参数接受任意数量的关键词参数,此时该参数作为一个字典使用。

如果同时接受任意数量的位置参数和关键字参数,那么只要联合使用***就可以。而 def inner(*args,**kwargs): 是约定俗成的固定写法。来看个例子就可以理解这种写法了。

def star(*args,**kwargs):

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

五、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值