1. 使用列表推导式,生成 2018-2021 四个年级,每个年级四个专业(计算机、机械、自动化和电子信息),每个专业三个班级,每个班级 45 人的对应学号(如 2019010205),共计 2160 个学生的学号。

创建函数处理输入的年级、专业编号、班级编号、学生序号,生成返回学号
使用列表推导式,创建一个 2160 大小的学号列表

def create_id(g:int, m:int, c:int, s:int)->str:
    """
    功能:
        生成和返回学生学号
    参数:
        g:int 年级编号 2018-2021
        m:int 专业编号 1-4
        c:int 班级编号 1-3
        s:int 学生编号 1-45
    """
    _s = str(s)
    if s < 10: _s = '0' + _s
    stu_id = str(g) + '0' + str(m) + '0' + str(c) + _s
    return stu_id
# print(create_id(2019, 1, 1, 2))
# print(create_id.__doc__)
stu_id = [create_id(g,m,c,s) for g in range(2018, 2022)
                             for m in range(1, 5)
                             for c in range(1, 4)
                             for s in range(1, 46)]
print(stu_id[0:20])

运行结果

['2018010101', '2018010102', '2018010103', '2018010104', 
 '2018010105', '2018010106', '2018010107', '2018010108', 
 '2018010109', '2018010110', '2018010111', '2018010112', 
 '2018010113', '2018010114', '2018010115', '2018010116',
 '2018010117', '2018010118', '2018010119', '2018010120']

2. 使用列表推导式,生成以上2160个学生的班级名称(如计算机 2018-01班、电子信息 2020-02 班),每个班级的班级名称应有 45 个,注意产生的各个班级名称应和以上生成的学号顺序相对应。

# 装有专业名字的字典,可以将学号中代表专业的部分作为索引,获取专业名
major = {'01': '计算机',
         '02': '机械',
         '03': '自动化',
         '04':'电子信息'}
def create_cname(s_id:str)->str:
    """
    功能:
        通过学号,生成和返回班级名
    参数:
        s_id:str 学号
    """
    c_name = major[s_id[4:6]] + s_id[0:4] + '-' + s_id[6:8] + '班'
    return c_name
# print(create_cname('2019010234'))

cl_name = [create_cname(s_id) for s_id in stu_id]
print(cl_name[0:20])

运行结果:

['计算机2018-01班', '计算机2018-01班', '计算机2018-01班', '计算机2018-01班', 
 '计算机2018-01班', '计算机2018-01班', '计算机2018-01班', '计算机2018-01班', 
 '计算机2018-01班', '计算机2018-01班', '计算机2018-01班', '计算机2018-01班',
 '计算机2018-01班', '计算机2018-01班', '计算机2018-01班', '计算机2018-01班', 
 '计算机2018-01班', '计算机2018-01班', '计算机2018-01班', '计算机2018-01班']

3. 导入 faker 库,分别使用列表推导式生成 2160 个学生的姓名以及 2160 个学生的家庭住址。

使用faker库伪造姓名和地址

from faker import Faker
# 
faker = Faker(locale='zh_CN')

stu_name = [faker.name() for i in range(2160)]
stu_address = [faker.address() for i in range(2160)]
print(stu_name[0:20])
print(stu_address[0:20])

运行结果:

['牟金凤', '蒋兵', '韩雪', '邱冬梅', '李峰', '张建军',
 '袁博', '侯帆', '何勇', '苏淑兰', '王桂香', '聂颖', '王秀梅',
 '曾桂芝', '彭佳', '李杨', '刘玉', '张霞', '罗畅', '赵霞']
['香港特别行政区鹏市高明嘉禾路T座 300191', '北京市阳县安次张路G座 652555',
 '河北省嘉禾县沈北新哈尔滨街J座 177367', '北京市西宁县城北夏路U座 403085',
 '甘肃省沈阳县江北长沙路M座 277928', '河南省丽丽市滨城杨路C座 901891',
 '广西壮族自治区银川市涪城南昌街t座 878943', '河南省冬梅市东城南京路k座 947475', 
 '重庆市岩市高坪成都街z座 406678', '贵州省柳州县魏都熊街x座 613707', 
 '贵州省柳州市璧山合肥街B座 441756', '广西壮族自治区西安县长寿王街W座 521388', 
 '浙江省太原县璧山西宁路g座 479990', '台湾省天津县梁平合山街J座 808492', 
 '山东省梧州县上街淮安街L座 930328', '重庆市长春县西峰曹路t座 512091', 
 '甘肃省北镇市高明天津路f座 614427', '广西壮族自治区雷县闵行潮州街o座 703110', 
 '安徽省梧州县南长焦街f座 588917', '江西省超市海陵潜江街J座 230789']

4. 将以上四组数据生成一个二维列表数据(四列 2160 行),每一行为一个学生的信息,四列信息分别是学号、班级名称、姓名和家庭住址。

stu_info = [[s_id, c_name, s_name, s_address]
            for s_id, c_name, s_name, s_address in zip(stu_id,cl_name,stu_name,stu_address)]
print(stu_info[0:10])

运行结果:

[['2018010101', '计算机2018-01班', '牟金凤', '香港特别行政区鹏市高明嘉禾路T座 300191'], 
 ['2018010102', '计算机2018-01班', '蒋兵', '北京市阳县安次张路G座 652555'],   
 ['2018010103', '计算机2018-01班', '韩雪', '河北省嘉禾县沈北新哈尔滨街J座 177367'], 
 ['2018010104', '计算机2018-01班', '邱冬梅', '北京市西宁县城北夏路U座 403085'], 
 ['2018010105', '计算机2018-01班', '李峰', '甘肃省沈阳县江北长沙路M座 277928'], 
 ['2018010106', '计算机2018-01班', '张建军', '河南省丽丽市滨城杨路C座 901891'], 
 ['2018010107', '计算机2018-01班', '袁博', '广西壮族自治区银川市涪城南昌街t座 878943'], 
 ['2018010108', '计算机2018-01班', '侯帆', '河南省冬梅市东城南京路k座 947475'], 
 ['2018010109', '计算机2018-01班', '何勇', '重庆市岩市高坪成都街z座 406678'], 
 ['2018010110', '计算机2018-01班', '苏淑兰', '贵州省柳州县魏都熊街x座 613707']]

5. 导入 faker,使用列表推导式生成 2160 个学生的手机号码,试将这些手机号码加入到已有的二维数据中,每个学生分配一个手机号码。

stu_phone = [faker.phone_number() for i in range(2160)]
stu_infor = [stu_info[i].append(stu_phone[i]) for i in range(2160)]
print(stu_info[0:10])

运行结果:

[['2018010101', '计算机2018-01班', '牟金凤', '香港特别行政区鹏市高明嘉禾路T座 300191', '13736725755'],
 ['2018010102', '计算机2018-01班', '蒋兵', '北京市阳县安次张路G座 652555', '18785240175'],
 ['2018010103', '计算机2018-01班', '韩雪', '河北省嘉禾县沈北新哈尔滨街J座 177367', '13109216954'], 
 ['2018010104', '计算机2018-01班', '邱冬梅', '北京市西宁县城北夏路U座 403085', '15771844585'],
 ['2018010105', '计算机2018-01班', '李峰', '甘肃省沈阳县江北长沙路M座 277928', '15644470860'], 
 ['2018010106', '计算机2018-01班', '张建军', '河南省丽丽市滨城杨路C座 901891', '14734815165'], 
 ['2018010107', '计算机2018-01班', '袁博', '广西壮族自治区银川市涪城南昌街t座 878943', '18210125717'], 
 ['2018010108', '计算机2018-01班', '侯帆', '河南省冬梅市东城南京路k座 947475', '13467338350'], 
 ['2018010109', '计算机2018-01班', '何勇', '重庆市岩市高坪成都街z座 406678', '18065937563'], 
 ['2018010110', '计算机2018-01班', '苏淑兰', '贵州省柳州县魏都熊街x座 613707', '13527598104']]

1-5. 完整代码

python添加学生信息 python学生信息表_python


6. 某学院计算机专业有四个年级(2018,2019,2020,2021),每个年级有三个自然班(O1,02,03),每个自然班有35名学生,每个学生的信息包括:学号(stid)、姓名(stname)、班级名(bjname),及高等数学(math)、英语(eng)、计算机(compu)三门课程的成绩,设计一个字典数据对象stdic包含四个年级所有自然班的学生,要求能够通过字典键-值的映射,可以直接访问任一自然班任一学生的相关数据信息。
数据源:要求导入faker及random库,通过列表推导式生成学号、姓名、班级名,每名学生的学号为10位数字,1-4位是入学年度,5-6位是学院专业编号,7-8位是同年级专业班级编号,9-10位是班级学生的序号。三门课程的成绩可使用random库是的子库从[40,100]范围内随机抽取。

import random
import copy
from faker import Faker

class grade(): #成绩类
    def __init__(self):
    	"""
    	初始化函数:随机生成数学、英语、计算机三个科目的成绩
    	"""
        self._math = random.randint(40, 100)
        self._eng = random.randint(40, 100)
        self._compu = random.randint(40, 100)
    def putinfor(self)->None:
    	"""
    	输出成绩
    	"""
        print('math: ', self._math)
        print('English: ', self._eng)
        print('Computer: ', self._compu)

class stu(): #学生类
    def __init__(self, nianji:int, majorid:int, bjname:int, xuhao:int):
    	"""
    	初始化函数:处理输入的年级、专业编号、班级编号、学生序号,生成返回学号
    	"""
        if xuhao<10: _xuhao = '0' + str(xuhao)
        else: _xuhao = str(xuhao)
        _bjname = '0' + str(bjname)
        self._stid = str(nianji) + str(majorid) + _bjname + _xuhao
        fake = Faker(locale='zh_CN')
        self._name = fake.name()
        self._bjname = _bjname
        self._grade = grade()
    def putinfor(self)->None:
    	"""
    	输出学生信息
    	"""
        print('stid: ', self._stid)
        print('name: ', self._name)
        print('bjname: ', self._bjname)
        self._grade.putinfor()

def _create(nianji:int, bjname:int)->list:
    return [stu(nianji, 89, bjname, i) for i in range(1, 36)]

def create()->dict:
	"""
	创建返回学生字典
	"""
    dict_stu = {}
    temp = {}
    for y in range(2018, 2022):
        for i in range(1, 4):
            temp[i] = {k:v for k, v in zip(range(1, 36),_create(y, i))}
        dict_stu[y] = copy.deepcopy(temp)
    return dict_stu

s = create()
# 以年级班级和学生编号为索引值,查询学生信息表中的元素
print(s[2021][3][1].putinfor())

运行结果:

stid:  2021890301
name:  马芳
bjname:  03
math:  100
English:  76
Computer:  87
None