wavaya

本次笔记分两部分,一是函数参数相关内容,二是装饰器,其中装饰器是重点。

一、函数

位置参数,关键字参数等相关理解:

输出结果:

这里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

总结:

虽然以前也用过装饰器,但是没有这次这样能理解清楚。确实对我有很大帮助。

 

请继续关注公众号,跟踪其他知识

 

相关文章: