Python之递归
一、引子
理解python递归之前需要明白函数返回的值,函数中没有写return语句,默认返回None。
1、函数没有return时,返回None
def a(n):
print(n)
print(a(3))
结果:
3
None
2、函数没写return返回值,返回None
def a(n):
print(n)
return
print(a(3))
结果:
3
None
二、递归
根据代码的顺序执行逻辑,结合递归的执行的逻辑,递归很好理解。递归的执行逻辑分为两个部分,递去和回归。我们通过下列代码和图片来理解整个过程。
def a(n):
if n<=1:
return 1
b=a(n-1) #loc
print(b)
print(a(3))
结果:
1
None
None
代码执行过程:
上图为递归逻辑过程,其中红色线代表递去过程,绿色线代表回归过程。
代码是按由上至下的顺序执行的,这个不难理解,调用a(3)时,由于不满足n<=1的条件,代码执行过程如红色线1,从这个位置,调用a(2)开启了递归逻辑过程;a(2)也不满足n<=1的条件,调用a(1),代码执行过程如红线2;a(1)满足n<=1的条件,return 1,即开启回归的过程,回到a(2)函数中,把1赋值给b,所以第一个打印值为1;顺序执行到return None ,a(2)的返回值为None,回到a(3)函数中,把None赋给b,所以第二打印值为None;接着顺序执行,a(3)的返回值为None,所以最后输出的也为None值。
三、实际应用
使用递归的删除文件夹中的所有文件,而不删除文件夹。在完成这个功能前,先需要理解**os.listdir()**函数,它能过返回文件加下所有文件的名称。
1、os.listdir()
8515632023439999000021文件夹下有’事故责任认定证明’, ‘保险出险、索赔通知书’, '支付类资料’等文件。使用os.listdir()函数的例子如下:
import os
path=r'./8515632023439999000021'
print(os.listdir(path))
结果:
['事故责任认定证明', '保险出险、索赔通知书', '支付类资料']
2、实现使用递归的删除文件夹中的所有文件,而不删除文件夹。
import os
def del_file(path):
if not os.listdir(path):
print('目录为空!')
else:
for i in os.listdir(path):
path_file = os.path.join(path,i) #取文件绝对路径
print(path_file)
if os.path.isfile(path_file): #若是文件则删除
os.remove(path_file)
else:
del_file(path_file) #是文件夹则进行递归
if __name__ == '__main__':
path=r'./8515632023439999000021'
del_file(path)
结果:
./8515632023439999000021\事故责任认定证明
./8515632023439999000021\事故责任认定证明\f3419645badcbe9d01b0187b87bbe2e98de9.jpg
./8515632023439999000021\保险出险、索赔通知书
./8515632023439999000021\保险出险、索赔通知书\b6e4d2f02f4b71268342921936f0b0eb8d15.jpg
./8515632023439999000021\支付类资料
./8515632023439999000021\支付类资料\8615632020439999000384_[20230714191404].zip
代码执行的逻辑为,首先判断目标文件夹是否为空文件,若不是空文件,则进一步判断文件夹是文件还是文件夹,若是文件则删除,若是文件夹则开始递归,直到文件夹下所有文件被删除。