我必须修改函数gp,以便通过加0.3或减去0.3来处理+和 - 等级。例如,B +值为3.3点,C-值为1.7点。
实施例。
>>> gp('A-')
3.7
>>>gp('B+')
3.3
建议是我可以添加一堆elif子句来分别测试每个等级,但类似的设计是使用对s.startswith的调用来计算字母等级的值,然后使用s.endswith来看你是否应该增加或减去0.3分。
到目前为止,这就是我所拥有的。
def gp(s):
A = 4
return A
B = 3
return B
C = 2
return C
D = 1
return D
F = 0
return f
答案 0 :(得分:3)
您可以在字典中存储成绩和后缀的数值,而不是一系列if/elif
语句。此外,您不必使用startswith
或endswith
,您可以在检查长度后使用s[0]
和s[1]
来获取字符串中的第一个或第二个字符。你也可以使用s[1:]
来获取从1
位置开始的所有内容,即使它是空的。
grades = {'A': 4, 'B': 3, 'C': 2, 'D': 1, 'F': 0}
signs = {'+': 0.3, '-': -0.3, '': 0}
def gp(s):
return grades[s[0]] + signs[s[1:]]
>>> gp("A+")
4.3
>>> gp("C-")
1.7
>>> gp("F")
0
答案 1 :(得分:2)
gp
功能有几个问题。
虽然可以枚举它们,但我建议您阅读以下资源:
准备好之后,我强烈建议您使用词典存储映射。这是一个例子:
grade_dict = dict(zip('ABCDF', (4, 3, 2, 1, 0)))
sign_dict = dict(zip('-+', (-0.3, 0.3)))
def gp(s):
grade, *sign = s
if sign:
return grade_dict[grade] + sign_dict[sign[0]]
else:
return grade_dict[grade]
res = gp('A-') # 3.7
编辑:我的学校教育没有涉及GPA,所以我没有抓住这个。如果您需要上限为4.0,则可以使用此修改:
def gp(s):
grade, *sign = s
if sign:
res = grade_dict[grade] + sign_dict[sign[0]]
else:
res = grade_dict[grade]
return max(res, 4.0)
答案 2 :(得分:1)
我的建议是使用一本字典来说明每个特定年级会得到多少分。使用字典有点像switch
语句的Python等价物,通常认为比长if/elif/else
链更惯用。 (我的回答是假设您使用的是标准4.0 GPA计算量表。如果没有,显然可以根据您的需要进行更改。)
grade_to_points = {
'A+': 4.0,
'A': 4.0,
'A-': 3.7,
'B+': 3.3,
'B': 3.0,
...
}
def gp(grade):
points = grade_to_points.get(grade)
if points is None:
raise ValueError('{:r} is not a valid grade!'.format(grade))
答案 3 :(得分:0)
你应该使用词典
def function(grade)
dict = {'A':4, 'B':3, 'C':2, 'D':1, 'F':0}
if grade[1] == '+':
return dict[grade[0]]+0.3
elif grade[1] == '-':
return dict[grade[0]] - 0.3
然后根据符号
添加或减去0.3答案 4 :(得分:0)
另一种字典(哈希)方法。
@Service
@Transactional
public class ExampleService {
private ExampleEntityRepository repository;
private ApplicationEventPublisher applicationEventPublisher;
public void exampleMethod() {
repository.save(new ExampleEntity("entity"));
applicationEventPublisher.publishEvent(new EventA(this));
}
}
//==================================================
@Service
@Transactional
public class EventAListener {
private ExampleEntityRepository repository;
private ApplicationEventPublisher applicationEventPublisher;
@TransactionalEventListener(value = EventA.class, phase = TransactionPhase.BEFORE_COMMIT)
public void handle(EventA event) {
repository.save(new ExampleEntity("entityA"));
applicationEventPublisher.publishEvent(new EventB(this));
}
}
//==================================================
@Service
@Transactional
public class EventBListener {
private ExampleEntityRepository repository;
@TransactionalEventListener(value = EventB.class, phase = TransactionPhase.BEFORE_COMMIT)
public void handle(EventB eventB) {
repository.save(new ExampleEntity("entityB"));
}
}
//==================================================
// Alternative EventAListener version
@Service
@Transactional
public class EventAListener {
private ExampleEntityRepository repository;
@TransactionalEventListener(value = EventA.class, phase = TransactionPhase.BEFORE_COMMIT)
public EventB handle(EventA event) {
repository.save(new ExampleEntity("entityA"));
return new EventB(this);
}
}