python 函数的进阶
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 函数的进阶相关的知识,希望对你有一定的参考价值。
一、递归函数
一个函数自己调用自己就是递归调用。
这样会陷入死循环,跟while和for的死循环不同的是,递归调用的函数只能循环999次,然后就报错了。
递归调用的特性:
1、必须有一个明确的结束条件
2、递归调用效率不高,每次进入更深一次的递归时,问题规模要比上次递归有所减少
二、高阶函数
1、如果一个函数A作为参数传入另一个函数B,那么B就为高阶函数。
2、函数名变量
hello是变量名,存的是hello这个函数的地址,new_hello = hello,那么new_hello存储的内容和hello的相同,都是print(name)这个函数体。
所以调用new_hello(),和调用hello(),是一样的。
下图为高阶函数的用法(参数z是一个函数名):
三、嵌套函数
1、定义就是函数里面定义另一个函数
2、函数的作用域
之前讲了全局变量和局部变量,全局变量可以在任何地方使用,局部变量只能在内部使用。
函数的作用域是就近原则,当前函数找不到变量就去上一层集去找,找不到再去上一层集,从里往外找直到找到为止。但是上一层集的变量不能在里面的函数去找。
运行结果:
这里打印的顺序和取值的内容是因为:
首先,调用warpper,函数体力定义了deco()和hhh()两个函数,定义后,先是调用了hhh()函数,但是因为hhh()在deco()里面,deco()不执行所以hhh()调用也不能执行;
接着,调用deco()函数,那么开始执行deco函数,打印出“xxxkevin”和“我在里面susan”,deco执行完毕,最后打印出“我是candy”。
四、装饰器
装饰器说白了就是函数嵌套+高阶函数,它的作用是不改变原来函数的调用方式,不用修改代码就可以给一个函数添加一个功能。比如想要计算一个方法运行了多长时间,需要在程序运行前获取一个时间,运行结束再获取一个时间,然后求时间差。但是这种方法比较麻烦,一个方法可以,多了就很麻烦了。
下面是用装饰器来写,函数名bar作为一个参数传进test1函数,调用test1(bar),计算bar()运行了多长时间。但是这样写,改变了函数的调用方式。也不是我们最终想要的装饰器。
下面这个是装饰器的最终版本。和上面不同的是,“@timer”的作用相当于“bar = timmer(bar)”,当调用bar()时,也就是调用timmer(bar),timmer方法中,定义了一个deco()函数,定义之后返回deco这个函数名。也就是说,调用timmer(bar),最终的结果是返回deco这个函数名,我们说函数名即变量,存的是函数体在内存的地址,那bar = deco,bar里面的内存地址发生变化,它的函数体变成了deco()函数的函数体,此时调用bar(),就是执行deco(),从而达到计算bar()运行的时间。
以上是关于python 函数的进阶的主要内容,如果未能解决你的问题,请参考以下文章
python进阶一(函数式编程)2-2 python中的map函数