python - 如何简化一个重复的函数

标签 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

最佳答案

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

这可能看起来很啰嗦,但这项技术的好处在于它不需要任何大的洞察力飞跃。您可以通过小的增量更改实现目标,而无需盯着代码和认真思考

让我告诉你我的意思。


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

关于python - 如何简化一个重复的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58126597/

相关文章:

python - Django-Haystack/Whoosh - 重建索引错误

python - 如何在创建 Django 模型时填充表格?

Javascript计算函数不计算

python - Keras:ValueError:检查输入时出错

python - CSS样式我的django表

c - 函数返回一个指针

c# - methods() 应该放在哪里?

javascript - If else 条件 Javascript

javascript - 使用 Javascript 计算圆的周长和面积 - 函数不起作用

java - 这段非常简单的代码有什么问题