Python中递归以及递归遍历目录详解


Posted in Python onOctober 24, 2021

递归

递归的概念:函数包含了对自身的调用,那么就是递归

使用的场景:如果你发现你将要做的事情就是你现在做的,那么用递归

递归类似循环;在编写或阅读递归时,首先我们关注的是递归的终止条件

递归求和

在接触递归之前,我们先来做这么一个问题:如果说,要对一个数字列表求和(或者其他序列)求和,除了我们可以使用内置的sum函数,还有什么办法?

while循环

L = [1,2,3,4,5]
mysum = 0 #保存和的变量
while L: #将列表最为循环条件
	mysum += L[0] #每次将列表第一个位置的值加到和中
	L = L[1:] #去掉列表第一个元素

for循环

L = [1,2,3,4,5]
mysum = 0
for var in L:
	mysum += var

递归求和

def mysum(L):
    if not L:
        print ('L is empty')
        return 0
    else:
      	return L[0]+mysum(L[1:])
# 在返回值中,我们返回了一个函数的调用,并且传递的参数为去掉当前列表第一个元素的新列表

递归处理非线性循环

递归还可以处理一些非线性循环,而普通的循环是无法处理的;比如这样一个列表对其求和:

L = [1,[2,[3,4],5],6,[7,8]]

由于这个列表不是一个线性迭代,包含着复杂的元素嵌套,普通的循环语句处理起来将会非常难以控制

L = [1,[2,[3,4],5],6,[7,8]]
sum = 0
def mysum(L):
    global sum
    for var in L:
    	if not isinstance(var,list):   
            #如果其中元素不为列表类型,则为一个确定的值
            sum += var
        else:
         	mysum(var)
    return

花钱递归

思考:假如你有10000块,每天花一半,毛钱直接舍弃,那么这钱可以花几天?

递归解决:

def cost(money,day=0):
    if money > 0:
        money = money // 2 #每次花一半
        day += 1 #花完天数+1
        cost(money,day) #开启花钱递归
    else:
        print('一共可以花%d天' % day)
        return #必须要有的一个终止条件

递归注意事项

Python中,递归的最大上限次数差不多是998次,一个没有终止条件的递归会引发错误(类似一个死循环)

这是因为递归的每一次函数执行,都会在内存中产生新的函数副本,递归的内存消耗要大于普通循环

>>> def func():
...     return func()
...
>>> func()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in func
  File "<stdin>", line 2, in func
  File "<stdin>", line 2, in func
  [Previous line repeated 995 more times]
RecursionError: maximum recursion depth exceeded
#这里我们在995次递归之后,达到上线,从而报错

我们也可以手动干预递归的上限,但是这是有风险的,要结合计算机本身内存来考虑

>>> import sys
>>> sys.setrecursionlimit(num)
# num为控制修改的最大递归上限次数

实现Tree命令

核心思路在于,目录结构的深度及广度是错综复杂的,通过单纯的循环来做判定是一件非常苦难的事情

而递归恰好适合这样的非线性循环问题,当然也有一些弊端,当目录结构越来越复杂,那么程序的执行效率会越来越差

import os

def getdir(path, level=0):
    if path == '':
      	path = os.getcwd()  # 获取当前的工作目录
    level += 4
    num = level // 4
    abs_path = os.path.abspath(path)
    for name in os.listdir(path):  # 返回的是一个列表
        format_str = ''
        if os.path.isfile(os.path.join(abs_path, name)):
            for var in range(num):  # range函数用来控制循环次数
              	format_str += '_' * 4 + '?'
            format_str = format_str[0:-1]
            format_str += name
            mystr = format_str.replace('_', ' ', level-4)  # 替换掉level-4个_
    else:
        for var in range(num): # range函数用来控制循环次数
            format_str += '_' * 4 + '?' # 输出样式构造
        format_str += name
        mystr = format_str.replace('_',' ',level-4) # 替换掉level-4个_
    print(mystr) # 输出格式字符串
    name = os.path.join(abs_path,name)
    if os.path.isdir(name): # 绝对路径,判断是否是文件夹
	    getdir(name,level)
path = input('请输入你要遍历的目录:')
getdir(path)

