Python之递归函数与装饰器

Python之递归函数与装饰器


递归函数

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

递归函数特性:

  1. 必须有一个明确的结束条件;
  2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
  3. 相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入)。
  4. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
递归的含义:

递归本身就是函数自己调自己,

举一个典型的例子:

计算1到100之间相加之和;通过递归两种方式实现

def sum(max):
    if max <= 100 and max >= 0:
        return max +sum(int(max) - 1)
    else:
        return 0
print(sum(100))

下面是通过文件和封装函数来实现递归

import os#需要#用os模块打开sys python系统
def func(path):#里面放的是参数-->变量
#打开这个文件夹--  拿里面的文件的名字
   lst=os.listdir('a')
   for name in lst#拿到每个文件的名字
   #判断name对应的文件是文件夹还是文件
   #获取到文件所在的路径
   real_path=os.path.join(path,name)
   if os.path.isdir(real_path):#判断是否是文件夹,需要把文件路径扔进去
     func(real_path)
    else:
      print(name)
      
      
func('a')#递归函数调用
python中的时间模块
Python 中有一个 time 模块可以用于获取当前时间戳:

import time
time1 = time.time()     # 每个时间戳都以自从1970年1月1日午夜(历元)经过了多长时间来表示,单位是秒
x = 10*10
time2 = time.time()
print(time2-time1)     # 表示运行 x = 10*10 所用的时间
装饰器

要想了解装饰器,首先要了解什么是闭包,在函数中再嵌套一个函数,并且引用外部函数的变量,这就是一个闭包了。我们来举一个简单的例子:

def outer(x):
    def inner(y):
        return x + y
    return inner     # 这就是一个闭包函数
print(outer(6)(5))     # 第一个参数是传给outer函数的,第二个传给inner函数

执行结果:

11

如代码所示,在 outer 函数内,又定义了一个 inner 函数,并且 inner 函数又引用了外部函数 outer 的变量 x,这就是一个闭包了。

装饰器是闭包的一种应用,从字面上理解,就是装饰对象的器件,其实装饰器本质上就是一个函数,功能是为其他函数添加功能,可以在不修改原有代码的情况下,为被装饰的对象增加新的功能或者附加限制条件或者帮助输出。

当我们不使用装饰器时:

def A(func):
    def B():
        print("我是附加功能1!")     # 附加功能
        func()
        print("我是附加功能2!")      # 附加功能
    return B
def C():
    print("我是函数原来的功能!")
res=A(C)
res()

执行结果:

我是附加功能1!
我是函数原来的功能!
我是附加功能2!

当我们使用装饰器时:

def A(func):     # func 表示一个函数
    def B():
        print("我是附加功能1!")     # 附加功能
        func()     # 调用传入的函数
        print("我是附加功能2!")     # 附加功能
    return B
@A     # @函数名 表示使用装饰器
def C():
    print("我是函数原来的功能!")
C()

执行结果:

我是附加功能1!
我是函数原来的功能!
我是附加功能2!

使用装饰器后,@A等价于不使用装饰器代码中的res=A(C)。当被装饰的函数需要传入参数时,装饰器的嵌套函数就需要添加一个参数。

def A(func):
    def B(x):     # 添加一个参数
        print("我是附加功能1!")     #附加功能
        func(x)
        print("我是附加功能2!")     #附加功能
    return B
@A
def C(x):
    print("我是函数原来的功能!%s"%x)
C('hello action!')

执行结果:

我是附加功能1!
我是函数原来的功能!hello action!
我是附加功能2!

除了被装饰的函数可以添加参数之外,装饰器也是可以添加参数的。

def A(x):
    def B(func):
        def C(y):
            func(y)
            print(x)
        return C
    return B
@A('hello')
def D(x):
    print(x)
D('你好!')

执行结果:

你好!
hello
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Deng872347348

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值