我在Python中编写了许多带有'if..elif'语句的代码。我知道代码风格可能被认为是坏的,我想改进它。
num = int(input('please input a number: '))
if num <= 0:
print('1')
elif 0 < num <= 5:
print('2')
elif 5 < num <= 10:
print('3')
elif 10 < num <= 15:
print('4')
elif 15 < num <= 20:
print('5')
elif 20 < num <= 25:
print('6')
我想知道如何用其他解决方案替换这么多'if..elif'语句?
答案 0 :(得分:8)
你可以这样做:
getAllEtudiant()
print(((num - 1) // 5) + 2)
为20时的示例:
num
在一般情况下......不确定。如果你在谈论完全随意的 if-elif-else构造,那么我会说不,至少不会以一种有助于提高可读性的方式。事实上,我刚才为你的具体例子给出的答案可能甚至没有帮助提高可读性,所以我不确定你在一般情况下对此有多好。
答案 1 :(得分:2)
您可以通过删除每个条件的两个n=4
B <- matrix(rep(0,n*n), n)
dimnames(B) <- list(letters[1:n],letters[1:n])
B[lower.tri(B)] <- tsv$value
B[upper.tri(B)]=tsv$value
B
检查之一来缩短代码,如此
<
答案 2 :(得分:1)
对于这样的简单示例,其中不同的情况适合清晰的模式,最好的事情就像RedRoboHood建议你完全删除条件(稍微修改以支持下限),例如。
print('%s' % max((num - 1) // 5 + 2, 1))
如果你想稍微更一般,并允许不遵循输入模式的print语句,你可以使用python字典:
# what to print if num is less than the number but greater than the previous
mapping = {0:'1', 5:'2', 10:'3', 15:'4', 20:'5', 25:'6'}
# clamp the number to the upper bound of the desired range
clamped_num = 5 * max((num - 1) // 5, -1) + 5
print(mapping[clamped_num] if clamped_num in mapping else 'Bad value')
然而,总会有时候你不能像这样把它煮沸,对于那些我认为如果 - 其他陈述没问题。
答案 3 :(得分:1)
num = int(input('please input a number: '))
if num < 26:
print(1 + len([i for i in [0, 5, 10, 15, 20, 25] if i < num]))
答案 4 :(得分:1)
bisect库也可以在这种情况下使用,也非常有效。该文档提供了考试等级边界的使用示例。如果使用非线性边界,这种方法会使其更加灵活。
import bisect
def boundaries(num, breakpoints=[0, 5, 10, 15, 20, 25], result='1234567'):
i = bisect.bisect(breakpoints, num-1)
return result[i]
num = int(input('please input a number: '))
print(boundaries(num))
请注意,这仅在Python 2.7中进行了测试。
答案 5 :(得分:0)
这是另一种方法:
a = { '1': (range(1,6)), '2': (range(6,11)), '3': (range(11,16)), '4':(range(16,21)), '5':(range(21,26))}
num=int(input('please input a number: '))
b = {k:v for k,v in a.items() if num in v}
c = b.keys()
print c[0]
Python3中的 print(c[0])