总结

到此这篇关于Python中递归以及递归遍历目录的文章就介绍到这了,更多相关Python递归遍历目录内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python文件和目录操作详解
Feb 08 Python
Python实现查找系统盘中需要找的字符
Jul 14 Python
python基础入门学习笔记(Python环境搭建)
Jan 13 Python
详解Python中的__getitem__方法与slice对象的切片操作
Jun 27 Python
itchat和matplotlib的结合使用爬取微信信息的实例
Aug 25 Python
Python中pandas模块DataFrame创建方法示例
Jun 20 Python
python爬取网易云音乐评论
Nov 16 Python
python 直接赋值和copy的区别详解
Aug 07 Python
python常用排序算法的实现代码
Nov 08 Python
Python中的 ansible 动态Inventory 脚本
Jan 19 Python
深度学习入门之Pytorch 数据增强的实现
Feb 26 Python
Django与数据库交互的实现
Jun 03 Python
python基础之函数的定义和调用
python 标准库原理与用法详解之os.path篇
Oct 24 #Python
Python干货实战之八音符酱小游戏全过程详解
关于python pygame游戏进行声音添加的技巧
Oct 24 #Python
python实现简单石头剪刀布游戏
Python 数据结构之十大经典排序算法一文通关
Python 的 sum() Pythonic 的求和方法详细
Oct 16 #Python
You might like
php 判断字符串编码是utf-8 或gb2312实例
2016/11/01 PHP
php in_array() 检查数组中是否存在某个值详解
2016/11/23 PHP
用ASP将SQL搜索出来的内容导出为TXT的代码
2007/07/27 Javascript
浅谈Javascript鼠标和滚轮事件
2012/06/27 Javascript
jQuery中filter()和find()的区别深入了解
2013/09/25 Javascript
js字母大小写转换实现方法总结
2013/11/13 Javascript
javascript获取select的当前值示例代码(兼容IE/Firefox/Opera/Chrome)
2013/12/17 Javascript
利用JS解决ie6不支持max-width,max-height问题的方法
2014/01/02 Javascript
全面解析JavaScript的Backbone.js框架中的Router路由
2016/05/05 Javascript
js 性能优化之算法和流程控制
2017/02/15 Javascript
js判断手机系统是android还是ios
2017/03/07 Javascript
js简易版购物车功能
2017/06/17 Javascript
react-native组件中NavigatorIOS和ListView结合使用的方法
2017/09/30 Javascript
node.js将MongoDB数据同步到MySQL的步骤
2017/12/10 Javascript
JS内部事件机制之单线程原理
2018/07/02 Javascript
详解vue2.0+axios+mock+axios-mock+adapter实现登陆
2018/07/19 Javascript
微信小程序实现Session功能及无法获取session问题的解决方法
2019/05/07 Javascript
使用layui实现树形结构的方法
2019/09/20 Javascript
vue resource发送请求的几种方式
2019/09/30 Javascript
详解钉钉小程序组件之自定义模态框(弹窗封装实现)
2020/03/07 Javascript
nuxt 服务器渲染动态设置 title和seo关键字的操作
2020/11/05 Javascript
浅析JavaScript中的事件委托机制跟深浅拷贝
2021/01/20 Javascript
从零学python系列之数据处理编程实例(一)
2014/05/22 Python
Python中捕捉详细异常信息的代码示例
2014/09/18 Python
Python标准库urllib2的一些使用细节总结
2015/03/16 Python
python 进程间数据共享multiProcess.Manger实现解析
2019/09/23 Python
Python解析多帧dicom数据详解
2020/01/13 Python
Python基于Hypothesis测试库生成测试数据
2020/04/29 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
2020/05/11 Python
HashMap和Hashtable的区别
2013/05/18 面试题
小学老师寄语大全
2014/04/04 职场文书
平安工地建设方案
2014/05/06 职场文书
升旗仪式演讲稿
2014/05/08 职场文书
2015纪念九一八事变84周年演讲稿
2015/03/19 职场文书
MySQL的全局锁和表级锁的具体使用
2021/08/23 MySQL
mongoDB数据库索引快速入门指南
2022/03/23 MongoDB