当您有一堆重复的代码并且很难理解如何删除重复时,一个好的技巧是一点一点地修改这些片段,以便它们慢慢开始彼此相似。如果你做得对,你可以让它们完全匹配。
它可能看起来很冗长,但这项技术的好处是它不需要任何大的洞察力。您可以通过微小的增量更改实现目标,而无需盯着代码和认真思考。
让我告诉你我的意思。
第 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 的值,而不是采用上面的猜测和检查方法。我会把它作为练习留给你(或其他答案)。这是一个很好的优化,但它与我刚刚在这里提出的重构类型不同。