繁体   English   中英

如何简化重复的 function

[英]How to simplify a repetitive function

有没有人能想到的方法来简化这个 function? 我发现其中的大部分内容都是重复的,但很难想出一种让它更 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

要获得 0 到 10 范围内的 1 和 10 到 20 范围内的 2,您可以使用 Python 3 的地板 integer 除法。

x = n // 10 + 1

然后,您可以否定它并将其用于索引

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

如果你没有从 function 返回任何东西,它返回None ,你不必明确地返回它

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

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

让我告诉你我的意思。


第一步:把所有的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 ,使得每个案例都与 rest 完全一致。 如果我们将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

我们有 go。 所有重复的东西都消失了。


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

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

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

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

尝试这个:

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

你可以试试这样的

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM