Crossin的编程教室

标题: 【Python 第41课】 用文件保存游戏(3) [打印本页]

作者: mty1111    时间: 2013-7-25 17:12
标题: 【Python 第41课】 用文件保存游戏(3)
你的小游戏现在已经可以保存成绩了,但只有一组成绩,不管谁来玩,都会算在里面。所以今天我还要加上一个更多的功能:存储多组成绩。玩家需要做的就是,在游戏开始前,输入自己的名字。而我会根据这个名字记录他的成绩。这个功能所用到的内容我们几乎都说过,现在要把它们结合起来。


首先要输入名字,这是我们用来区分玩家成绩的依据:
  1. name = raw_input('请输入你的名字:')
复制代码
接下来,我们读取文件。与之前不同,我们用readlines把每组成绩分开来:
  1. lines = f.readlines()
复制代码
再用一个字典来记录所有的成绩:
  1. scores = {}

  2. for l in lines:

  3.    s = l.split()

  4.    scores[s[0]] = s[1:]
复制代码
这个字典中,每一项的key是玩家的名字,value是一个由剩下的数据组成的数组。这里每一个value就相当于我们之前的成绩数据。


我们要找到当前玩家的数据:
  1. score = scores.get(name)
复制代码
字典类的get方法是按照给定key寻找对应项,如果不存在这样的key,就返回空值None。


所以如果没有找到该玩家的数据,说明他是一个新玩家,我们给他初始化一组成绩:
  1. if score is None:

  2.    score = [0, 0, 0]
复制代码
这是我们拿到的score,已经和上一课中的score一样了,因此剩下的很多代码都不用改动。


当游戏结束,记录成绩的时候,和之前的方法不一样。我们不能直接把这次成绩存到文件里,那样就会覆盖掉别人的成绩。必须先把成绩更新到scores字典中,再统一写回文件中。


把成绩更新到scores中,如果没有这一项,会自动生成新条目:
  1. scores[name] = [str(game_times), str(min_times), str(total_times)]
复制代码
对于每一项成绩,我们要将其格式化:
  1. result = ''

  2. for n in scores:

  3.    line = n + ' ' + ' '.join(scores[n]) + '\n'

  4.    result += line
复制代码
把scores中的每一项按照“名字 游戏次数 最低轮数 总轮数\n”的格式拼成字符串,再全部放到result里,就得到了我们要保存的结果。


最后就和之前一样,把result保存到文件中。

0.jpg
1.jpg

如果你充分理解了这个程序,恭喜你,你对文件处理已经有了一个基本的了解。在日常工作学习中,如果需要处理一些大量重复机械的文件操作,比如整理格式、更改文件中的部分文字、统计数据等等,都可以试着用python来解决。


#==== Crossin的编程教室 ====#

微信ID:crossincode

QQ群:312723402


面向零基础初学者的编程课

每天5分钟,轻松学编程
作者: 小坏    时间: 2013-8-8 15:16
自己调试时出的问题:
1、问题1:join前面那个单引号里少打了一个空格,导致下次运行时split拆不开。
for n in scores:
    line = n + ' ' + ' '.join(scores[n]) + '\n'
2、正常运行后,私自打开记录分数的文件是空白。
3、还有好像文件最初不能是空白的?必须有几个值。
作者: 林夕_信仰    时间: 2013-9-1 15:51
结果保存在txt的时候,是按什么顺序来的呢?我发现有时候新建的玩家数据在最上面,有时候又在中间行@crossin先生
作者: crossin先生    时间: 2013-9-1 22:50
林夕_信仰 发表于 2013-9-1 15:51
结果保存在txt的时候,是按什么顺序来的呢?我发现有时候新建的玩家数据在最上面,有时候又在中间行@crossi ...

字典是无序,所以你不能依赖它来排序
作者: 林夕_信仰    时间: 2013-9-3 17:25
crossin先生 发表于 2013-9-1 22:50
字典是无序,所以你不能依赖它来排序

soga!
作者: crossin先生    时间: 2013-9-17 01:07
今天发现一个Mac下IDLE的问题,折腾了很久才大约搞清楚了。
mac下的IDLE里raw_input读进来的字符串是unicode字符串,和我们平常的用的str是不一样的
如果print出包含它们的list就会发现,是u'abc'和'abc'的区别

unicode和str相加会出问题,也不能作为参数被writelines调用。而文件读出来的内容是str,还会导致输入相同的字符却无法匹配

所以如果mac下遇见奇怪的编码问题,类似
UnicodeDecodeError: 'ascii' codec can't decode byte 0xba in position 0: ordinal not in range(128)

试试把一开始的输入改为
name = raw_input('请输入你的名字:').encode('utf-8')

在windows下没这个问题,因为输入被默认编码了。Terminal好像也没问题
作者: Envy    时间: 2015-3-24 23:41
报错了。。。
Traceback (most recent call last):
  File "C:\Users\Desktop\4.py", line 14, in <module>
    if score in None:
TypeError: argument of type 'NoneType' is not iterable
貌似是格式有问题。。不知道有没有知道的,都是按照上面的代码敲得
作者: crossin先生    时间: 2015-3-25 10:35
Envy 发表于 2015-3-24 23:41
报错了。。。
Traceback (most recent call last):
  File "C:\Users\Desktop\4.py", line 14, in

不是 in,是 is 吧?
作者: Envy    时间: 2015-3-25 14:41
crossin先生 发表于 2015-3-25 10:35
不是 in,是 is 吧?

感谢。。。。一到长代码就老是遇到拼写问题。。。。自己对着看了几遍也看不出来。。。。
作者: Envy    时间: 2015-3-25 16:30
crossin先生 发表于 2015-3-25 10:35
不是 in,是 is 吧?

你好,那个scores和score这块不太明白是什么意思,就是readlines得到的应该是一个list吧,如果最开始game.txt里面是0 0 0的话,得到的就是{0,0,0},那么用split将他分开是得到了三个list吗?,并且他还在for循环里面,应该是对lines里的三个0依次进行处理吗?这块弄得不是很明白。。。。尤其是哪句scores[s[0]] = s[1:],和score = scores.get(name)
作者: crossin先生    时间: 2015-3-25 20:39
Envy 发表于 2015-3-25 16:30
你好,那个scores和score这块不太明白是什么意思,就是readlines得到的应该是一个list吧,如果最开始game ...

