作者回复: 您好,所有人学编程都是要从0基础慢慢学习积累的,所以想到一些问题就多利用搜索引擎和文档查看,多调试和编写程序,会很快提升你的编程能力的。有觉得技术点把握不好的地方也欢迎你多留言:p
下面我把程序做一下简化和修改,它的目的是为了每输入一次年份,计算一次生肖,并且记录年份对应生肖的查询次数。
chinese_zodiac = u'猴鸡狗猪鼠牛虎兔龙蛇马羊'
cz_num = {}
for i in chinese_zodiac:
cz_num[i] = 0
while True:
year = int(input('year:'))
cz_num[chinese_zodiac[year % 12]] += 1
for eachKey in cz_num.keys():
print('%s %d' %(eachKey, cz_num[eachKey]))
为了达到这个目的,我要先让字典里面的key是生肖,计数器是0
for i in chinese_zodiac:
cz_num[i] = 0
这两个语句就是起到这个功能的。执行完之后,字典就变成下面这样
{猴:0,鸡:0,狗:0,猪:0,鼠:0,牛:0,虎:0,兔:0,龙:0,蛇:0,马:0,羊:0}
当我输入2018 赋值给变量year之后,程序会计算它对应的年份--狗,执行
cz_num['狗'] += 1
字典就变成了
{猴:0,鸡:0,狗:1,猪:0,鼠:0,牛:0,虎:0,兔:0,龙:0,蛇:0,马:0,羊:0}
如果再次输入2018、会再执行cz_num['狗'] += 1 对生肖进行累加,相应的生肖狗会变为值2,其他的生肖因为没有输入,所以依然为0。
如果不为字典赋初始值0,无法进行上面的 += 1 的运算,它是数学运算,不能和空值进行相加;也没办法对生肖为0的结果进行输出了,不知道我这样解释你能否理解这行代码起到的作用。
建议在需要观察的变量下面增加print()函数,以便你能更直观的看到执行结果。
作者回复: 现阶段使用字典有两大好处需要掌握,第一个是相对于字符串、数字、列表等基础数据结构,它有一个唯一的名字,即“键”,方便你使用名字操作具体的内容“值”,
第二个就是使用字典类型存储大量的内容,查找速度要比其他基本类型要快
字典的嵌套可以理解为,以前将字符串、数字作为“值”赋值给字典的“键”,现在将一个字典作为“值”赋值给字典的“键”
看下下面的例子
# 首先我们可以定义一个非嵌套的字典
dict1 = {'tom': 'a', 'jerry': 'b'}
# 为非嵌套的字典增加一个新的键/值对,赋值的类型是字符串
dict1['mary1'] = 'c'
# 输出新的字典的内容
print('没有嵌套的字典 %s' % dict1)
# 如果mary2本身就是一个字典可以直接像字符串一样增加到dict1中
dict1['mary2'] = {'name': 'mary mary', 'age': 18}
# 输出新的字典的内容
print('有嵌套的字典 %s' % dict1)
# 输出外层字典的内容
print(dict1['mary2'])
# 输出内层字典的内容
print(dict1['mary2']['age'])
这种字典里面的值也是字典类型就是字典嵌套了
作者回复: 这个例子很好,如果能把year0 year1变量替换为更有意义的变量名称, elif改写为else形式,是一个非常好的演示用例。
作者回复: “等价”不准确,在输入时由于python上层函数做了处理,所以一个汉字和一个英文字符都被计数为1个,当然底层不是这样,如果是utf-8编码,一个汉字是三个字节
作者回复: 程序写法的好坏要根据需求而定,像demo这么短小的代码两种写法没有比较的意义,如果一定要对这段代码比较的话,为什么不写成:
if 条件成立:
wiile 开始执行循环
更易读呢?
作者回复: 使用ctrl+v 粘贴之后,pycharm会自动为你调整缩进格式。如果缩进不符合你的要求,可以选中多行,用tab键一次性多行缩进。
作者回复: 这里的int不是其他语言中的定义变量,int()方法是将浮点数强制转换为整数
作者回复: 1 首先看下报错信息,在哪一行出现的问题
2 根据报错信息向程序的上游排查
3 将和出错不相关的逻辑注释掉,观察程序运行情况
4 对怀疑出错的位置可以print()输出,来观察程序运行和自己预想的结果是否一致
5 输入不同的内容,观察是否有异常出现
总之根据报错推断哪里出了问题,跟着程序流程往上游回推,遇见奇怪的结果就打印一下中间变量
作者回复: 这里的圆括号() 使用了中文的全角格式“(“ ”)”,导致了报错
作者回复: 首先定义字典是使用冒号隔开key和value两个部分的
输出的话,一般是通过key 取得value
即 字典名称['key'] 的方式调用来得到value
作者回复: 百分号% 放在前面 %d %s
作者回复: 使用int()强制转换
作者回复: sx_num[chinese_zodiac[year % 12]] +=1
这条语句 “year % 12” 其中的 year变量取值为‘兔’ ,类型是字符串,对字符串做 %12 运算自然会报错了
作者回复: 第一个问题,字典的key是哈希值,哈希值有一个特性就是不重复、不可变,所以dirct取得的字典key是去重的。
第二个问题, {i for i in str} 得到的类型是set(集合),通过print(type(list))可以得到确切的类型,如果需要得到list(列表)类型需要使用 list = [i for i in str]的方式,这里注意花括号{}和方括号[]的区别。
作者回复: 你好, 问题在 for ... in ... 语句的统计结果在 while循环之外,而while 循环的写法 是 while True -- 既死循环,所以不会运行到 for ... in ... 语句,也就不会显示统计结果了,可以把统计的语句放在 while 循环里,或者再while循环增加判断,例如输入“q”退出循环等方式。