鱼C论坛

 找回密码
 立即注册
查看: 2653|回复: 5

[已解决]30课课后练习第1题

[复制链接]
发表于 2016-3-7 15:36:55 | 显示全部楼层 |阅读模式

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

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

x
请帮忙看下下面这段代码问题在哪里,会报错。谢谢。

import os
def file_size():
    files = dict()
    all_files = os.listdir(os.curdir)
    for each_file in all_files:
        if os.path.isfile(each_file):
            files[each_file] = os.path.getsize(each_file)
        else:
            file_size()
            os.chdir(os.pardir)
    for each in files:
        print('%s 【%d】' %(each,files(each)))

file_size()
最佳答案
2016-3-7 16:45:30
一二二四四 发表于 2016-3-7 16:18
当对象是文件夹的时候,用的递归

好吧, 仔细分析了你的代码, 存在这么几个问题:
1. 定义dict的时候需要在函数外部, 不然递归调用的时候会清空dict里面的内容
2. 取字典里面的值是用中括号, 像这样
  1. files[each]
复制代码
而不是用小括号
3. else里面的递归调用存在逻辑错误, 这个错误和函数整体的参数设计有关, 递归函数一般都需要参数的, 这里定义一个目录名作为形参, 并且赋初值为当前目录, 把进入目录的操作移到函数开头, 我贴上我的代码:
  1. import os

  2. files = dict()


  3. def file_size(dirName='.'):
  4.     global files
  5.     os.chdir(dirName)
  6.     all_files = os.listdir(os.curdir)
  7.     for each_file in all_files:
  8.         if os.path.isfile(each_file):
  9.             files[each_file] = os.path.getsize(each_file)
  10.         else:
  11.             file_size(each_file)
  12.     os.chdir('..')
  13.     for each in files:
  14.         print('%s 【%d】' % (each, files[each]))


  15. file_size()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-3-7 16:05:28 | 显示全部楼层
没懂为什么else里用递归
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-7 16:18:12 | 显示全部楼层
hldh214 发表于 2016-3-7 16:05
没懂为什么else里用递归

当对象是文件夹的时候,用的递归
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-7 16:45:30 | 显示全部楼层    本楼为最佳答案   
一二二四四 发表于 2016-3-7 16:18
当对象是文件夹的时候,用的递归

好吧, 仔细分析了你的代码, 存在这么几个问题:
1. 定义dict的时候需要在函数外部, 不然递归调用的时候会清空dict里面的内容
2. 取字典里面的值是用中括号, 像这样
  1. files[each]
复制代码
而不是用小括号
3. else里面的递归调用存在逻辑错误, 这个错误和函数整体的参数设计有关, 递归函数一般都需要参数的, 这里定义一个目录名作为形参, 并且赋初值为当前目录, 把进入目录的操作移到函数开头, 我贴上我的代码:
  1. import os

  2. files = dict()


  3. def file_size(dirName='.'):
  4.     global files
  5.     os.chdir(dirName)
  6.     all_files = os.listdir(os.curdir)
  7.     for each_file in all_files:
  8.         if os.path.isfile(each_file):
  9.             files[each_file] = os.path.getsize(each_file)
  10.         else:
  11.             file_size(each_file)
  12.     os.chdir('..')
  13.     for each in files:
  14.         print('%s 【%d】' % (each, files[each]))


  15. file_size()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-7 17:44:18 | 显示全部楼层
hldh214 发表于 2016-3-7 16:45
好吧, 仔细分析了你的代码, 存在这么几个问题:
1. 定义dict的时候需要在函数外部, 不然递归调用的时候会 ...

感谢感谢,可是为什么会把所有的文件都统计两遍呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-7 20:40:13 | 显示全部楼层
一二二四四 发表于 2016-3-7 17:44
感谢感谢,可是为什么会把所有的文件都统计两遍呢?

我这边没出现这个问题, 倒是遇到不同文件夹中有重名的文件只会统计一次
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-20 01:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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