上机作业2答案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1. 基本语句练习
(1)取得字母a的ascii码, 将ascii码 65 转为对应的字母.
ord('a')
chr(65)

(2)产生50个 40-100之间的随机整数, 放在列表 li 中.
li=[random.randint(40,100) for _ in range(50)]

(3)用列表生成式产生所有的小写字母列表
li2=[chr(x) for x in range(ord('a'), ord('z')+1)]

(4)把字符串 'abcdefg' 写入文件data.txt中.
with open('data.txt','w') as file:
file.write('abcdefg')


(5)假定已有两个列表li1, li2, 要求找出两个列表中都存在的数据, 将这些数据保存在li3中.
li3=[x for x in li1 if x in li2]

(6)构造1个字典,存入'a':'apple', 'b':'banana' 这两个键值对
di={'a':'apple', 'b':'banana'}

(7)有字符串 s='abcdefg', 现在要分别取出 b, bcd, g, abcdefg ,aceg 应分别使用什么样的切片语句.
s[1]
s[1:4]
s[-1]
s[:]
s[0::2]

(8)将100到200之间的3的倍数存入列表 li 中
li=[x for x in range(100,200) if x%3==0]



2、已知闰年的判断规则为如下2条:
(1)年份能被4整除,但不能被100整除 (如2004年为闰年,1900年不是闰年)
(2)年份能被400整除 (如2000年为闰年)
满足任何一条则为闰年。现要求判断若干年份是否为闰年。每次从键盘输入一个年份,程序输出判断结果,然后再输入下一个年份,一直到输入-1则退出程序。

while True:
x=int(input('请输入一个年份:'))
if x==-1:
break
if x%400==0 or (x%4==0 and x%100!=0):
print(x, '是闰年')
else:
print(x, '不是闰年')


3. 打印出下列规则图形. 图形层数由键盘输入,例如输入 3,则输出图形如下:
*
***
*****
***
*

输入4,则输出图形如下:
*
***
*****
*******
*****
***
*
提示:计算好每一层 前面的空格数和中间的*数

n=int(input('请输入层数n='))
for x in range(1,n+1): #先输出上半部分
s=' '*(n-x) + '*'*(2*x-1) # 前面的空格数 + 本层的*数
print(s)

for x in range(1,n): # 下半部分
s=' '*x + '*'*(2*(n-x)-1)
print(s)


4.读取网盘上的成绩文件score.txt。文件每行的内容类似下面:
学号 姓名 语文 数学 (这些列名是文件的第一行内容)
1 张三 80 78
.................
.................

现要求
(1) 计算总评成绩 总评=(语文+数学)/2
(2) 分别输出各单项学科前3名, 总评成绩前3名
(3) 输出各单项学科不及格学生名单及成绩

li=[ ]
with open('score.txt') as f:
f.readline() # 先执行一次,用于跳过文件头部第一行的文字
for line in f:
stu=line.split() # 读取每一行,分解得到一个列表
stu[2]=float(stu[2]) # 第2项是语文,转为数值
stu[3]=float(stu[3]) # 第3项是数学
yz=(stu[0],stu[1],stu[2]

,stu[3],round((stu[2]+stu[3])/2) ) #每个学生构造为一个元组,同时计算平均分
li.append(yz) # 将学生元组加入列表


# 因为要多次输出列表,所以定义一个函数以供调用,提高代码的复用性
# rank是要输出的数据个数
def output(li,rank):
if rank>len(li):
rank=len(li) #为防止越界,当指定输出的数据个数大于列表长度时,取列表长度
for index in range(rank):
print(li[index])


print('\n全部学生是:')
output(li,len(li))

print('\n语文前三名是:')
li.sort(key=lambda x:x[2], reverse=True) #语文是第2项
output(li,3)

print('\n数学前三名是:')
li.sort(key=lambda x:x[3],reverse=True) #数学是第3项
output(li,3)

print('\n总评前三名是:')
li.sort(key=lambda x:x[4],reverse=True)
output(li,3)


print('\n语文不及格的是:')
li2=[x for x in li if x[2]<60] #用列表生成式 加一个条件筛选
output(li2, len(li2))

print('\n数学不及格的是:')
li3=[x for x in li if x[3]<60]
output(li3, len(li3))

#以下是扩展,非题目要求的。演示了 min 和 max 也可以用 key 来指定排序
print('\n数学最低分是:')
print(min(li, key=lambda x :x[3]))

print('\n总评最高分是:')
print(max(li, key=lambda x :x[4]))



5.统计网盘上"傲慢与偏见英文版.TXT"这篇英文小说中共有多少个单词,输出出现次数最多的前20个单词
参考: python学习文档的第19题

#统计英文小说中的单词数
#本统计方法未剔除标点符号,连字号等,统计结果有一定误差
words=[]
with open('傲慢与偏见英文版.TXT') as file:
for line in file:
li=[x.lower() for x in line.strip().split()] #每次一行,按空格分隔得到单词,单词都转小写
words=words+li #加入到单词总表中

print('\n总单词数:',len(words))

from collections import Counter
di=Counter(words)
print('\n共有不同的单词数:',len(di))

print('\n出现最多的10个单词是:')
for k,v in di.most_common(10):
print('{0:10} {1}'.format(k,v))

print('\n出现最少的10个单词是:')
for k,v in di.most_common()[-10:]: #先全部排,然后从倒数第10个开始取到末尾
print('{0:10} {1}'.format(k,v))



6.读取股票“浦发银行”的交易数据 SH600000.txt,计算60日均线价格。
注:60日均价是最近60个交易日的收盘价的平均价, 即 (今天的收盘价+前59个交易日的收盘价)/60
前59个数据无法计算60日均价,所以只能从第60个数据开始算

stock=[] #存原始数据
stock2=[] #存计算的均价

with open('SH600000.TXT') as file:
file.readline() #跳过文件第一行文字
file.readline() #跳过文件第二行文字
for line in file:
li=line.split()
yz=(li[0],float(li[4])) # 只保留 0:时间 4:收盘

价(要转浮点数) 两列数据
stock.append(yz) # 将每天数据加入到 stock

days=60 # 该变量规定计算 X 日均价 (如设为10,则计算10日均价)
for index in range(days-1,len(stock)): # 前59天数据不足,从第59天开始
li=stock[index-days+1:index+1] # 切片取包括当天在内的60天的收盘价
avg=round( sum([x[1] for x in li]) /days,2) # 计算60天均价,保留2位小数. 收盘价是数据的第1项 x[1]
yz=(stock[index][0],avg) # 构造一个元组 (日期,60天均价) 日期是第0项 x[0]
stock2.append(yz) # 添加到结果列表中

print('\n {}日均价是:'.format(days))
for d,v in stock2:
print(d,v)


相关文档
最新文档