class Student: def __init__(self): self.age = None self.gender = None self.scores = {'Chinese': None, 'Math': None, 'English': None} def set_age(self, age): if not isinstance(age, int) or age < 0: raise ValueError('Invalid age') self.age = age def set_gender(self, gender): if gender not in ['male', 'female']: raise ValueError('Invalid gender') self.gender = gender def set_score(self, subject, score): if subject not in self.scores: raise ValueError('Invalid subject') if not isinstance(score, int) or score < 0 or score > 100: raise ValueError('Invalid score') self.scores[subject] = score # 主函数 try: s = Student() age = int(input('请输入学生年龄:')) s.set_age(age) gender = input('请输入学生性别(male或female):') s.set_gender(gender) for subject in ['Chinese', 'Math', 'English']: score = int(input(f'请输入{subject}成绩:')) s.set_score(subject, score) print('学生信息设置成功!') except ValueError as e: print('学生信息设置失败:', e)
时间: 2024-03-25 19:35:31 浏览: 47
这段代码已经很简洁和易读了,但还有一些可以进行优化的地方:
1. 可以使用 `@property` 装饰器和 `@setter` 装饰器来简化代码,使得调用更加方便。
2. 可以在 `set_score` 函数中使用一个字典,将科目名称与对应的分数作为键值对存储,这样可以减少代码重复。
3. 可以在输入时对数据进行校验,如果输入的不是数字或者不在指定范围内,可以直接提示输入错误,而不是在 `set_score` 函数中在进行校验。
以下是经过优化的代码:
```python
class Student:
def __init__(self):
self._age = None
self._gender = None
self._scores = {'Chinese': None, 'Math': None, 'English': None}
@property
def age(self):
return self._age
@age.setter
def age(self, value):
if not isinstance(value, int) or value < 0:
raise ValueError('Invalid age')
self._age = value
@property
def gender(self):
return self._gender
@gender.setter
def gender(self, value):
if value not in ['male', 'female']:
raise ValueError('Invalid gender')
self._gender = value
@property
def scores(self):
return self._scores
def set_score(self, subject, score):
if subject not in self._scores:
raise ValueError('Invalid subject')
self._scores[subject] = score
def input_score(subject):
while True:
try:
score = int(input(f'请输入{subject}成绩:'))
if score < 0 or score > 100:
print('分数必须在0-100之间')
continue
return score
except ValueError:
print('请输入数字')
# 主函数
try:
s = Student()
s.age = int(input('请输入学生年龄:'))
s.gender = input('请输入学生性别(male或female):')
for subject in ['Chinese', 'Math', 'English']:
score = input_score(subject)
s.set_score(subject, score)
print('学生信息设置成功!')
except ValueError as e:
print('学生信息设置失败:', e)
```
经过优化后,代码更加简洁易读,使用 `@property` 装饰器和 `@setter` 装饰器来简化了代码,将检验数据类型和数据范围的代码放在了输入函数中,使得代码结构更加清晰。
阅读全文