鱼C论坛

 找回密码
 立即注册
查看: 1320|回复: 8

[已解决]python 递归调用函数

[复制链接]
发表于 2020-3-13 16:32:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 一个账号 于 2020-3-13 16:34 编辑
def search_file(start_dir):
    os.chdir(start_dir)
    print(os.getcwd())
    target = ['.c', '.cpp', '.py', '.cc', '.java', '.pas', '.asm']
    line_num = []
    sum = 0

    for each_file in os.listdir():
        ext = os.path.splitext(each_file)[1]
        if ext in target:
            line_num.append(calc_code(each_file))
            print(line_num)
                
        if os.path.isdir(each_file):
            search_file(os.getcwd() + '/' +each_file)
            os.chdir('..')

    for j in range(len(line_num)):
        sum += int(line_num[j])
    return sum

递归调用函数,找出指定路径下所有文件的总行数, 遇到文件夹也需要计算。

也就是说如果我想把递归调用函数的出的结果统一保存, 可是每递归调用一次函数, 起那面的line_num 列表就是空的, sum 也是等于0 的。这个有什么办法解决没有。
最佳答案
2020-3-13 16:39:13
把line_num和sum放到函数的外面
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-13 16:39:13 | 显示全部楼层    本楼为最佳答案   
把line_num和sum放到函数的外面
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-13 16:44:43 | 显示全部楼层
qiuyouzhi 发表于 2020-3-13 16:39
把line_num和sum放到函数的外面

放到函数外边还能生效吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-13 16:45:36 | 显示全部楼层
在第二个if中加了一行代码,将递归的返回值也添加到列表中,即将下一层文件夹中的文件总行数返回一并统计到该层文件夹的文件总行数中。我没有测试,你试一下是否正确。
def search_file(start_dir):
    os.chdir(start_dir)
    print(os.getcwd())
    target = ['.c', '.cpp', '.py', '.cc', '.java', '.pas', '.asm']
    line_num = []
    sum = 0

    for each_file in os.listdir():
        ext = os.path.splitext(each_file)[1]
        if ext in target:
            line_num.append(calc_code(each_file))
            print(line_num)
                
        if os.path.isdir(each_file):
            lines=search_file(os.getcwd() + '/' +each_file)
            line_num.append(lines)
            os.chdir('..')

    for j in range(len(line_num)):
        sum += int(line_num[j])
    return sum
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-13 16:50:44 | 显示全部楼层
二爷zou 发表于 2020-3-13 16:44
放到函数外边还能生效吗

能的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-13 17:02:05 | 显示全部楼层

import easygui as g
import os

def calc_code(file_name):
    lines = 0
    with open(file_name) as f:
        print("正在分析文件: %s..." % file_name)
        try:
            for each_line in f:
                lines += 1
        except UnicodeDecodeError:
            pass
    return lines


def search_file(start_dir):
    os.chdir(start_dir)
    print(os.getcwd())
    target = ['.c', '.cpp', '.py', '.cc', '.java', '.pas', '.asm']
   

    for each_file in os.listdir():
        ext = os.path.splitext(each_file)[1]
        if ext in target:
            line_num.append(calc_code(each_file))
               
        if os.path.isdir(each_file):
            search_file(os.getcwd() + os.sep + each_file)
            os.chdir(os.pardir)




line_num = []
sum = 0
start_dir = g.diropenbox()
search_file(start_dir)
for j in range(len(line_num)):
    sum += int(line_num[j])
print(sum)




是可以的! 感谢!  最终这样写能得到指定目录下的总行数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-13 17:13:31 | 显示全部楼层
二爷zou 发表于 2020-3-13 17:02
import easygui as g
import os

如果有帮助,请设最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-13 17:19:00 | 显示全部楼层
sunrise085 发表于 2020-3-13 16:45
在第二个if中加了一行代码,将递归的返回值也添加到列表中,即将下一层文件夹中的文件总行数返回一并统计到 ...

这个写法好像不太行呦, 空列表和num 值,只要递归调用这个函数一遍就会变成空值和0   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-13 17:53:18 | 显示全部楼层
qiuyouzhi 发表于 2020-3-13 17:13
如果有帮助,请设最佳答案

已经设了  哈哈哈
感谢
再次感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 20:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表