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()运行的时间。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值