转换为函数时代码无法正常工作

时间:2013-09-21 15:30:48

标签: python function loops

当我尝试将此代码转换为函数时,它无法正常工作。该代码应该采用目录并报告内容摘要,其中包括文件扩展名的文件的计数,最大值,最小值和平均大小。当我在函数外部运行时,它可以工作,但是当我尝试转换为函数时,它只给出了它遇到的第一个文件类型的统计数据。为什么不迭代?我确定它的东西小而明显!

def directory_summary(a_dir):

  import os
  from collections import defaultdict

  os.chdir(a_dir)
  mydir = os.listdir(os.curdir)

  filedict = {}
  ext_str = 'file type:'
  cnt_str = 'count:'
  max_str = 'max. size:'
  min_str = 'min. size:'
  avg_str = 'avg. size:'

  def calc_avg(num_list):
    return round(sum (num_list) / len(num_list))

  for file in mydir:
    fileext = os.path.splitext(file)[1]
    filesz = os.path.getsize(file)
    filedict.setdefault(fileext,[]).append(filesz)
  print ('Summary of directory contents:')
  for ext, sz in filedict.items():
    return print(ext_str+ext,cnt_str,len(sz),max_str,max(sz),min_str,min(sz), avg_str,calc_avg(sz))


myd = r'C:\GIS'

directory_summary(myd)

2 个答案:

答案 0 :(得分:0)

return在以下setenece中使循环过早停止。

  for ext, sz in filedict.items():
    return print(ext_str+ext,cnt_str,len(sz),max_str,max(sz),min_str,min(sz), avg_str,calc_avg(sz))

删除return

  for ext, sz in filedict.items():
    print(ext_str+ext,cnt_str,len(sz),max_str,max(sz),min_str,min(sz), avg_str,calc_avg(sz))

答案 1 :(得分:0)

for ext, sz in filedict.items():循环第一次运行时,会立即从中返回。

试试这个版本:

import os

def calc_avg(num_list):
    return round(sum (num_list) / len(num_list))

def directory_summary(a_dir):

  os.chdir(a_dir)
  mydir = os.listdir(os.curdir)

  filedict = {}
  ext_str = 'file type:'
  cnt_str = 'count:'
  max_str = 'max. size:'
  min_str = 'min. size:'
  avg_str = 'avg. size:'

  for file in mydir:
    fileext = os.path.splitext(file)[1]
    filesz = os.path.getsize(file)
    filedict.setdefault(fileext,[]).append(filesz)


  return_values = []
  for ext, sz in filedict.items():
    values = (ext_str+ext,
              cnt_str,
              str(len(sz)),
              max_str,
              str(max(sz)),
              min_str,
              str(min(sz)),
              avg_str,
              str(calc_avg(sz)))
  return return_values

myd = r'C:\GIS'

print ('Summary of {0} contents:'.format(myd))
results = directory_summary(myd)
for i in results:
    print(i)