【问题标题】:How to simplify a repetitive function如何简化重复功能
【发布时间】:2019-09-27 01:27:12
【问题描述】:

有没有人能想到的方法来简化这个功能?我发现其中的大部分内容都是重复的,但很难想出一种让它更 Python 或更简洁的方法。对 python 来说相对较新,所以我会很感激任何建议。

def colorize(n):
    if n in range(0, 10):
        return selection[-1]
    elif n in range(10, 20):
        return selection[-2]
    elif n in range(20, 30):
        return selection[-3]
    elif n in range(30, 40):
        return selection[-4]
    elif n in range(40, 50):
        return selection[-5]
    elif n in range(50, 60):
        return selection[-6]
    elif n in range(60, 70):
        return selection[-7]
    elif n in range(70, 80):
        return selection[-8]
    elif n in range(80, 90):
        return selection[-9]
    elif n in range(90, 100):
        return selection[-10]
    else:
        return None

【问题讨论】:

    标签: python function if-statement repeat code-readability


    【解决方案1】:

    当您有一堆重复的代码并且很难理解如何删除重复时,一个好的技巧是一点一点地修改这些片段,以便它们慢慢开始彼此相似。如果你做得对,你可以让它们完全匹配。

    它可能看起来很冗长,但这项技术的好处是它不需要任何大的洞察力。您可以通过微小的增量更改实现目标,而无需盯着代码和认真思考

    让我告诉你我的意思。


    第 1 步: 将所有 elifs 变成直的 ifs 并删除 else。这使它们更明显地相同,您应该看到它不会改变代码的行为。

    if n in range(0, 10):
        return selection[-1]
    if n in range(10, 20):
        return selection[-2]
    if n in range(20, 30):
        return selection[-3]
    if n in range(30, 40):
        return selection[-4]
    if n in range(40, 50):
        return selection[-5]
    if n in range(50, 60):
        return selection[-6]
    if n in range(60, 70):
        return selection[-7]
    if n in range(70, 80):
        return selection[-8]
    if n in range(80, 90):
        return selection[-9]
    if n in range(90, 100):
        return selection[-10]
    
    return None
    

    第 2 步:根据一些共同值计算数字。我们想提取一个新变量i,这样每个案例都与其他案例完全一样。如果我们将i 设置为 1,然后是 2,然后是 3,等等,我们可以这样做。

    让我们考虑第一种情况:

    if n in range(0, 10):
        return selection[-1]
    

    如果 i 是 1,那么 10 是 i*10-1-i,0 是 (i-1)*10

    i = 1
    if n in range((i-1)*10, i*10):
        return selection[-i]
    

    我们可以对第二种情况做同样的事情。

    if n in range(10, 20):
        return selection[-2]
    

    同样的公式也有效。我们所要做的就是将i 更改为2!

    i = 2
    if n in range((i-1)*10, i*10):
        return selection[-i]
    

    冲洗并重复 10 次,我们就得到了这个美丽:

    i = 1
    if n in range((i-1)*10, i*10):
        return selection[-i]
    i = 2
    if n in range((i-1)*10, i*10):
        return selection[-i]
    i = 3
    if n in range((i-1)*10, i*10):
        return selection[-i]
    i = 4
    if n in range((i-1)*10, i*10):
        return selection[-i]
    i = 5
    if n in range((i-1)*10, i*10):
        return selection[-i]
    i = 6
    if n in range((i-1)*10, i*10):
        return selection[-i]
    i = 7
    if n in range((i-1)*10, i*10):
        return selection[-i]
    i = 8
    if n in range((i-1)*10, i*10):
        return selection[-i]
    i = 9
    if n in range((i-1)*10, i*10):
        return selection[-i]
    i = 10
    if n in range((i-1)*10, i*10):
        return selection[-i]
    
    return None
    

    第 3 步:现在我们有 10 个相同的 if 语句,应该清楚如何将整个事情变成一个循环。从i=1 循环到i=10,我们就搞定了。

    for i in range(1, 11):
        if n in range((i-1)*10, i*10):
            return selection[-i]
    
    return None
    

    我们去吧!所有重复的东西都消失了。


    第 4 步:如果您想更进一步,可以尝试计算与 n 对应的 i 的值,而不是采用上面的猜测和检查方法。我会把它作为练习留给你(或其他答案)。这是一个很好的优化,但它与我刚刚在这里提出的重构类型不同。

    【讨论】:

      【解决方案2】:

      要在 0 到 10 的范围内获得 1,在 10 到 20 的范围内获得 2,您可以使用 Python 3 的整数除法。

      x = n // 10 + 1
      

      然后你可以否定它并将它用于你的索引

      def colorize(n):
          if 0 <= n < 100:
              return selection[-(n // 10 + 1)]
      

      如果您没有从返回 None 的函数中返回任何内容,则您不必明确地返回它

      【讨论】:

      • 我猜if 0 &lt;= n &lt;= 100:比较合适
      • @Marat 你说得对,这更合适。虽然在最初的问题中,如果 n 为 100,则将返回 None
      【解决方案3】:

      简化重复函数的明显方法是使用循环:

      def colorize(n):
          for i in range(0,10):
              if n in range(i*10, (i+1)*10):
                  return selection[-i+1]
          return None
      

      我确信有一种更好的方法可以简化您的特定任务,但是当您看到这种重复的代码时,应该牢记循环是一种通用模式。

      【讨论】:

        【解决方案4】:

        试试这个:

        def colorize(n):
            for i in range(0,11):
                if n in range((i*10),(i*10)+10):
                    return selection[-(i+1)]
        

        【讨论】:

          【解决方案5】:

          你可以试试这样的,

          def colorize(n):
              if n in range(0,100):
                  return selection[-1*(n//10+1)]
          

          【讨论】:

          • 在 Python 3 中是 O(1)。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-10-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多