如何简化一个重复的函数
How to simplify a repetitive function
有没有人能想到简化这个功能的方法?我发现其中的很多内容都是重复的,但很难想出一种方法使它更 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
简化重复函数的明显方法是使用循环:
def colorize(n):
for i in range(0,10):
if n in range(i*10, (i+1)*10):
return selection[-i+1]
return None
我确信有更好的方法来简化您的特定任务,但是当您看到这种重复代码时,您应该牢记循环是一种通用模式。
要在 0 到 10 的范围内得到 1,在 10 到 20 的范围内得到 2,您可以使用 Python 3 的底整数除法。
x = n // 10 + 1
然后您可以否定它并将其用于您的索引
def colorize(n):
if 0 <= n < 100:
return selection[-(n // 10 + 1)]
如果您不 return 函数 it returns None
中的任何内容,则您不必明确地 return it
试试这个:
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)]
当您有一堆重复的代码并且很难了解如何删除重复时,一个好技巧是一点一点地修改这些片段,使它们慢慢开始彼此相似。如果你做得对,你可以让它们完全匹配。
这可能看起来很啰嗦,但这项技术的好处在于它不需要任何大的洞察力飞跃。您可以通过小的增量更改实现目标,而不必盯着代码和 认真思考。
让我告诉你我的意思。
第 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 步: 如果您想更进一步,您可以尝试计算对应于 n
的 i
的值,而不是采用上面的猜测和检查方法。我会把它留给你(或其他答案)作为练习。这是一个很好的优化,但它与我刚刚在此处列出的重构类型不同。
有没有人能想到简化这个功能的方法?我发现其中的很多内容都是重复的,但很难想出一种方法使它更 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
简化重复函数的明显方法是使用循环:
def colorize(n):
for i in range(0,10):
if n in range(i*10, (i+1)*10):
return selection[-i+1]
return None
我确信有更好的方法来简化您的特定任务,但是当您看到这种重复代码时,您应该牢记循环是一种通用模式。
要在 0 到 10 的范围内得到 1,在 10 到 20 的范围内得到 2,您可以使用 Python 3 的底整数除法。
x = n // 10 + 1
然后您可以否定它并将其用于您的索引
def colorize(n):
if 0 <= n < 100:
return selection[-(n // 10 + 1)]
如果您不 return 函数 it returns None
中的任何内容,则您不必明确地 return it
试试这个:
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)]
当您有一堆重复的代码并且很难了解如何删除重复时,一个好技巧是一点一点地修改这些片段,使它们慢慢开始彼此相似。如果你做得对,你可以让它们完全匹配。
这可能看起来很啰嗦,但这项技术的好处在于它不需要任何大的洞察力飞跃。您可以通过小的增量更改实现目标,而不必盯着代码和 认真思考。
让我告诉你我的意思。
第 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 步: 如果您想更进一步,您可以尝试计算对应于 n
的 i
的值,而不是采用上面的猜测和检查方法。我会把它留给你(或其他答案)作为练习。这是一个很好的优化,但它与我刚刚在此处列出的重构类型不同。