用什么样的python方式写一个长if-else语句?
虽然我以前有Java方面的经验,但我对Python还是很陌生 我有以下代码将分数转换为间隔增量(作为我正在实施的间隔重复系统(SRS)程序的一部分)。这段代码看起来很难看,可读性不强。通常我会在Java中使用switch语句。但是在python中,我找不到一个等价物。因此,我编写了这段代码来生成结果。但我想借此机会学习使用更多python方法实现相同输出的不同选项。我将感谢任何帮助,即使它们是指向我可以阅读以改进此代码的资源的指针用什么样的python方式写一个长if-else语句?,python,Python,虽然我以前有Java方面的经验,但我对Python还是很陌生 我有以下代码将分数转换为间隔增量(作为我正在实施的间隔重复系统(SRS)程序的一部分)。这段代码看起来很难看,可读性不强。通常我会在Java中使用switch语句。但是在python中,我找不到一个等价物。因此,我编写了这段代码来生成结果。但我想借此机会学习使用更多python方法实现相同输出的不同选项。我将感谢任何帮助,即使它们是指向我可以阅读以改进此代码的资源的指针 # Convert score into an inter
# Convert score into an interval delta
if score == 0: # Perfect page
intervalDelta = +3
elif score == 1: # 1 Word Mistake
intervalDelta = +2
elif score <= 3: # 3 Word Mistakes
intervalDelta = +1
elif score == 4: # 1 Line Mistake
intervalDelta = 0
elif score <= 8: # 2 Line Mistakes
intervalDelta = -1
elif score <= 12: # 3 Line Mistakes
intervalDelta = -2
elif score <= 20: # 5 Line Mistakes
intervalDelta = -3
elif score <= 30: # 7.5 Line Mistakes - Half a page
intervalDelta = -5
else: # More than half a page
intervalDelta = -7
#将分数转换为区间增量
如果得分=0:#完美页面
间隔增量=+3
elif分数==1:#1个单词错误
间隔增量=+2
elif score我不认为长的if
语句不可读,尽管我会改为使用官方的说法是switch语句很容易用if语句完成,因此编写长if语句是Python的方式。并记录switch语句被省略的原因。在实践中,虽然有几个。最常见的是对开关的字典方法
def case_a():
打印('正在执行案例A')
def case_b():
打印('执行案例B')
def case_else()
打印('正在执行默认情况')
def dict_开关(参数):
开关={
“a”:案例a
“b”:案例b
}
返回开关.get(参数、大小写或其他)()
dict_开关(x)
另一种方法是将所有条件逻辑保留在一个类中,但我发现只有当存在大量条件逻辑时才有必要这样做
类切换器:
定义数字\u到\u方法\u到\u字符串(自身、参数):
“分派方法”
#在方法\u名称前加上“number\u”,因为方法名称
#不能以整数开头。
方法\u name='number\u'+str(参数)
#从“self”获取方法。默认为lambda。
method=getattr(self,方法名称,lambda:“nothing”)
#在返回方法时调用该方法
返回方法()
def编号_0(自身):
返回“零”
def编号_1(自身):
返回“一”
def编号_2(自身):
返回“2”
然而,在您的情况下,我认为@ashasr方法是最干净的。我的意思是,这段代码对我来说非常可读。我唯一的建议是使用python命名约定,因此interval_delta
而不是intervalDelta
。这对我来说似乎很好,没有什么“错误”。@juanpa.arrivillaga非常感谢您让我意识到我没有使用python命名约定。我意识到我继承了我早期使用Java的工作中的约定。如果这个答案总结了相关的信息,而不是仅仅依赖于链接,我会投赞成票…@infosmith,非常感谢你提供了两个切换选项。我问这个问题的目的是了解更多关于python的知识,我很高兴了解实现switch的字典方法,以及getattr()函数。然而,我不确定如何将这个想法转化为我的案例,在我的案例中,测试的条件是不平等的-你能给我一些提示吗?哇-实现长if-else逻辑的不同方式。我很高兴看到这种想法。
from math import inf
SCORE_DELTAS = (
(0, +3),
(1, +2),
(3, +1),
(4, +0),
(8, -1),
(12, -2),
(20, -3),
(30, -5),
(inf, -7),
)
def score_to_delta(score):
for bound, delta in SCORE_DELTAS:
if score <= bound:
return delta