当你遇到大量重复的代码,难以看清如何消除重复时,一个好的技巧是逐渐修改这些代码片段,使它们慢慢相似。如果你做得对,你可以让它们完全匹配。
这种技巧可能看起来很冗长,但好处是它不需要任何大的洞察力。你可以通过小而增量的变化来达成目标,而不必盯着你的代码并“认真思考”。
让我给你展示一下我的意思。
步骤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
步骤二:根据一些常见的值计算数字。我们想要提取一个新变量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
第三步:现在我们有了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
值,而不是采用上面的猜测和检查方法。我会把这留给您(或其他答案)作为练习。这是一个不错的优化,但它与我刚刚提出的重构类型不同。
if 0 <= n <= 100:
更加合适。 - Maratn
是100,那么将返回None
。 - Iain Shelvington