本次笔记分两部分,一是函数参数相关内容,二是装饰器,其中装饰器是重点。
一、函数
位置参数,关键字参数等相关理解:
输出结果:
这里b=2对应b,现在有个问题,老师一直没讲,所以一定要试一下,如果b=2放在ac,bd中间会不会执行?还是直接报错呢?
真的一点关系都没有,结果一样,那再试下关键字参数。
结果:
改进一点点:
这样会报错,但如果写成b=5会怎样?
也会报错,如果将b=5移到前面去试下:
不能把位置参数放在关键字参数后面
再次调整位置:
这样没有问题,再想办法,
总结一句话,如果有关键字参数,就必须在位置参数后面。
去掉就可以了,应该说清楚了这样的问题了。
二、装饰器
递归
1.明确的结束条件
2.问题规模每递归一次都应该比上一次的问题规模有所减少
3.效率低
函数式编程,没有副作用
http://blog.51cto.com/egon09/1836763
装饰器
定义:本质是函数,(装饰其他函数),就是为其他函数添加附加功能。
原则:
1.不能修改被装饰的函数的源代码
2.不能修改被装饰的函数的调用方式
第一个Demo
不写装饰器:先写test1
调用:
编写简单装饰器,计数运行时间:
使用装饰器:
运行结果:
后面的功能是装饰器添加上来的。
实现装饰器知识储备:
1.函数即“变量”
2.高阶函数
a:把一个函数名当做实参传给别外一个函数(在不修改被装饰函数源代码的情况下为其添加功能)
b:返回值中包含函数名(不修改函数的调用方式)
3.嵌套函数
高阶函数+嵌套函数==>装饰器
演示过程:
1、函数即“变量”
func就是函数,可以做为参数传入
2、高阶函数
还是高阶函数,相当于局部变量函数
3、装饰器过程演变
3.1把一个函数名当做实参传给别外一个函数(在不修改被装饰函数源代码的情况下为其添加功能)
3.1.1添加原函数bar
3.1.2编写计时装饰函数
3.1.3增加功能
3.2使用高阶函数,返回值中包含函数名(不修改函数的调用方式)
调用方法:
将timer(bar)返回值再给bar就可以保证了调用方式没有改变。
到此为此基本上讲完了,所有装饰器功能,但是这样写起来不方便。
3.3语法糖
注意@timer 是前面写的函数名称
3.4意外出现了
为什么会报错?查看装修器就可以知道,函数func()时未传参数。
3.5改进
理解一下后,可以知道,bar=timer(bar)这个bar其实是deco,所以调用的了bar()==deco(),因此参数放在哪就呼之而出了。
貌似没有问题了,其实不然,如果加上以前的foo()试试
又会出现问题。
3.6终极解决方案
用前面学习过的*args,**kvargs
总结:
虽然以前也用过装饰器,但是没有这次这样能理解清楚。确实对我有很大帮助。
请继续关注公众号,跟踪其他知识