首页 > 编程语言 >Python编写编程作业批量自动打分程序的思路与实现

Python编写编程作业批量自动打分程序的思路与实现

时间:2023-06-09 21:05:03浏览次数:70  
标签:Python 编程 print time searchOne 字符串 import 打分 fn


总体思路:把接口明确地告诉学生(本文后面的代码要求学生程序中必须有个函数叫做searchOnede),然后学生把Python程序文件(学号_姓名.py)以任何方式提交给老师,放到同一文件夹中。下面的代码首先由老师编写一个自己认为的最佳和最优实现,然后把学生的程序文件作为模块导入并调用其中的searchOne函数,如果学生作业中没有这个函数判为0分,如果有这个函数但是执行结果与老师的不一样也是0分,如果结果正确则根据学生代码运行时间进行打分,速度越慢则分数越低。

作业自动打分代码不是通用的,因为要批改的作业内容和要求不一样,可以根据本文大概思路自行编写相应的作业批改程序。

from string import ascii_letters, digits
from random import choice
from os import listdir, rename
from os.path import splitext
from time import time
def searchOne(s):
    '''函数功能:
    给定任意字符串,找出其中只出现一次的字符,
    如果有多个这样的字符,就全部找出。'''
    # 创建空字典
    d = dict()
    # 遍历字符串,并分别记录每个字符的出现次数
    for ch in s:
        # 这里重点演示字典的get()方法
        # 如果这个字符出现过,加1
        # 如果这个字符第一次出现,0+1
        d[ch] = d.get(ch, 0) + 1
    # 列表推导式,查找所有只出现一次的字符
    chs = [ch for ch, n in d.items() if n==1]
    # 返回最终结果,所有只出现一次的字符
    return chs
# 10个待测字符串,统计标准答案处理结果和用时
chs = ascii_letters + digits
ss = [''.join((choice(chs) for j in range(20))) for i in range(10)]
# 保存每个字符串处理结果和用时的字典
d = dict()
# 每个字符串处理N次
N = 100
for s in ss:
    # 每个字符串的处理结果
    d[s] = [searchOne(s), 0]
    start = time()
    for i in range(N):
        searchOne(s)
    end = time()
    # 处理字符串所用时间
    d[s][1] = end-start
# 遍历学生作业文件
fns = [f for f in listdir('.') if f.endswith('.py') and f!='autoStandard.py']
print(fns)
for f in fns:
    t = splitext(f)
    fn = 'a'+t[0]
    rename(f, fn+t[1])
    print(fn)
    # 把学生作业程序当做模块来导入
    exec('import '+fn)
    # 随机选择一个字符串进行测试
    s = choice(ss)
    # 如果学生的函数命名不符合要求,0分
    try:
        r1 = eval(fn).searchOne(s)
    except:
        print(fn, 0)
        continue
    # 如果学生函数运行结果不正确,0分
    if r1!=d[s][0]:
        print(fn, 0)
        continue
    
    # 如果结果正确,根据运行速度评分,越快分数越高
    start = time()
    for i in range(N):
        eval(fn).searchOne(s)
    delta = time()-start
    score = 100 - (delta-d[s][1])*0.7
    print(fn, round(score, 1))

标签:Python,编程,print,time,searchOne,字符串,import,打分,fn
From: https://blog.51cto.com/u_9653244/6451073

相关文章

  • 详解Python中的位运算符规则、原理与用法
    在Python中,位运算符包括位与(&)、位或(|)、位求反(~)、位异或(^)、左移位(<<)和右移位(>>)。1.运算方法与规则位运算符只能适用于整数,其总体运算规则为:首先把整数转换为二进制表示形式,按最低位对齐,短的高位补0,然后进行位运算,最后把得到的二进制转换为十进制数。位与运算符运算规则:0&0=0&1=1&0=......
  • Python批量Excel文件数据导入SQLite数据库的优化方案
    说明:1)需要安装扩展库openpyxl;2)随着数据库的增大,导入速度可能会有所下降;3)本文只考虑Python代码优化,没有涉及数据库的优化;4)本文要点在于使用executemany实现批量数据导入,通过减少事务提交次数提高导入速度。fromrandomimportchoice,randrangefromstringimportdigits,ascii......
  • Python求解进制问题(阿里巴巴2015笔试题)
    问题描述:用十进制计算30的阶乘,然后把结果转换成三进制表示,那么该进制表示的结果末尾会有多少个连续0?解析:作为笔试题的话,要想按照题意先把阶乘结果计算出来再转换成三进制最后再数0的个数,时间肯定来不及。也就是说,应该是有更简单的方法。以我们最熟悉的十进制为例,一个数乘以10相当于......
  • Python中直接查看对象值和使用print()输出的区别
    直接用代码来描述这个问题的现象:>>>x=r'C:\windows\notepad.exe'>>>x'C:\\windows\\notepad.exe'>>>print(x)C:\windows\notepad.exe>>>x='''Tomsaid,"Let'sgo."'......
  • Python提取彩色图像的二值化边缘
    所谓二值化是指只包含白和黑这两种颜色,下面的代码中使用白色表示内部或背景,使用黑色表示边缘。图像边缘提取的基本思路是:如果一个像素的颜色值与周围像素足够接近(属于低频部分)则认为是图像背景或者内部,如果一个像素的颜色值与周围像素相差很大(属于高频部分)则认为是图像边缘。在具体......
  • Python+SQLite开发无界面版通信录管理系统
    本文重点在于演示Python对SQLite数据库的操作,以及命令行式菜单的工作原理和实现。首先使用SQLiteDatabaseBrowser创建SQLite数据库data.db,然后创建一个数据表addressList,最后在数据表addressList中创建字段id(INTEGERPRIMARYKEY类型)、name(TEXT类型)、sex(TEXT类型)、age(NUMERIC类型......
  • 妙用Python集合求解啤酒问题(携程2016笔试题)
    问题描述:一位酒商共有5桶葡萄酒和1桶啤酒,6个桶的容量分别为30升、32升、36升、38升、40升和62升,并且只卖整桶酒,不零卖。第一位顾客买走了2整桶葡萄酒,第二位顾客买走的葡萄酒是第一位顾客的2倍。那么,本来有多少升啤酒呢?解析:由于该酒商只卖整桶酒,简单分析几个桶的容量可知,第二位顾客......
  • Python两种方法求解登楼梯问题(京东2016笔试题)
    问题:假设一段楼梯共15个台阶,小明一步最多能上3个台阶,那么小明上这段楼梯一共有多少种方法?解析:从第15个台阶上往回看,有3种方法可以上来(从第14个台阶上一步迈1个台阶上来,从第13个台阶上一步迈2个台阶上来,从第12个台阶上一步迈3个台阶上来),同理,第14个、13个、12个台阶都可以这样推算,从......
  • 大数据分析python
    #导库importnumpyasnpimportpandasaspd#读取数据data=pd.read_csv('logistics.csv')data.head(10)思路:直接查看不同公司的数量即可df1=data.groupby('货运公司名称').size().reset_index(name='count')#直接对货运公司的名称做统计(示例:天天速递25)df12.接通知对......
  • 使用Python编写简易定时器
    简单模拟了定时器功能,需要的朋友可以自己改写和扩充功能。importdatetimeimportwinsoundimporttimeimportrandomdefTimer(y,m,d,h,mu,s):'''参数分别为年、月、日、时、分、秒'''stopTime=datetime.datetime(y,m,d,h,mu,s)maxTime=stopTime+......