背景
今天整理一个 Python 练习题,需求描述如下:
程序一: 接收用户输入的名字和成绩,成绩是1-100 间、最多两位小数。 按Q结束输入,并将合法输入的数据写入到一个文件。 程序二:读取程序一输出的文件,然后对成绩计算平均值,并输出最高分和最低分值及姓名。
实现分析
本例用到的知识点:
- 文件操作,需要
try-except-finally
,处理文件异常; - 判断成绩的正则:
^[0-9]{1,2}(\.[0-9]{1,2})?$
,成绩可以是小数点后两位小数; while
循环条件, Python 的逻辑运算是and / or / not
等关键字,而不是逻辑操作符号;- 使用
pd.read_csv
将 CVS 文件转换成DataFrame
数据集; - 使用
DataFrame
的max 、min、avg 、idmax、idmin
等函数完成计算操作。
成绩信息收集
编写一个 score_writer.py
脚本文件,内容如下:
import re
try:
# define file reader
f1 = open('E:/score.log','w',encoding='utf-8')
f1.write('name,score\r\n')
# a pattern check score input
pattern = "^[0-9]{1,2}(\.[0-9]{1,2})?$"
print('请输入姓名和考试成绩,按 Q 结束,成绩范围 [1-100],最多允许两位小数。')
# receive name
name = input("姓名:")
while name != 'Q' and name != 'q' :
score = input("成绩:").strip()
while re.match(pattern,score)==None and score != '100':
score = input("成绩不合法,请重新输入:").strip()
print(name,':',score)
f1.write(name+','+score+'\r\n')
name = input("姓名:")
print('输入结束,存储数据')
except IOError:
print("操作异常")
finally:
f1.close()
运行结果:
成绩数据计算
编写一个 score_reader.py
脚本文件,内容如下:
from pandas import DataFrame
import pandas as pd
# array to load score
try:
# define file reader
data = pd.read_csv('E:/score.log')
print(data)
print('平均值',data['score'].mean(axis = 0))
print(data['name'][data['score'].idxmax()],' 分数最高:',data['score'].max(axis = 0))
print(data['name'][data['score'].idxmin()],' 分数最低:',data['score'].min(axis = 0))
except IOError:
print("文件不存在")
由于存储成的是 CVS 文件,标题是 name,scroe
,转换成 DataFrame 后计算最值的索引小标后取名字列对应的元素就能输出最值的姓名了。
换一个不存在的文件路径,程序捕获异常:
编程启示录
Python 读写文件真是简洁呀,两行代码搞定,而 Java 要写几十行,真是两个极端。 想起前两天看到一个语言对比图:
语言 | 执行方式 | 运行速度 | 代码行数 |
---|---|---|---|
C | 编译 | 非常快 | 少 |
Java | 编译 | 快 | 非常多 |
Python | 解释 | 慢 | 非常少 |