簡體   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