簡體   English   中英

重復使用 elif 語句的替代方法

[英]Alternatives of repeatedly using elif statements

我試圖根據他們在 python 上得到的結果返回“學生”的成績。 我使用了一堆 elif 語句,但我覺得這不是有效的。 我想知道是否還有其他方法可以將其呈現為? 可能更小。 我嘗試使用 for 循環和字典,但我沒有得到它,也許是因為我不太了解字典,loll

def grade_select(grade):
    if grade <  40: return "D-"
    elif grade <= 40 and grade < 45: return "D"
    elif grade <= 45 and grade < 50: return "D+"
    elif grade <= 50 and grade < 55: return "C-"
    elif grade <= 55 and grade < 60: return "C"
    elif grade <= 60 and grade < 65: return "C+"
    elif grade <= 65 and grade < 70: return "B-"
    elif grade <= 70 and grade < 75: return "B"
    elif grade <= 75 and grade < 80: return "B+"
    elif grade <= 80 and grade < 85: return "A-"
    elif grade <= 85 and grade < 90: return "A" 
    elif grade >= 90: return "A+"

由於您在條件匹配時返回,因此您不需要使用elif just if

此外,前面的條件消除了檢查值是否為“介於”之間的需要。

def grade_select(grade):
    if grade < 40: return "D-"
    if grade < 45: return "D"
    if grade < 50: return "D+"
    if grade < 55: return "C-"
    if grade < 60: return "C"
    if grade < 65: return "C+"
    if grade < 70: return "B-"
    if grade < 75: return "B"
    if grade < 80: return "B+"
    if grade < 85: return "A-"
    if grade < 90: return "A" 
    return "A+"

另一種方法是聲明一個字典並計算等級適合的位置。

grades = { 40: "D-", 45: "D", 50: "D+", 55: "C-", 60: "C", 65: "C+", 70: "B-", 75: "B", 80: "B+", 85: "A-", 90: "A", 100: "A+" }

def grade_select(grade):
    grade = (grade // 5 * 5) + 5

    if grade < 40:
        grade = 40
    elif grade > 90:
        grade = 100

    return grades[grade]

您可以使用字典來存儲范圍,它是根據等級值:

def grade_select(grade):
    dct = {
        range(0, 40): "D-",
        range(40, 45): "D",
        range(45, 50): "D+",
        ...
        range(90, 100 + 1): "A+"
    }
    dct = {g: m for r, m in dct.items() for g in r}
    return dct[grade]

嗯,你的情況有點奇怪,因為

elif grade <= 40 and grade < 50

沒有意義(如果等級<= 40,那么等級<50當然)

但我認為你想寫這樣的東西:

if 40 <= grade < 50:
    pass

您可以使用上面的語法,它可以使它更好一點。 另外,您可以查看這篇文章

這是基於等級值計算索引的最快版本。 此方法僅適用於您的成績范圍均為五個寬的情況。

_lettergrades = ['D-', 'D', 'D+', 'C-', 'C', 'C+', 'B-', 'B', 'B+', 'A-', 'A', 'A+']

def grade_select(grade):  
    return _lettergrades[(max(min(grade, 90), 35) - 35) // 5]

如果您的范圍不是始終為五寬,您可以使用bisect.bisect_right來獲取字母等級的索引。 搜索使用二分法,這應該比線性搜索更快。 (列表_thresholds_lettergrades是全局的,以避免在每次調用grade_select()時重新創建它們。)

from bisect import bisect_right
    
_thresholds = [40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90]
_lettergrades = ['D-', 'D', 'D+', 'C-', 'C', 'C+', 'B-', 'B', 'B+', 'A-', 'A', 'A+']

def grade_select(grade):
    return _lettergrades[bisect_right(_thresholds, grade)]

注意:我懷疑這里的速度和清晰度一樣重要。 為了清楚起見,我最喜歡 Paulo Pereira 的回答

我想使用字典是最好的方法

def grade_select(grade):
    d = {
        'D-':range(0,40),
        'D':range(45,50),
        'D+':range(50,55),
        'C-':range(55,60) #, etc.
    }

    return [k for k,v in d.items() if grade in v]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM