鱼C论坛

 找回密码
 立即注册
查看: 3046|回复: 7

[已解决]python小问题求解

[复制链接]
发表于 2020-11-2 11:35:28 | 显示全部楼层 |阅读模式
20鱼币
设计一个学生类(姓名,语文成绩,数学成绩, 班级),

方法:初始化(成绩默认0);查询各科成绩;统计每个学生的平均分;按平均分进行排序;



构造学生对象,

功能:

学生可以根据自己的姓名,查询自己成绩及排名情况;

对于有加分项的学生,可以在平均分的基础上加(1~5)分。
最佳答案
2020-11-2 11:35:29
虽然题意有点模糊,我按自己的理解写了,基本可以实现各个方法和功能。
代码如下:
class Student:
    global records
    records = {}
    def __init__(self, name='某同学', yuwen=0, math=0, classNo='未分班'):
        self.name = name
        self.yuwen = yuwen
        self.math = math
        self.classNo = classNo
        self.records = records
        records[name] = [yuwen, math, classNo]
        
    def lookup(self, name):
        if name in records:
            yw = records[name][0]
            mt = records[name][1]
            return '{} 的各科成绩为:\n语文:{}\n数学:{}'.format(name, yw, mt)
        else:
            return '------查无此同学。'

    def avg_sc(self, name):
        if name in records:
            avg = (records[name][0] + records[name][1])/2
            return avg
        else:
            return '------查无此同学。' 

    def ranking(self):
        name_list = list(records.keys()) # 必须加list转化(因为dict.keys()返回的是dict_keys对象不能用下标)
        avg_list = [self.avg_sc(name_list[i]) for i in range(len(records))]
        n_a = dict(zip(name_list, avg_list))
        # 按平均分排序(即按字典的values逆序排)
        rk = sorted(n_a.items(), key=lambda kv:(kv[1], kv[0]), reverse=True) 
        rk = [ list(t) for t in rk]
        for r in rk:
            r.insert(0, rk.index(r)+1) # 插入排名(从1开始)
        return rk
        
if __name__ == '__main__':
    stu = Student('张三', 90, 100, '一班')
    stu.records['李四'] = [80, 90, '二班']
    stu.records['王五'] = [90, 70, '三班']
    
    print(stu.records)
    print(stu.lookup('张三'))
    print(stu.lookup('李四'))
    print('%s 的平均分为:%.2f' % ('李四', stu.avg_sc('李四')))
    print(stu.lookup('Alice'))

    print('\n按平均分排名:')
    for r in stu.ranking():
        print(r)

最佳答案

查看完整内容

虽然题意有点模糊,我按自己的理解写了,基本可以实现各个方法和功能。 代码如下:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-2 11:35:29 | 显示全部楼层    本楼为最佳答案   
虽然题意有点模糊,我按自己的理解写了,基本可以实现各个方法和功能。
代码如下:
class Student:
    global records
    records = {}
    def __init__(self, name='某同学', yuwen=0, math=0, classNo='未分班'):
        self.name = name
        self.yuwen = yuwen
        self.math = math
        self.classNo = classNo
        self.records = records
        records[name] = [yuwen, math, classNo]
        
    def lookup(self, name):
        if name in records:
            yw = records[name][0]
            mt = records[name][1]
            return '{} 的各科成绩为:\n语文:{}\n数学:{}'.format(name, yw, mt)
        else:
            return '------查无此同学。'

    def avg_sc(self, name):
        if name in records:
            avg = (records[name][0] + records[name][1])/2
            return avg
        else:
            return '------查无此同学。' 

    def ranking(self):
        name_list = list(records.keys()) # 必须加list转化(因为dict.keys()返回的是dict_keys对象不能用下标)
        avg_list = [self.avg_sc(name_list[i]) for i in range(len(records))]
        n_a = dict(zip(name_list, avg_list))
        # 按平均分排序(即按字典的values逆序排)
        rk = sorted(n_a.items(), key=lambda kv:(kv[1], kv[0]), reverse=True) 
        rk = [ list(t) for t in rk]
        for r in rk:
            r.insert(0, rk.index(r)+1) # 插入排名(从1开始)
        return rk
        
if __name__ == '__main__':
    stu = Student('张三', 90, 100, '一班')
    stu.records['李四'] = [80, 90, '二班']
    stu.records['王五'] = [90, 70, '三班']
    
    print(stu.records)
    print(stu.lookup('张三'))
    print(stu.lookup('李四'))
    print('%s 的平均分为:%.2f' % ('李四', stu.avg_sc('李四')))
    print(stu.lookup('Alice'))

    print('\n按平均分排名:')
    for r in stu.ranking():
        print(r)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-11-2 11:36:54 | 显示全部楼层
是用Python实现的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-2 17:07:27 | 显示全部楼层
本帖最后由 小海灵 于 2020-11-2 17:10 编辑
class Student:
    def __init__(self , name , age , gender , phone , address , email):
        self.name = name
        self.age = age
        self.gender = gender
        self.phone = phone
        self.address = address
        self.email = email

    def all(self):
        print(self.name,self.age ,self.gender,self.phone,self.address,self.email)

contacts =[Student('tom', '18' , '男' , '12345678' , '市中心' , '123@.com'),
Student('jack', '20', '男', '4008208820', '城郊', '456@.com'),
Student('mary', '20', '女', '8848520', '城中村', '789@.com'),
Student('jerry' , '19' , '女' , '11235813' , 'xx小区' , '110@q.com')]

def find_by_name(name):
    for x in  contacts:
        if name == x.name:
           x.all()
           return
    print('查无此人')
def find_by_address(address):
    for x in contacts:
        if address == x.address:
            x.all()
            return
    print('查无此人')
def find_by_email(email):
    for x in contacts:
        if email == x.email:
            x.all()
            return
    print('查无此人')


x = input('请输入查找方式(英文):')
y = input('请输入关键字(变量):')

if x == 'name':
    find_by_name(y)
elif x == 'address':
    find_by_address(y)
elif x == 'email':
    find_by_email(y)
else:
    print('输入有误,无法查询')

以前写过类似的,我觉得实现出来差不多,你可以参考参考
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-2 17:25:26 From FishC Mobile | 显示全部楼层
这题目要求不完整吧,有点语焉不详
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-2 19:26:39 | 显示全部楼层
这题目太范了  不好回答    要回答完整  那么就是一个完整的系统了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-11-2 23:21:10 | 显示全部楼层
阿奇_o 发表于 2020-11-2 22:55
虽然题意有点模糊,我按自己的理解写了,基本可以实现各个方法和功能。
代码如下:

我想问一下,那个加分项怎么弄,就是如果有加分项的话,就平均分加上几分再进行排序(自己定义某个学生有没有加分项)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-2 23:41:43 | 显示全部楼层
段段努力秃头 发表于 2020-11-2 23:21
我想问一下,那个加分项怎么弄,就是如果有加分项的话,就平均分加上几分再进行排序(自己定义某个学生有 ...

可以在构造函数(初始化)时,
加多一个参数表示加分项即可,
如 def __init__(self, name='某同学', yuwen=0, math=0, classNo='未分班', jf=0): ....
然后在后面定义一个判断是否加分和实现加分的函数即可。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-18 00:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表