得到了一个3项的list
s[0]是第一项也就是name,s[1:]就是后面剩下的组成的list
scores[s[0]] = s[1:] 是以 name 为key 存储这组数据
scores.get(name)则是按名字查找数据
作者: zhangxw    时间: 2015-10-5 14:20
本帖最后由 zhangxw 于 2015-10-5 15:28 编辑
  1. from random import randint

  2. name = raw_input('Please input your name:')

  3. f = open('G:\PL\game.txt')
  4. lines=f.readlines()
  5. f.close()

  6. scores= {}
  7. for I in lines:
  8.     s = I.split()
  9.     scores[s[0]] = s[1:]
  10. score = scores.get(name)
  11. if score is None:
  12.     score = [0,0,0]

  13. game_times = int(score[0])
  14. min_times = int(score[1])
  15. total_times = int(score[2])

  16. if game_times>0:
  17.     avg_times = float(total_times)/game_times
  18. else:
  19.     avg_times = 0
  20. print '%s,you have played %d times,at least take %d times guess the answer,the \
  21. average time to guess the answer is %.2f'%(name,game_times,min_times,avg_times)
  22. #game process

  23. num = randint(1,100)
  24. times = 0
  25. print 'Guesss what I think?'
  26. bingo = False
  27. while bingo == False:
  28.     times += 1
  29.     answer = input()
  30.     if answer < num:
  31.         print 'Too small'
  32.     if answer > num:
  33.         print 'Too big'
  34.     if answer == num:
  35.         print 'bingo'
  36.         False = True

  37. if game_times == 0 or times < min_times:
  38.     min_times = times
  39. total_times += times
  40. game_times += 1

  41. scores[name] = [str[(game_times),str(min_times),str(total_times)]
  42. result = ''   #这一行报错 SyntaxError: invalid syntax 仔细看了  没错啊
  43. for n in scores:
  44.     line = n+''+''.join(scores[n])+'\n'
  45.     result += line
  46. f = open('G:\PL\game.txt','w')
  47. f.write(result)
  48. f.close()
复制代码
百思不得啊  明明没有错误  还是我有什么不知道的
python2.7
作者: crossin先生    时间: 2015-10-6 11:11
zhangxw 发表于 2015-10-5 14:20
百思不得啊  明明没有错误  还是我有什么不知道的
python2.7

scores[name] = [str[(game_times),str(min_times),str(total_times)]
这里括号对不上吧
作者: zhangxw    时间: 2015-10-7 15:58
crossin先生 发表于 2015-10-6 11:11
scores[name] = [str[(game_times),str(min_times),str(total_times)]
这里括号对不上吧

居然是犯了这个错误  他一直报错下一行  我就没有检查上一行

看样子以后报错的那一行以及上面一行都要看看

多谢先生
作者: crossin先生    时间: 2015-10-8 11:05
zhangxw 发表于 2015-10-7 15:58
居然是犯了这个错误  他一直报错下一行  我就没有检查上一行

看样子以后报错的那一行以及上面一行都要看 ...

因为它在等你的右括号,但没等到你就换行了,所以它认为这个新的一行不符合语法
作者: cyueclone    时间: 2015-11-5 10:35
请教下,game1.txt中原来有两条记录,但是只要加上最后一段的写文件(f.write),game1.txt就被清空了,一片空白,原来的记录没有了。哪里出问题了?(python3.3;PyScripter V2.6 x86). 谢谢~
from random import randint
name = input('Input Your Name:')
f = open('C:\Documents and Settings\Administrator\My Documents\game1.txt')
lines = f.readlines()
#print (lines)
f.close()
scores = {}
for l in lines:
#    print(l)
    s = l.split()
#    print (s)
    scores[s[0]] = s[1:]
#    print (scores)

score = scores.get(name)
#print(score)
if score is None:
    score = [0,0,0]

game_times = int(score[0]) + 1
min_times = int(score[1]) + 2
total_times = int(score[2]) + 3
if game_times > 0:
    avg_times = float(total_times) / game_times
else:
    avg_times = 0

print ('%s,你已经玩了%d次,最少%d轮猜出答案,平均%.2f轮猜出答案' % (
    name, game_times, min_times, avg_times))

num = randint(1,100)
times = 0 #记录本次游戏轮数
print ('Guess what i think')

scores[name] = [str(game_times), str(min_times), str(total_times)]
#print(scores[name])
#print(scores)
result = ''
for n in scores:
    line = n + ' ' + ' '.join(scores[n]) + '\n'
#    print(n)
#    print(scores[n])
#    print (' '.join(scores[n]))
    result += line
#    print (line)
#    print(result)
print (result)

f = open('C:\Documents and Settings\Administrator\My Documents\game1.txt','w')
f.write (result)
#print(result)
f.close


作者: crossin先生    时间: 2015-11-5 16:27
cyueclone 发表于 2015-11-5 10:35
请教下,game1.txt中原来有两条记录,但是只要加上最后一段的写文件(f.write),game1.txt就被清空了,一片 ...

你去看下 open的打开模式
'w'模式就是重新写文件
作者: cyueclone    时间: 2015-11-6 10:01
crossin先生 发表于 2015-11-5 16:27
你去看下 open的打开模式
'w'模式就是重新写文件

'w'的确是重写,改成‘a’就不清空了,但是问题不在这里。而是不管w还是a,数据都没有写进到文件里面。
比如,print (result),在屏幕上显示的是:
czy 4 5 6
cy 1 2 3
xxm 1 2 3
想要写到文件里:f = open('C:\Documents and Settings\Administrator\My Documents\game1.txt','a')
                        f.write (result)
再次打开文件,显示的还是:
czy 4 5 6
cy 1 2 3
完全没有变化!为什么数据没有被写进文件呢?
作者: crossin先生    时间: 2015-11-6 21:18
cyueclone 发表于 2015-11-6 10:01
'w'的确是重写,改成‘a’就不清空了,但是问题不在这里。而是不管w还是a,数据都没有写进到文件里面。
...

你没有close,你那个close没有加括号,就不是调用方法
作者: cyueclone    时间: 2015-11-9 09:38
crossin先生 发表于 2015-11-6 21:18
你没有close,你那个close没有加括号,就不是调用方法

的确是这样,修改后就正常了。原来怎么也想不明白,还以为是版本问题。原来写文件时一定要关闭,拿掉f.close()也不行。非常感谢~。
作者: fishpanchax    时间: 2016-4-12 17:33
本帖最后由 fishpanchax 于 2016-4-12 17:37 编辑

请问为什么我点Run Module没有任何反应呢,连保存都没法保存

from random import randint

name = raw_input('请输入你的名字:')


f = file('game.txt')
lines = f.readlines()
f.close()

scores = {}
for l in lines:
   s = l.split()
   scores[s[0]] = s[1:]
score = scores.get(name)
if score is None:
   score = [0, 0, 0]

game_times = int(score[0])
min_times = int(score[1])
total_times = int(score[2])
if game_times > 0:
    avg_times = float(total_times)/game_times
else:
    avg_times = 0

print '%s,你已经玩了%d次,最少%d轮猜出答案,平均%.2f轮猜出答案'%(name,game_times,min_times,avg_times)

num = randint(1,100)
times = 0
print('Guess what I think')
a = 0
while a== 0:
    answer = input('Your answer is:')
    times += 1
    if answer < num:
        print'too small'
    if answer > num:
        print'too large'
    if answer == num:
        print'BINGO!!!'
        a = 1

if game_times == 0 or times < min_times:
    min_times = times
total_times +=times
game_times += 1


scores[name] = [str(game_times), str(min_times), str(total_times)]
result = ''
for n in scores:
   line = n + ' ' + ' '.join(scores[n]) + '\n'
   result += line


f = file('game.txt','w')
f.write(result)
f.close()

作者: fishpanchax    时间: 2016-4-12 21:13
fishpanchax 发表于 2016-4-12 17:33
请问为什么我点Run Module没有任何反应呢,连保存都没法保存

from random import randint

自己解决了,百度了一下,在前面加一行#coding=gbk
作者: crossin先生    时间: 2016-4-12 22:50
fishpanchax 发表于 2016-4-12 21:13
自己解决了,百度了一下,在前面加一行#coding=gbk

嗯,有中文的代码要设置编码
作者: mengnanlong    时间: 2016-5-11 18:39
jill188
jill199
jill199
leon155
leon188
jill166
3521
crossin老师,由于没法发图片,我就把txt记录的文档复制给你哈,为什么我的相同名字的数据是一条一条的?还有我运行程序的时候一直是0,0,0.我用的python3,请问是为什么啊?
作者: mengnanlong    时间: 2016-5-12 00:18
crossin老师,现在有图片了,就是我的程序输入的名字,在文档里无论重复还是不重复的都是新的数据,无法叠加,请问一下,问题出在哪里了?怎么解决啊?谢谢~~

2.png (18.99 KB, 下载次数: 278)

2.png

1.png (136.62 KB, 下载次数: 263)

1.png

3.png (8.33 KB, 下载次数: 264)

结果

结果


作者: crossin先生    时间: 2016-5-12 11:22
mengnanlong 发表于 2016-5-12 00:18
crossin老师,现在有图片了,就是我的程序输入的名字,在文档里无论重复还是不重复的都是新的数据,无法叠 ...
  1. line = n + ' ' + ' '.join(scores[n]) + '\n'
复制代码
这里两个引号中间是空格,是用空格把数据连起来的。这样用split的时候才能分开成list。
你现在连在一起,split是分不开的,你在程序中间增加print,把name都打出来看一下就知道了

作者: mengnanlong    时间: 2016-5-12 12:06
crossin先生 发表于 2016-5-12 11:22
这里两个引号中间是空格,是用空格把数据连起来的。这样用split的时候才能分开成list。
你现在连在一起, ...

十分感谢~~~crossin老师~我还要加强对语法的使用。谢谢老师
作者: 王小勇    时间: 2016-8-5 15:19
aa 5 3 0
kk 5 2 0
打卡
作者: glaucos    时间: 2016-8-5 20:16
39.40.41断断续续看了一个星期,终于看完了,虽然不是很熟,但代码总算是都能看懂了,按照课程抄下来运行出一些小问题也都能找到问题出在哪里并且自己解决。
  1. from random import randint

  2. name=raw_input('请输入姓名:')
  3. f=file('text1.txt')
  4. lines=f.readlines()
  5. f.close()
  6. scores={}
  7. for l in lines:
  8.     s=l.split()
  9.     scores[s[0]]=s[1:] #s[0]是姓名,在score中是KEY,为键赋值.
  10. score=scores.get(name) #socre等于在字典scores查找的键
  11. if score is None:
  12.     score=[0, 0, 0] #给不存在的用户赋值创建一个新的字典项
  13.    
  14. game_times=int(score[0])
  15. min_times=int(score[1])
  16. total_times=int(score[2])
  17. if game_times>0:
  18.     avg_times=float(total_times)/game_times
  19. else:
  20.     avg_times=0
  21. print'%s,你已经玩了%d次,最少%d轮猜出答案,平均%.2f轮猜出答案'%(name,game_times,min_times,\
  22.         avg_times)

  23. num=randint(1,100)
  24. times=0
  25. print'Guess what i think?'
  26. bingo=False
  27. while bingo==False:
  28.     times+=1
  29.     answer = input()
  30.     if num<answer:
  31.         print'too big'
  32.     if num>answer:
  33.         print'too small'
  34.     if num==answer:
  35.         print'bingo'
  36.         bingo=True
  37. if game_times==0 or times<min_times:
  38.     min_times=times
  39. total_times+=times
  40. game_times+=1
  41. scores[name]=[str(game_times),str(min_times),str(total_times)]
  42. result=''
  43. for n in scores: #遍历键
  44.     line=n+' '+' '.join(scores[n])+'\n' #姓名+空格+合并字典值为一个字符串要加空格+换行
  45.     result+=line #把成绩作为一个字符串赋值给result
  46. f=file('text1.txt','w')
  47. f.write(result)
  48. f.close()
复制代码

作者: l0ve1o24    时间: 2016-12-15 15:38
  1. #-*-coding:utf-8-*-
  2. a = 1
  3. while a == 1:
  4.     from random import randint
  5.     name = raw_input('请输入你的名字')#输入名字
  6.    
  7.     f = open('jifen.txt')
  8.     lines = f.readlines()#读取文件内容并制成list
  9.     f.close()
  10.     scores = {}#建立一个字典
  11.     for i in lines:#遍历lines
  12.         s = i.split()#通过空格隔开制成list
  13.         scores[s[0]] = s[1:]#从list提出元素并在字典里赋值,名字是KEY,数据是VALUE


  14.     score = scores.get(name)#在字典中查找输入的名字
  15.     if score is None:
  16.         score = [0, 0, 0]
  17.    
  18.     game_times = int(score[0])#总游戏数
  19.     min_times = int(score[1])#最少轮数
  20.     total_times = int(score[2])#总轮数
  21.     if game_times > 0:
  22.         avg_times = float(total_times)/game_times
  23.     else:
  24.         avg_times = 0
  25.     print ' 你已经玩%d了次,最少%d轮猜出答案,平均%.2f轮猜出答案 '%(game_times,min_times,avg_times)

  26.     num = randint(1 , 100)
  27.     times = 0
  28.     print ' 请猜一个100以内的数字'
  29.     bingo = False
  30.     while bingo == False:
  31.         times += 1
  32.         answer = input()
  33.         if answer < num:
  34.             print 'too small'
  35.         if answer > num:
  36.             print 'too big'
  37.         if answer == num:
  38.             print 'bingo'
  39.             bingo = True
  40.    
  41.     if game_times == 0 or times < min_times:
  42.         min_times = times
  43.     total_times += times
  44.    
  45.     game_times += 1


  46.     scores[name] = [str(game_times),str(min_times),str(total_times)]#由于是新玩家 没有数据 给新玩家赋值
  47.     result = ' '
  48.     for n in scores:#遍历scores的KEY
  49.         line = n + ' ' +' '.join(scores[n]) + '\n'
  50.         #n是scores中的key也就是名字 scores[n] 是value 也就是数据

  51.         result += line#将遍历出来的元素加进result字符组

  52.         f = open ('jifen.txt','w')
  53.         f.write(result)
  54.         f.close
  55.         
复制代码
老师,请帮我看下后面的注解对不对,想了好长时间
作者: crossin先生    时间: 2016-12-15 23:55
l0ve1o24 发表于 2016-12-15 15:38
老师,请帮我看下后面的注解对不对,想了好长时间

最后那段缩进不对。保存文件不应该在循环里
另外 close 没有加括号,这个没有调用成功
作者: 清如泉    时间: 2017-2-23 20:21
不太理解这段代码:
scores = {}

for l in lines:

   s = l.split()

   scores[s[0]] = s[1:]
请问老师,scores是作为一个字典存在,还是一个list,为什么初始了scores={},后面却又使用中括号scores=[] ,求教。
作者: crossin先生    时间: 2017-2-24 16:56
清如泉 发表于 2017-2-23 20:21
不太理解这段代码:
scores = {}

scores 是字典。
字典也有中括号方法,只不过是对 key 的访问,不是索引

并没有 scores = [] 这个代码
作者: 清如泉    时间: 2017-2-25 09:13
crossin先生 发表于 2017-2-24 16:56
scores 是字典。
字典也有中括号方法,只不过是对 key 的访问,不是索引

非常感谢老师~
作者: brahmagupta    时间: 2017-2-26 17:09
小坏 发表于 2013-8-8 15:16
自己调试时出的问题:
1、问题1:join前面那个单引号里少打了一个空格,导致下次运行时split拆不开。
for n ...

join的用法是将join前面的字符串(这里是’空格‘)插入到join后面的list中这里是(scores[n])。
而且此时若将n直接与' '.join(scores[n])相加也不行,两个字符串连在了一起,所以还要用一个'空格'加到两者之间。所以两个 空格 一个都不能少。
你可以试着修改和运行下面的代码看看输出是什么样子:
name = "Sam"
nums = [str(10), str(20), str(30)]

line = name + '  ' + '  '.join(nums) + '\n'
print line
作者: brahmagupta    时间: 2017-2-26 17:11
zhangxw 发表于 2015-10-7 15:58
居然是犯了这个错误  他一直报错下一行  我就没有检查上一行

看样子以后报错的那一行以及上面一行都要看 ...

多写写代码 你就慢慢会明白报错时解释器 到底想说什么。。。虽然他们有时候表达不清。。。
-------下次代码报错时,多看看上下行
作者: 枫叶落时    时间: 2017-8-16 01:20
本帖最后由 枫叶落时 于 2017-8-16 01:46 编辑

先生,我按照你给的图,抄了一遍,但是他显示
1.png 2.png
有时候就显示中文的问题,求解怎么办
作者: woodumpling    时间: 2017-8-16 09:13
枫叶落时 发表于 2017-8-16 01:20
先生,我按照你给的图,抄了一遍,但是他显示

有时候就显示中文的问题,求解怎么办 ...

标注红色的一行,输出信息中使用了4个占位符,但是后面仅给出了3个变量。请检查是否遗漏
作者: 枫叶落时    时间: 2017-8-16 22:12
woodumpling 发表于 2017-8-16 09:13
标注红色的一行,输出信息中使用了4个占位符,但是后面仅给出了3个变量。请检查是否遗漏 ...

我把他补回去了,但是依旧错误在这一行。。。。
作者: crossin先生    时间: 2017-8-17 10:52
枫叶落时 发表于 2017-8-16 22:12
我把他补回去了,但是依旧错误在这一行。。。。

检查下你前面的括号、逗号是不是都用的英文标点
idle的自动检查太弱,建议换pycharm,这种错误直接会给你提示的很清楚
作者: 枫叶落时    时间: 2017-8-18 21:46
好的。我换下看看。
作者: Aquamarine    时间: 2017-10-30 00:04
本帖最后由 Aquamarine 于 2017-10-30 00:09 编辑

PS:希望站长能够把整段代码放出来,方便学者可以自行步进调试。

请教3个问题:
①是不是只要score = scores.get(name)确定了名字,后面的数值就会加在这个人后面,保持对应不会错位?
②for n in scores:的循环(最后的循环)中,为什么n是名字?
③Python3的input函数是不是无法代码写入输入值的默认值,输入框只能为空?
作者: woodumpling    时间: 2017-10-30 09:13
Aquamarine 发表于 2017-10-30 00:04
PS:希望站长能够把整段代码放出来,方便学者可以自行步进调试。

请教3个问题:

额。。第一个和第三个问题表述得可以更清楚一些吗?
关于第二个问题,
for n in scores:的结果和for n in scores.keys()的结果相同,尝试从这个角度理解一下
作者: Aquamarine    时间: 2017-10-30 20:36
woodumpling 发表于 2017-10-30 09:13
额。。第一个和第三个问题表述得可以更清楚一些吗?
关于第二个问题,
for n in scores:的结果和for n in ...

感谢指教。
第一个问题:
进行的游戏改变了数值,是如何对应到人名上去的?
第三个问题:
第42课讲到了函数的默认参数,input是否支持,如果支持该怎么写?
作者: crossin先生    时间: 2017-10-31 10:51
1 你用的是字典,名字相当于key,数值是这个key对应的value
3 input不是你自己定义的函数,系统给你定义好了,默认参数就是空。
作者: Aquamarine    时间: 2017-10-31 20:22
crossin先生 发表于 2017-10-31 10:51
1 你用的是字典,名字相当于key,数值是这个key对应的value
3 input不是你自己定义的函数,系统给你定义好 ...

谢谢指教
作者: 我有一颗明珠    时间: 2017-11-2 11:58
你好,为什么我的代码运行到
scores={}
for l in lines:
   s=l.split()
   scores[s[0]]=s[1:]
这段代码时总提示:
IndexError: list index out of range
作者: crossin先生    时间: 2017-11-2 13:04
我有一颗明珠 发表于 2017-11-2 11:58
你好,为什么我的代码运行到
scores={}
for l in lines:

把中间的变量 s 输出出来看看你的
s[0] s[1:] scores 是什么就知道了
作者: lubvi    时间: 2017-11-3 17:15
  1. from random import randint
  2. name = input('请输入你的名字:')
  3. f = open('game.txt')
  4. lines = f.readlines()
  5. f.close()

  6. scores = {}  # 初始化字典
  7. for l in lines :
  8.     s = l.split() # 把每一行的数据拆分成list
  9.     scores[s[0]] = s[1:] # 第一项作为key,剩下的作为value
  10. score = scores.get(name) # 查找当前玩家数据
  11. if score is None:
  12.     score = [0,0,0] # 如果查不到score,就初始化score


  13. # 游戏主代码
  14. game_times = int(score[0])
  15. min_times = int(score[1])
  16. total_times = int(score[2])
  17. if game_times > 0:
  18.     avq_times = float(total_times) / game_times
  19. else:
  20.     avq_times = 0
  21. print('%s,你已经玩了%d次,最少%d轮猜出答案,平均%.2f轮猜出答案'%(
  22.     name,game_times,min_times,avq_times))  # 加了个名字name,在括号处换行.

  23. num = randint(1,10)
  24. times = 0 # 记录本次游戏轮数
  25. print('猜猜我想啥?')
  26. bingo = False
  27. while bingo == False:
  28.     times += 1   #轮数+1
  29.     answer = int(input())
  30.     if answer > num:
  31.         print('太大了')
  32.     if answer < num:
  33.         print('太小了')
  34.     if answer == num:
  35.         print('bingo')
  36.         bingo = True
  37.     if answer < 0:
  38.         print('Exit game...')
  39.         break

  40. # 如果是第一次玩,或者轮数比最小轮数少,则更新最小轮数。
  41. if game_times ==0 or times < min_times:
  42.     min_times = times
  43. total_times += times # 总游戏轮数增加
  44. game_times += 1

  45. # 把成绩更新到对应玩家当中
  46. # 加上str转化为字符串,为后面的格式做准备
  47. scores[name] = [str(game_times),str(min_times),str(total_times)]
  48. result = '' # 初始化一个空字符串用来存储
  49. for n in scores: # 把成绩按照'name,game_times,min_times,total_times',结尾要加上\n换行
  50.     line = n +' '+' '.join(scores[n])+'\n'
  51.     result += line

  52. f = open('game.txt','w')
  53. f.write(result)
  54. f.close()

复制代码

作者: lubvi    时间: 2017-11-3 17:16
C老师,为啥第一行的0 0 0 不会被替换掉啊,之后生成新的

王朝_20171103171303.jpg (29.22 KB, 下载次数: 239)

王朝_20171103171303.jpg


作者: crossin先生    时间: 2017-11-4 15:28
lubvi 发表于 2017-11-3 17:16
C老师,为啥第一行的0 0 0 不会被替换掉啊,之后生成新的

你把中间产生的变量都输出出来自己看一下就明白了
作者: bobo0769    时间: 2017-11-20 08:52
标题: 请教老师,这是哪里出问题了
name=input('请输入你的名字:')
f1=open('d:\py\game.txt')
lines=f1.readlines()   #读取文件。与之前不同,我们用readlines把每组成绩分开来
f1.close()

scores={}              #再用一个字典来记录所有的成绩
for i in lines:
    s=i.split()
    scores[s[0]]=s[1:] #每一项的key是玩家的名字,value是一个由剩下的数据组成的数组。把成绩赋值给键
score=scores.get(name) #查找当前玩家数据
if score is None: #没有找到该玩家数据,说明是新玩家,给他初始化一组成绩:
    socre=[0,0,0]

from random import randint #用random模块中的randint这个方法产生随机数
game_times=int(score[0])  #玩游戏次数
min_times=int(score[1])   #最快猜出的轮数
total_times=int(score[2]) #猜过的总轮数
if game_times>0:         #分母不能为0,所以加了个判断
    avg_times=float(total_times)/game_times  #平均数可能是小数,所以在之前加个float
else:
    avg_times=0
print('%s,你已经玩了%d次,最少%d轮猜出答案,平均%.2f轮猜出答案' %(
    name,game_times,min_times,avg_times))

num=randint(1,100)
times=0            #记录本次游戏轮数
print('gusee what i think?')
bingo=False  #先让循环动起来!
while bingo==False:
    times+=1       #每进行一次就记录一次轮数
    answer=int(input())
    if answer<num:
        print('%.2f is too small!' %answer)
    if answer>num:
        print('%.2f is too big!'%answer)
    if answer<0:
        print('exit game')
        break             #输入负数提前结束游戏
    if answer==num:
        print('bingo,%.2f is the right answer!'%answer)
        bingo=True  
  
if game_times==0 or times<min_times:  #如果第一次玩或者本次轮数比最少轮数还少,本次记录为最少轮数
    min_times=times
total_times+=times #把玩过的轮数累计计入到总轮数
game_times+=1  #每玩一次就累计一次游戏次数

scores[name] = [str(game_times), str(min_times), str(total_times)] #把成绩更新到scores中,如果没有这一项,会自动生成新条目
result=''    #初始化一个空字符串
for n in scores:
    line=n+''+' '.join(scores[n])+'\n' #把成绩按照“game_times,min_times,total_times”格式化
    result+=line  #添加到result中

f1=open('d:\py\game.txt','w')
f1.write(result)    #把结果输入到文件中
f1.close()
作者: crossin先生    时间: 2017-11-20 10:06
bobo0769 发表于 2017-11-20 08:52
name=input('请输入你的名字:')
f1=open('d:\py\game.txt')
lines=f1.readlines()   #读取文件。与之前不 ...

请提供输出或报错,你不能光把代码放上来让别人来调试
作者: 小可爱    时间: 2017-11-30 16:17
Envy 发表于 2015-3-25 16:30
你好,那个scores和score这块不太明白是什么意思,就是readlines得到的应该是一个list吧,如果最开始game ...

明白了,这个按行读取会分别按行保存,然后循环从第二个数据读取,原来如此,谢谢啦
作者: ouyezhe886    时间: 2017-12-14 16:54
你好,想请教一个问题,代码如下:
from random import randint

name = raw_input('Plz print your Name:')
f = open('F:\py\game.txt')
lines = f.readlines()
f.close()

scores = ()
for l in lines:
    s = l.split()
    scores[s[0]] = s[1:]
score = scores.get(name)
if score is None:
    score = [0,0,0]

game_times = int(score[0])
min_times = int(score[1])
total_times = int(score[2])
if game_times > 0:
    avg_times = float(total_times) / game_times
else:
    avg_times = 0
print '%s, you have played %d times, the best takes %d times, avg takes %2f. times'%(name,game_times,min_times,avgtimes)

num = randint(1,100)
times = 0
print 'Guess what number i think?!'
bingo == False
while bingo==False:
    answer = input()
    if answer > num:
        print 'too small!'
    if answer < num:
        print 'too big!!'
    if answer == num:
        print 'BINGO!'
        bingo = True

if game_times == 0 or times < min_times:
    min_times = times
total_names += times
game_times += 1

socres[name]=[str(game_times),str(min_times),str(total_times)]
result = ''
for n in scores:
    line = n + ' ' + ' '.join(scores[n]) + '\n'
    result += line
    f = open('F:\py\game.txt','w')
    f.write(result)
    f.close()
结果总是报错:
File "C:\Users\asus\Desktop\L39-41 Game record by TXT 20171214.py", line 14, in <module>
    score = scores.get(name)
AttributeError: 'tuple' object has no attribute 'get'
作者: Chris_py    时间: 2017-12-21 22:50
   line=n+' '+' '.join(scores[n])+'\n'
这个不是特别理解,n是指的名字,我不太理解为什么是两个空格,是因为n是名字,名字与数字间的空格需要加一个空格强调一下,后面的都是数字了就可以只有一个空格吗?
编程新人,求大神解答
  
作者: wwyy4ever    时间: 2018-2-9 15:34
老师能解释一下这句吗
for n in scores:
     line=n+' '+' '.join(scores[n])+'\n'
     result+=line
作者: crossin先生    时间: 2018-2-9 16:23
wwyy4ever 发表于 2018-2-9 15:34
老师能解释一下这句吗
for n in scores:
     line=n+' '+' '.join(scores[n])+'\n'

这个就是拼字符串,你把它分开来一步步写会比较清楚,我这里合在一行里了
作者: t111222333    时间: 2018-2-18 17:34
老师,过年好,我是新手
scores={}
for i in lines:
    #print(i)
    s=i.split()
    print(s)
    scores[s[0]]=s[1:]
    print(scores)
score = scores.get(name)
print(score)
if name is None:
    score=[0,0,0]
game_times=int(score[0])
最后输出有错误
输入名字a
['0', '0', '0']
{'0': ['0', '0']}
None
Traceback (most recent call last):
  File "e:\vscod\a8.py", line 18, in <module>
    game_times=int(score[0])
TypeError: 'NoneType' object is not subscriptable
通过退出代码 1 终止的终端进程
老师,为何新名字添加不进去,txt文件是0 0 0,名字为空,程序就停了,
作者: crossin先生    时间: 2018-2-19 10:42
t111222333 发表于 2018-2-18 17:34
老师,过年好,我是新手
scores={}
for i in lines:

代码里有空行
作者: t111222333    时间: 2018-2-20 19:51
老师,我去掉所有空行,还是这个问题,程序里显示score还是NoneType,而scores显示是class,我在txt文件里先把人名加上,输入这个名程序能运行,输入新名字就不行了
作者: crossin先生    时间: 2018-2-21 12:45
这个你得调试啊,看中间哪一步的数据不对,不然我也帮不上忙

作者: Frank.Lin    时间: 2018-3-1 20:02
我的报错了,求指导。
  1. from random import randint

  2. name=input('请输入你的名字:')    #输入玩家的名字

  3. f=open('c:\Python36\00-Practice\game.txt')
  4. lines=f.readlines()
  5. f.close()

  6. scores={}                   #初始化一个空字典
  7. for l in lines:
  8.     s=l.split()             #把每一行的数据拆分为List
  9.     scores[s[0]]=s[1:]      #第一项作为key,剩下的作为value
  10. score=scores.get(name)      #查找当前玩家的数据
  11. if score is None:           #如果没找到
  12.     score=[0,0,0]           #初始化数据

  13. game_times=int(score[0])
  14. min_times=int(score[1])
  15. total_times=int(score[2])
  16. if game_times>0:
  17.     avg_times=float(total_times)/game_times
  18. else:
  19.     avg_times=0

  20.     #加上显示玩家的名字
  21.    
  22. print('%s,你已经玩了%d次,最少%d轮猜出答案,平均%.2f轮猜出答案'%(name,game_times,min_times,avg_times))

  23. num=randint(1,100)
  24. times=0
  25. print('Guess What I am Think?')
  26. bingo=False
  27. while bingo==False:
  28.       times+=1          #记录本次游戏轮数
  29.       answer=int(input())
  30.       if answer < num:
  31.           print('too small')
  32.       if answer>num:
  33.           print('too big')
  34.       if answer==num:
  35.           print('Bingo!')
  36.           bingo=True
  37.       
  38. #如果是第一次玩,或者轮数比最小轮数少,则用最小轮数
  39.       
  40. if game_times==0 or times<min_times:
  41.       min_times=times
  42. total_times+=times
  43. game_times+=1


  44. #把成绩更新到对应的玩家数据中
  45. #加str转成字符串,为后面的格式化做准备
  46. scores[name]=[str(game_times),str(min_times),str(total_times)]
  47. result=''       #初始化一个空字符串,用来存储数据
  48. for n in scores:
  49.       line=n+''+''.join(scores[n])+'\n'
  50.       result+=line                      #添加到result中

  51. f=open('c:\Python36\00-Practice\game.txt','+w')
  52. f.write(result)
  53. f.close()
  54.       
复制代码
报错如下:

QQ图片20180301200133.png (24.71 KB, 下载次数: 192)

报错图片

报错图片


作者: Frank.Lin    时间: 2018-3-1 20:46
找到了,一个是绝对地址,取消绝对地址引用就行了。
第二个是‘ ‘引号里面要有空格。
以上,供各位同学参考。
至于为什么绝对地址会报错,现在还没搞清楚。
作者: crossin先生    时间: 2018-3-2 13:56
Frank.Lin 发表于 2018-3-1 20:46
找到了,一个是绝对地址,取消绝对地址引用就行了。
第二个是‘ ‘引号里面要有空格。
以上,供各位同学参 ...

字符串中的 \0 被转义了
作者: Frank.Lin    时间: 2018-3-2 14:41
crossin先生 发表于 2018-3-2 13:56
字符串中的 \0 被转义了

哦,谢谢老师!怪不得很多文件的安装地址要求纯英文地址安装。
作者: yamika    时间: 2018-3-14 16:03
from random import randint
name=input('输入你的名字:')

f=open('d:\Others\\text.txt')
line=f.readlines()
f.close()

scores={}
for l in scores:
    s=l.split()    #s是每一列,带有每个玩家的信息(姓名,成绩)
    scores[s[0]]=s[1:]
score=scores.get(name)
if score is None:
    score=[0,0,0]

cishu=int(score[0])
lunshu=int(score[1])
zong=int(score[2])
if cishu>0:
    avg=float(zong)/cishu
else:
    avg=0
print('%s:你的成绩为:游戏次数:%d,猜出所用的轮数:%d,平均每次所用轮数:%.2f'%(
    name,cishu,lunshu,avg))
num=randint(1,50)
print('猜一个1到50之间的数:')
Bingo=False
time=0
while Bingo==False:
      time+=1
      answer=int(input())
      if answer>num:
          print('大了')
          Bingo==True
      if answer<num:
          print('小了')
          Bingo==True
      if answer==num:
          print('Bingo')
          Bingo==False
if cishu==0 or time<lunshu:
    lunshu=time
cishu=cishu+1
zong+=time
scores[name]=[str(cishu),str(lunshu),str(zong)]
result=''
for n in scores:
    line=n+' '+' '.join(scores[n])+'\n'
    result+=line
   
f=open('d:\Others\\text.txt','w')
f.write(result)
f.clsoe()
麻烦老师看下代码了,程序能运行,游戏也能玩,就是没法写入成绩,
自查不出来问题了。。。
作者: crossin先生    时间: 2018-3-15 17:18
yamika 发表于 2018-3-14 16:03
from random import randint
name=input('输入你的名字:')

f.close()
最近好像好多人犯这个错啊……
作者: yamika    时间: 2018-3-15 20:43
额,犯了低级错误,添麻烦了,惭愧。。。
感谢,以后一定注意
作者: yamika    时间: 2018-3-15 21:35
crossin先生 发表于 2018-3-15 17:18
f.close()
最近好像好多人犯这个错啊……

先生啊,改了close,好像还是不行游戏还是能玩,就是写不进去结果
我用的py3,是有什么影响吗?


作者: crossin先生    时间: 2018-3-16 17:31
yamika 发表于 2018-3-15 21:35
先生啊,改了close,好像还是不行游戏还是能玩,就是写不进去结果
我用的py3,是有什么影响吗?

单独把你的写入代码测一下,看看行不行。另外代码里面多加输出,观察执行情况。要调试的
作者: yamika    时间: 2018-3-17 16:50
用你说的方法,调试了半小时,终于弄清楚原因了:
while循环里,返回值bingo=True,不满足while条件了,while语句是不继续执行了,但程序也就停止了,while后面的程序都不执行了,必须在最后的if里(bingo=True)加个break,才能继续后面的程序。
可你的程序里没有break,其他都一样的,这是py3和2的差别?

作者: crossin先生    时间: 2018-3-18 14:57
yamika 发表于 2018-3-17 16:50
用你说的方法,调试了半小时,终于弄清楚原因了:
while循环里,返回值bingo=True,不满足while条件了,whi ...

不是。你描述的现象不合理,可能是其他原因。这个我无法验证
作者: kakason    时间: 2018-3-21 17:21
crossin先生 发表于 2018-3-16 17:31
单独把你的写入代码测一下,看看行不行。另外代码里面多加输出,观察执行情况。要调试的 ...

先生,我这一行:scores[s[0]]=s[1:]
报错 Indexerror:list index with exit code 1
为什么啊?我的文本是

mom 3 5 31
helen 4 8 14
sara 5 18 34
jack 7 19 40


作者: kakason    时间: 2018-3-21 17:59
我有一颗明珠 发表于 2017-11-2 11:58
你好,为什么我的代码运行到
scores={}
for l in lines:

请问你解决问题了吗?
作者: crossin先生    时间: 2018-3-21 23:07
kakason 发表于 2018-3-21 17:21
先生,我这一行:scores[s[0]]=s[1:]
报错 Indexerror:list index with exit code 1
为什么啊?我的文本 ...

应该是你的代码里有空行
作者: Hey_Python    时间: 2018-3-27 14:36
本帖最后由 Hey_Python 于 2018-3-27 14:40 编辑

crossin老师,你好。我是萌新一个。按照老师说的去打41课的。用的是python3,但是每次我用同一个名字去玩,都没有之前记录,在文档里面又新开了一个相同的名字了。求解~~

from random import randint

name = input('请输入你的名字:')  #输入玩家名字

f = open('game.txt')
lines = f.readlines()
f.close()

scores = {}  #初始化一个空字典
for l in lines:
    s = l.split()  #把每一行的数据拆分成list
    scores[s[0]] = s[1:]  #第一项作为key,剩下的作为value
score = scores.get('name') #查找当前玩家的数据
if score is None: #如果没有找到,
    score = [0,0,0]  #初始化数据

   
game_times=int(score[0])
min_times = int(score[1])
total_times = int(score[2])
if game_times > 0:
    avg_times = float(total_times) / game_times
else:
    avg_times = 0
print(('你已经玩了%d次,最少%d轮猜出答案,平均%.2f轮猜出答案') % (game_times, min_times, avg_times))

num = randint(1,100)
times = 0     #记录本次游戏轮数
print('Guess what I think?')
bingo = False
while bingo == False:
    times += 1  #轮数+1
    answer = int(input())
    if answer < num:
      print('too small!')
    if answer > num:
      print('too big!')
    if answer == num:
      print('BINGO')
      bingo = True


#如果是第一次玩,或者轮数比最小轮数少,则更新最小轮数
if game_times == 0 or times < min_times:
      min_times = times
total_times += times   #总游戏轮数增加
game_times += 1    #游戏次数增加

#把成绩更新到对应的玩家数据中
#加str转成字符串,为后面的格式化作准备
scores[name] =  [str(game_times), str(min_times), str(total_times)]
result = ' '  #格式化一个空字符串,用来存储数据
for n in scores:
       #把成绩按照"name game_times min_times total_times"格式化
       #结尾要加上/n换行
       line = n + ' ' + ' '.join(scores[n]) + '/n'
       result += line  #添加到result中

f = open('game.txt', 'w')
f.write(result)
f.close()


==============================================
0 0 0/nhey 1 7 7/n/nhey 1 8 8/n/nhey 1 6 6/n
文档里面的数据
作者: crossin先生    时间: 2018-3-27 19:42
Hey_Python 发表于 2018-3-27 14:36
crossin老师,你好。我是萌新一个。按照老师说的去打41课的。用的是python3,但是每次我用同一个名字去玩, ...

scores.get('name')
应该是
scores.get(name)
想想为什么
作者: Hey_Python    时间: 2018-3-27 22:54
crossin先生 发表于 2018-3-27 19:42
scores.get('name')
应该是
scores.get(name)

谢谢老师,我一开始也是写(name),之后才加了‘’,不过我发现问题了,是最后换行的那个\n打成/n了
作者: luckyalan    时间: 2018-4-1 14:55
scores[name] = [str(game_times), str(min_times), str(total_times)]

mac pycharm 2.7  报错

list indices must be integers, not str

烦请指正
作者: crossin先生    时间: 2018-4-1 23:51
scores = {}
是个字典,不是列表
作者: startforever    时间: 2018-6-5 22:16
python 3.5 帮忙指导下,报错:
Traceback (most recent call last):
  File "E:\workspace\learn\src\less01\game_tst1.py", line 63, in <module>
    line=n+''+''.join(score[n])+'\n'
TypeError: list indices must be integers or slices, not str
  1. #coding=utf-8


  2. from random import randint
  3. from pip._vendor.distlib.compat import raw_input

  4. name=raw_input("请输入你的名字")

  5. f=open(r'e:\test\game.txt','r')
  6. lines=f.readlines()
  7. scores={}
  8. for l in lines:
  9.     s=l.split()
  10.     scores[s[0]]=s[1:]
  11. score=scores.get(name)   
  12. if score is None:
  13.     score=[0, 0, 0,]

  14. game_times=int(score[0])
  15. min_times=int(score[1])
  16. total_times=int(score[2])

  17. if game_times > 0:
  18.     avg_times= float(total_times)/game_times
  19. else:
  20.     avg_times=0

  21. print("%s,你已经完料%d次,最少%d轮猜出答案,平均%.2f轮拆除答案"%(name,game_times,min_times,avg_times))

  22. times=0

  23. num=randint(1,100)
  24. print("Guess what i think?")
  25. bingo=False
  26. while bingo==False:
  27.     times=times+1
  28.     answer=int(input())
  29.     if answer<num:
  30.         print(("too small"))
  31.     if answer>num:
  32.         print("too big")
  33.     if answer==num:
  34.         print("you are clevr!")
  35.         bingo=True

  36. if  game_times==0 or times<min_times:
  37.     min_times=times
  38. total_times=total_times+times
  39. game_times=game_times+1

  40. scores[name]=[str(game_times),str(min_times),str(total_times)]
  41. result=''

  42. for n in scores:
  43.     line=n+''+''.join(score[n])+'\n'

  44. f=open(r'e:\test\game.txt','w')
  45. f.write(result)
  46. f.close()
复制代码

作者: crossin先生    时间: 2018-6-5 23:38
score[n] 这里应该是 scores 吧,仔细再对一下
作者: 橙了个棒棒糖    时间: 2018-10-28 23:36
Envy 发表于 2015-3-25 16:30
你好,那个scores和score这块不太明白是什么意思,就是readlines得到的应该是一个list吧,如果最开始game ...

scores[s[0]] = s[1:],  这句里面的 我不太懂啊  每一项是什么意思  你现在明白吗   谢谢啦~
作者: 橙了个棒棒糖    时间: 2018-10-28 23:43
标题: 【Python 第41课】 用文件保存游戏(3)
本帖最后由 橙了个棒棒糖 于 2018-10-29 00:01 编辑
  1. scores = {}

  2. for l in lines:

  3.    s = l.split()

  4.    scores[s[0]] = s[1:]
复制代码
这里scores 是一个字典对吧,那么scores [s[0]] 是不是这个字典里的第一个key,也就是key1  后面的 s[1:]  是不是给key1赋值?也就是value1? 那么 这时是不是 文本里就是        key(暂定不知):s[1:]的值    假定一些值举例的话就是     ‘’:10 45 90      
还有就是这课里面 打开的文本  应该是默认里面有按   名字+数值    这种方式已记录过一些的吧  不然score.get(name)  应该是不能用的吧
QQ图片20181028235836.png

还有就是前面这个赋值的意义我不太懂 前面 应该是没有key 的一次赋值 ,但是后面创建了一个 带有key 的赋值,那要前面那个意义在哪。
  1. result = ''

  2. for n in scores:

  3.    line = n + ' ' + ' '.join(scores[n]) + '\n'

  4.    result += line
复制代码
还有前面的n 和后面的scores[n]  我有点傻傻分不清
哪位老大哥能举个例子 跟我说说了   不胜感激!!!!
作者: crossin先生    时间: 2018-10-29 16:10
你可以自己另用个文件写下:
  1. scores = {
  2. 'aaa': 123,
  3. 'bbb': 456,
  4. 'ccc': 789
  5. }
  6. for n in scores:
  7.     print(n)
  8.     print(scores[n])
复制代码
看看分别是什么

字典相关课程里的内容
作者: crossin先生    时间: 2018-10-29 16:12
橙了个棒棒糖 发表于 2018-10-28 23:36
scores[s[0]] = s[1:],  这句里面的 我不太懂啊  每一项是什么意思  你现在明白吗   谢谢啦~ ...

你把代码,分来看每一个都输出来看

print(s)
print(s[0])
print(s[1:])
作者: 吃土小华    时间: 2018-11-8 21:00
from random import randint

f = open('game.txt')
lines = f.readlines()
f.close()


scores = {}
for i in lines:
    a = i.split()
    scores[a[0]] = a[1:]
   
name  = input('请输入你的名字:')
运行后报错
Traceback (most recent call last):
  File "C:\Users\xiao hua\AppData\Local\Programs\Python\Python37\测试2.py", line 11, in <module>
    scores[a[0]] = a[1:]
IndexError: list index out of range
求解这个是什么问题,非常感谢!
作者: 吃土小华    时间: 2018-11-9 15:17
本帖最后由 吃土小华 于 2018-11-9 15:18 编辑
吃土小华 发表于 2018-11-8 21:00
from random import randint

f = open('game.txt')

之前的问题已经解决了,可能是因为文本后面空白行的原因。
新的问题是这个
from random import randint

f = open('game.txt')
lines = f.readlines()
f.close()


scores = {}
for l in lines:
   s = l.split()

   scores[s[0]] = s[1:]

   
name  = input('请输入你的名字:')
score = scores.get(name)
if score is None:
    score = [0,0,0]

game_time = int(score[0])
min_time = int(score[1])
total_time = int(score[2])
if game_time>0:
    avg_times = float(total_time)/game_time
else:
    avg_times = 0

print('%s,你已经玩了%d次,最少%d轮猜出答案,平均%.2f轮猜出答案。'%(name,game_time,min_time,avg_times))

num = randint(1,100)
time=0
bingo= False
print('Guess what I think.')
while bingo==False:
    answer=int(input())
    time+=1
    if answer<num:
        print('too small')
    if answer>num:
        print('too big')
    if answer==num:
        print('bingo')
        bingo=True

total_time +=time
if game_time==0 or time<min_time:
    min_time=time
game_time+=1
print(game_time,min_time,total_time)
game_times=str(game_time)
mins=str(min_time)
total=str(total_time)
scores[name] = {game_times,mins,total}
print(scores[name])
result=''
for n in scores:
    line = n +' '+' '.join(scores[n])+'\n'#line为字符串
    result += line


#f=open('game.txt','w')
#f.write(result)
#f.close()
这样写完后显示
请输入你的名字:小华
小华,你已经玩了0次,最少0轮猜出答案,平均0.00轮猜出答案。
Guess what I think.
50
too big
60
too big
25
too small
35
too small
40
too small
45
too small
48
too small
49
bingo
1 8 8
{'1', '8'}
>>>
其中小华的所有数值无法写入到字典里,只能显示两个值,文本文档中的内容和公众号一致,非常疑惑这是为什么,求大神解答,非常感谢。
作者: crossin先生    时间: 2018-11-9 22:44
吃土小华 发表于 2018-11-9 15:17
之前的问题已经解决了,可能是因为文本后面空白行的原因。
新的问题是这个
from random import randint

scores[name] = [game_times,mins,total]
这里是列表不是字典




欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5