【问题标题】:How to replace many 'if...elif' statements in Python? [duplicate]如何在 Python 中替换许多 'if...elif' 语句? [复制]
【发布时间】:2015-09-14 17:20:59
【问题描述】:

我在 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”语句?

【问题讨论】:

  • @Huey 我不同意。提问者没有表明任何案件的执行频率高于其他案件。
  • 好吧,how to replace much 'if…else' in python 被标记为重复。
  • 如果您正在处理相等测试(x==1,x==2),那么可以使用函数字典。不适用于此处,但在某些条件下,它是大 elif 的优雅替代品。
  • 我不得不说我会使用stackoverflow.com/questions/17166074/… 解决方案,所以我也会将其标记为重复。

标签: python python-3.x


【解决方案1】:

你可以这样做:

print(((num - 1) // 5) + 2)

num 为 20 时的示例:

((num - 1) // 5) + 2
((20 - 1) // 5) + 2
(19 // 5) + 2
3 + 2
5

一般情况下...不确定。如果您在谈论 完全任意 if-elif-else 构造,那么我会说不,至少不会以有助于可读性的方式。事实上,我刚刚为您的具体示例给出的答案可能甚至对可读性没有帮助,所以我不确定在一般情况下您对它的期望有多大。

【讨论】:

    【解决方案2】:

    对于像这样的简单示例,其中不同的情况符合清晰的模式,最好的方法是像 RedRoboHood 建议的那样,您完全删除条件(稍微修改以支持下限),例如

    print('%s' % max((num - 1) // 5 + 2, 1))
    

    如果您想稍微通用一点并允许不遵循输入模式的打印语句,您可以使用 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')
    

    然而,总有一些时候你不能像这样把它归结起来,我认为 if-else 语句很好。

    【讨论】:

      【解决方案3】:
      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】:

        在这种情况下也可以使用 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))
        

        【讨论】:

          【解决方案5】:

          您可以通过删除每个条件的两个&lt; 检查之一来稍微缩短代码,就像这样

          num=int(input('please input a number: '))
          
          if num<=0:
              print('1')
          elif num<=5:
              print('2')
          elif num<=10:
              print('3')
          

          【讨论】:

          • 这是一个有效的观点,尽管我认为这里的主要问题是 if else 结构本身。
          【解决方案6】:

          这是另一种方法:

          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])

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-07-26
            • 1970-01-01
            • 2022-11-23
            • 1970-01-01
            • 1970-01-01
            • 2020-10-28
            • 2015-01-16
            • 2017-07-03
            相关资源
            最近更新 更多