首页 > 代码库 > python 函数的进阶

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 函数的进阶