Python之递归函数与装饰器
文章目录
- Python之递归函数与装饰器
- 递归的含义:
- python中的时间模块
- 装饰器
递归函数
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
递归函数特性:
- 必须有一个明确的结束条件;
- 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
- 相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入)。
- 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(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