如何简化重复功能

时间:2019-09-27 01:27:12

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

有人可以想到简化此功能的方法吗?我发现其中很多都是重复性的,但是很难思考使其变得更pythonic或更干净的方法。对于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

5 个答案:

答案 0 :(得分:3)

要获得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,则不必明确地返回它

答案 1 :(得分:3)

当您有一堆重复的代码并且很难看到如何删除重复代码时,一个好技巧是一点一点地修改这些片段,使它们慢慢开始彼此相似。如果操作正确,则可以使它们彼此完全匹配。

这似乎有些困难,但是这种技术的好处是它不需要任何大的见识飞跃。您可以进行细微的,渐进式的更改,而无需凝视,而您的代码和很难思考

让我告诉你我的意思。


步骤1::将所有elif变成直线if,然后移除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步:如果您想更进一步,可以尝试计算与i相对应的n的值,而不必进行猜测和-检查上面的方法。我将其留给您练习(或寻求其他答案)。这是一个不错的优化,但与我在此处介绍的重构类型不同。

答案 2 :(得分:0)

简化重复功能的明显方法是使用循环:

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_FORM_URLENCODED));
headers.setAcceptCharset(Collections.singletonList(CharsetUtil.CHARSET_UTF_8));
FileSystemResource zipFile = new FileSystemResource(new File(file.getAbsolutePath()));
MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>();
Long time = System.currentTimeMillis();
parts.add("time", time);
parts.add("md5", SecureUtil.md5(time + "234234").toUpperCase());
parts.add("file", zipFile);
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(parts, headers);

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

答案 3 :(得分:0)

尝试一下:

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

答案 4 :(得分:0)

您可以尝试这样的事情

    'void Create_Instance()
      if (m_spRecordset != 0)
        if (mIsOpen)
        {
          m_spRecordset->Close();
          return;
        }
      HRESULT hresult = m_spRecordset.CreateInstance(__uuidof(Recordset));
      if (FAILED(hresult ))
      {
        // exception message
      }
    }

    long GetResults()
    {
        if (mIsOpen)
        {
            MoveToBeginning()
            return RowCount;
         }
         else
         { 
             Create_Instance();
         }
     try
     {
        HRESULT hresult = m_spRecordset->Open(_variant_t(MySelectStatement), 
                                         _variant_t( (IDispatch *) m_spConnection, true), 
                                         My_Cursor_Type, 
                                         My_Lock_Type, 
                                         My_Opt);
      RowCount = m_spRecordset->RecordCount;
      mIsOpen = true;

      }
      catch(const _com_error& error)
      {
         //******** throws DB_E_OBJECTOPEN exception *******
      }
      return RowCount;
    }'