有人可以想到简化此功能的方法吗?我发现其中很多都是重复性的,但是很难思考使其变得更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
答案 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;
}'