How to replace many 'if…elif' statements in Python?
本问题已经有最佳答案,请猛点这里访问。
我用python编写了一些代码,其中有很多if..elif语句。我知道代码样式可能被认为是坏的,我想改进它。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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"语句?
你可以这样做:
1 | print(((num - 1) // 5) + 2) |
例如,当
1 2 3 4 5 | ((num - 1) // 5) + 2 ((20 - 1) // 5) + 2 (19 // 5) + 2 3 + 2 5 |
一般来说…不确定。如果你说的是一个完全武断的if-elif-else结构,那么我会说不,至少在某种程度上不会有助于可读性。事实上,我刚才为您的具体示例给出的答案甚至可能对可读性没有帮助,所以我不确定在一般情况下您对它的期望有多高。
您可以通过删除每个条件的两个
1 2 3 4 5 6 7 8 | num=int(input('please input a number: ')) if num<=0: print('1') elif num<=5: print('2') elif num<=10: print('3') |
对分图书馆也可以在这种情况下使用,而且也非常有效。文档给出了考试成绩边界的使用示例。如果使用非线性边界,这种方法将使其更加灵活。
1 2 3 4 5 6 7 8 | 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)) |
注意,这只在Python2.7中进行了测试。
1 2 3 4 | 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])) |
对于类似这样的简单示例,在不同的情况下适合一个清晰的模式,最好的方法是像redrobohood建议的那样,完全删除条件(稍微修改以支持下界),例如。
1 | print('%s' % max((num - 1) // 5 + 2, 1)) |
如果您希望稍微更一般一些,并且允许不遵循输入模式的print语句,那么可以使用python字典:
1 2 3 4 5 | # 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') |
然而,总有一些时候你不能像这样把它简单化,对于那些我认为如果其他的说法是好的。
这是另一种方法:
1 2 3 4 5 | 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