鱼C论坛

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

setdefault函数的作用

[复制链接]
发表于 2018-1-27 16:33:56 | 显示全部楼层 |阅读模式

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

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

x
问题来自今天上小甲鱼老师30课程的第一题动动手:
20180127160459.png
我自己写的代码:
  1. from os import*
  2. all_files=listdir('G:\\030文件系统')
  3. temp_dict=dict()
  4. for i in all_files:
  5.     if path.splitext(i)[1] not in temp_dict:
  6.         if path.splitext(i)[1]=='':
  7.             temp_dict['文件夹']=1
  8.         else:
  9.             temp_dict[path.splitext(i)[1]]=1
  10.     else:
  11.         if path.splitext(i)[1]=='':
  12.             temp_dict['文件夹']+=1
  13.         else:
  14.             temp_dict[path.splitext(i)[1]]+=1
  15. for i in temp_dict.keys():
  16.     print('该文件下共有类型为【{}】的文件{}个'.format(i,temp_dict[i]))
复制代码
执行结果:
20180127160459.png
文件夹里具体文件如下:
20180127161842.png
功能看似实现,但是问题存在,就是文件数量一直是1,而实际文件夹中的文件夹有3个,经过自己分析,问题出在:
  1. if path.splitext(i)[1]=='':
  2.     temp_dict['文件夹']=1
复制代码
这个判断上因为每当遍历循环到文件夹它所分割出的扩展名是'',所以一直在循环temp_dict['文件夹']=1,这是导致文件一直是1的原因。
然后我就思考如何解决此问题,我第一个想到的就是在创建字典的时候就直接加上文件夹:

  1. temp_dict={‘文件夹’:0}
复制代码
更改后的代码如下:
  1. from os import*
  2. all_files=listdir('G:\\030文件系统')
  3. temp_dict={'文件夹':0}
  4. for i in all_files:
  5.     if path.splitext(i)[1] not in temp_dict:
  6.         if path.splitext(i)[1]=='':
  7.             temp_dict['文件夹']+=1
  8.         else:
  9.             temp_dict[path.splitext(i)[1]]=1
  10.     else:
  11.         temp_dict[path.splitext(i)[1]]+=1
  12. for i in temp_dict.keys():
  13.     print('该文件下共有类型为【{}】的文件{}个'.format(i,temp_dict[i]))
复制代码
执行结果:
20180127162125.png
成功了!文件夹数量正确!


                               
登录/注册后可看大图


实现后我特别想知道小甲鱼老师所以去看了一下老师的代码,发现原理和我差不多但是我还是觉得自己的比较好理解可能是自己写的原因,但老师用到了
setdefault
随后我对我的代码进行了修改:
  1. from os import*
  2. all_files=listdir('G:\\030文件系统')
  3. temp_dict=dict()
  4. for i in all_files:
  5.     if path.splitext(i)[1] not in temp_dict:
  6.         if path.splitext(i)[1]=='':
  7.             temp_dict.setdefault('文件夹',0)
  8.             temp_dict['文件夹']+=1
  9.         else:
  10.             temp_dict[path.splitext(i)[1]]=1
  11.     else:
  12.         temp_dict[path.splitext(i)[1]]+=1
  13. for i in temp_dict.keys():
  14.     print('该文件下共有类型为【{}】的文件{}个'.format(i,temp_dict[i]))
复制代码

功能也实现了,但是我不知道
[b]setdefault这个代码的实际作用是什么?是建立一个项吗?如果只是建立一个项的话为何我将[/b][b][b]temp_dict.setdefault('文件夹',0)代码改成:
  1. temp_dict['文件夹']=0
复制代码

文件夹数量又只是1个了!
然后我去查了资料:
[/b][/b]
[b][b][b]
setdefault(,):
[/b][/b][/b]
[b]和get相似,但是他会自动添加未找到的键但还不是很懂,有没有大神解释一下[b][b][b]setdefault,万分感谢![/b][/b][/b]
[/b]








小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-1-27 16:36:27 | 显示全部楼层
@小甲鱼老师求解释
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-27 18:03:13 | 显示全部楼层
本帖最后由 球磨川禊 于 2018-1-27 18:05 编辑

get的键没有时候会报错
setdefault 的键没有时 会创建一个
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-27 18:13:43 | 显示全部楼层
temp_dict.setdefault('文件夹',0)
设置字典的key键值和value的缺省值,即文件夹:0
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-27 18:22:02 | 显示全部楼层
塔利班 发表于 2018-1-27 18:13
temp_dict.setdefault('文件夹',0)
设置字典的key键值和value的缺省值,即文件夹:0

那为什么可以添加而不会一直是1呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-27 18:37:59 | 显示全部楼层
像番茄加两个蛋 发表于 2018-1-27 18:22
那为什么可以添加而不会一直是1呢?

temp_dict['文件夹']+=1啊。。这句
每次有文件夹,使key=‘文件夹’的value+=1
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-27 13:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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