大一python,通过函数和字典等完成学生(学号)抽奖

注意:
1.完成以下题目使用 python3.8 以后版本
2.只能使用 python 内置函数和标准库
3.不可使用第三方库
4.需要详细的注释

编写程序模拟抽奖活动,每名学生都有一个随机生成的抽奖号码,使用字典记录抽奖号码的相关信息, 即抽奖号码是键(key),学生信息是值(value),学生信息包括学号和姓名;一等奖设置 1 名,二等奖设置 2 名,三等奖设置 3 名,一次随机抽取兑奖号码 6 个,输出获奖者信息,并统计各班获奖人数。
编程要求:
1、编写函数,创建“学生抽奖信息”字典;
A、根据键盘输入的人数创建该字典,要求人数≥6;
B、根据人数为每名学生随机生成抽奖号码,抽奖号码是键(key),学生信息是值(value),学生信息要求从键盘输入,学生信息包括学号和姓名(学号是键,姓名是值),其中学号格式形如:’50210101’(要求加入健壮性判断,必须是 8位数字形式)。
2、编写打印输出字典的函数(格式参考示例结果);
3、编写抽奖函数,能根据奖项的设置和人数的设置,一次随机生成 6 个兑奖号码,按指定格式输出各中奖号码(格式参考示例结果),将中奖结果保存在“学生获奖信息”字典中,并显示该字典信息(格式参考示例结果);
4、编写统计函数,根据“学生获奖信息”字典(根据学号的前 6 位获得班号) 统计各班获奖人数,存放在“班级中奖人数统计”字典中,并显示该字典信息(格式参考示例结果);
5、编写程序,依次调用上述函数,实现抽奖活动的模拟。A、调用函数 1,创建“学生抽奖信息”字典;
B、调用函数 2,输出“学生抽奖信息”字典;
C、调用函数 3,输出中奖号码,创建“学生获奖信息”字典并输出;

D、调用函数(4),创建“班级中奖人数统计”字典并输出。
程序的某次运行结果如下图所示:

img

img

工程有点大啊(狗头

不写了 送你了 摸鱼结束 下班

import random
#中奖号码
def luck_draw():
    li = [i for i in range(1,11)]#抽奖池
    level_1 = [li[random.randint(1, len(li))]]#一等奖
    level_2 = []#二等奖
    level_3 = []#三等奖
    li.remove(level_1[0])#从抽奖池中移除抽过了的号码 避免抽到重复的号码
    for i in range(2):
        a = li[random.randint(1, len(li))]
        li.remove(a)#从抽奖池中移除抽过了的号码
        level_2.append(a)#将抽取到的号码,添加到中奖号码中
    for i in range(3):
        a = li[random.randint(1, len(li))]
        li.remove(a)#从抽奖池中移除抽过了的号码
        level_3.append(a)#将抽取到的号码,添加到中奖号码中
    return {
        "一等奖": level_1,
        "二等奖": level_2,
        "三等奖": level_3,
    }
#创建学生字典 以及学生抽奖字典
def create_student_luck_draw():
    while True:
        i = input("输入学生人数: ")
        try:
            i = int(i)
        except:
            print("请输入数字")
        if i<6:
            print("学生应当大于等于6人")
        else:
            break
    students = {}
    students_cj = {}
    for a in range(i):
        cj_num = random.randint(1, 10)
        print("第{}位学生的抽奖号码为:{}".format(a+1,cj_num))
        while True:
            student_num = input("请输入学生学号:")
            if len(student_num)==8:
                try:
                    student_num = int(student_num)
                    if student_num in students:
                        print("学号已存在,重新输入!")
                        continue
                except:
                    print("学号格式不正确,应为8位数字")
                    continue
                break
            print("学号格式不正确,应为8位数字")
            continue
        student_name = input("请输入学生姓名:")
        students[student_num] = student_name
        students_cj[student_num] = cj_num
    return (students, students_cj)

if __name__ == '__main__':

    a = [random.randint(0, 10) for a in range(6)]
    print(a)
    luck_draw()
    # create_student_luck_draw()

from random import sample

print("抽奖开始\n一等奖设置 1 名,二等奖设置 2 名,三等奖设置 3 名\n共 6 个获奖名额")

def get_info(num):
book = sample(range(1,num+1),num)
sd = {}
check = []
for i,j in enumerate(book):
print("第{}名学生的抽奖号码为:{}".format(i+1,j))
num_sd,tmp = None,True
while tmp:
num_sd = input("请输入八位学号:")
if len(num_sd) != 8:
print("学生学号必须为八位数! 需要重新输入!")
elif num_sd.isdigit():
num_sd = int(num_sd)
if num_sd in check:
print("输入学号重复,需要重新输入!")
continue
check.append(num_sd)
tmp = False
name = input("请输入学生姓名:")
sd[i+1] = (name,num_sd)
return sd

def show_info(sd,bingo):
print("参与抽奖学生与抽奖信息如下:")
for i in sd.keys():
print("{}:\n{}".format(i,sd[i]))
print("中奖号码如下:\n一等奖号码为:{}\n二等奖号码为:{} {}\n三等奖号码为:{} {} {}"
.format(bingo[0],bingo[1],bingo[2],bingo[3],bingo[4],bingo[5]))

def main():
num = input("输入学生人数\n")
if not num.isdigit():
print("请输入十进制数字")
return
num = int(num)
if num < 6:
print("学生人数不能小于6人")
return
sd = get_info(num)
# 生成一个获奖结果列表,如不需要这换成1-6的列表
bingo = sample(range(1,7),num)
show_info(sd,bingo)

if name == 'main':
main()
摸鱼结束