python函数加点_学习python第九天——函数

昨天学习了一些函数基本的使用,今天学习函数中一些特殊用法。

一、传递任意数量的实参

1、可以创建形参*topping中*让python创建一个名为topping的空元组,并将收到的所有制都封装到这个元组中。

2、使用任意数量的关键字实参

有时候,需要接受任意数量的实参,但预先不知道传递给函数德惠市什么样的信息。在这种情况下,可将函数编写成能够接受任意数量的键值对,一般用**

二、装饰器

装饰器有点复杂,自我感觉讲不明白,还是摘抄他人微博

我觉得在开始学一种东西时,应该用20%的时间读取80%的基础内容,剩下20%的内容需要用80%的时间才能深入理解,这篇文章就是让你用20%的时间读取80%的内容的

本文参考https://foofish.net/python-decorator.html

在python这种动态语言里,一切都是对象,包括函数也是对象,所以便有了闭包

由于本人见识浅短,如果错误请各位大佬指正,非常感谢!

1、什么是闭包

这个函数内含还含有一个函数,并且这个内嵌函数,使用了外部函数的参数。

上面这种函数,便被称为闭包。跟普通函数的不同是,内嵌函数p_name用了外部函数的变量name,使外部变量生命周期被延长了。而普通函数的变量,在进入其他函数时,变量便无法再用了。

这种内部函数调用外部变量的行为,就叫做闭包。

变量生命周期被延长是因为闭包会使用python中一个魔法属性__closure__,它负责把外部变量生命周期延长。

你可以这样理解以记忆,不管怎样,name的缩进还是放在print_func里的,所以在内部函数p_name里能用理所当然(有些人就是这样理解的,虽然不太对)

闭包有什么用?闭包用处就大了,我们平常用的装饰器,就是闭包实现的

如果,我们不是传入一个字符串作为参数,而是传入函数作为参数呢

输出

, 把函数当成参数传入,目的是为了在此函数运行之前加点什么, 由于传入的函数是set_string,执行顺序为:

执行顺序

print_func不重要,它只是用来传参的,重要的是p_name,它在添加内容

如果你需要使用参数:

输出

这个特性是由于python处处是对象,函数也可以作为对象。比如在这个例子里。foo跟p_name是指向同一个函数的引用。如果不理解引用,那你就把foo跟p_name当成同一个东西,没加括号为函数对象本身,加上括号则代表在此调用方法。调用foo即foo()则相当于p_name()。而set_string跟name又是同一个函数的引用。这也是为什么很多人说装饰器是语法糖的原因。

2、装饰器

其实上面传入函数的例子,就是装饰器了,python使用@来使用装饰器, 此时name是一个函数对象,即set_string('Tory')

你可以这么认为:是先执行set_string(string)的头部部分,然后进入print_func, 到执行完p_name里的内容,最后执行set_string(string)缩进部分的内容

如果你需要使用到函数实例里的参数,可以使用*args与**kwargs接受函数所有参数,比如这么写

,输出

如果你需要让装饰器应用更多的场景, 可以用三层嵌套,通过传入参数

输出

name依旧对应着函数对象,由于我们的装饰器里传入参数,所以就以内嵌函数来对应函数对象

3、装饰函数后方

如果想要装饰函数后方,可以在最里层,在运行函数时,在函数运行后进行代码编写,(最里层可以不写return,因为它是直接用函数指针运行函数, 区别是前面return时不带括号,是函数本体,最里面一个是带括号的,是运行实例)

4、装饰器有什么用?

具体有什么用呢。可以用来控制执行顺序,一般体现在,给函数加上什么说明或者日志。

开始日志

运行的函数或者代码块

结束日志

这种做法在Java中叫AOP(Aspect Oriented Programming)面向切面编程。简单来说就像上面的。需要给方法添加一些装饰(更正确应该说作为一个切面插入,符合可拔插的思想)。以装饰器为例,有一天你想给这个某个方法前后使用日志,因此你就使用了装饰器。然后过了几天,你又要使用这个函数,但这次你不用日志了,你想给他设置访问控制。那你这个函数的代码完全不用动,只需再写个访问控制的装饰器。然后加上就行

装饰器极大程度重用了代码,简直写代码的好帮手

5、多个装饰器的执行顺序

执行顺序等效于

————————————————

版权声明:本文为CSDN博主「贯穿真Sh」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/ljt735029684/article/details/80703649

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值